为什么要通过减去数据集的图像均值来归一化图像,而不是深度学习中的当前图像均值?

机器算法验证 深度学习 图像处理
2022-02-12 13:16:05

如何标准化图像有一些变化,但大多数似乎使用这两种方法:

  1. 减去对所有图像计算的每个通道的平均值(例如 VGG_ILSVRC_16_layers
  2. 通过对所有图像计算的像素/通道进行减法(例如CNN_S,另见Caffe 的参考网络

在我看来,自然的方法是标准化每个图像。与夜间图像相比,在光天化日下拍摄的图像会导致更多的神经元被激发,虽然它可能会告诉我们我们通常关心边缘等更有趣特征的时间。

Pierre Sermanet在 3.3.3 中提到了基于每个图像的局部对比度归一化,但我在我见过的任何示例/教程中都没有遇到过这种情况。我还看到了一个有趣的Quora questionXiu-Shen Wei 的帖子,但他们似乎不支持上述两种方法。

我到底错过了什么?这是一个颜色归一化问题,还是有一篇论文真正解释了为什么这么多人使用这种方法?

4个回答

减去数据集均值用于“居中”数据。此外,如果要将每个特征值归一化为 z 分数,则理想情况下也希望除以该特征或像素的 sttdev。

我们做这两件事的原因是因为在训练我们的网络的过程中,我们将乘以(权重)并添加(偏置)这些初始输入,以产生激活,然后我们用梯度反向传播到训练模型。

我们希望在这个过程中每个特征都有一个相似的范围,这样我们的梯度就不会失控(并且我们只需要一个全局学习率乘数)。

您可以考虑的另一种方式是深度学习网络传统上共享许多参数 - 如果您没有以导致相似范围特征值的方式缩放您的输入(即:通过减去平均值在整个数据集上)共享不会很容易发生,因为图像的一部分重量w很大,而另一部分重量太小。

您会在一些 CNN 模型中看到使用了逐图像白化,这更符合您的想法。

在批量归一化之前,每个通道的平均减法用于将每个通道(R、G、B)的数据集中在零均值附近。这通常有助于网络更快地学习,因为梯度对每个通道的作用是一致的。我怀疑如果您使用批量归一化,则每个通道均值减法预处理步骤并不是真正必要的,因为无论如何您都在对每个小批量进行归一化。

每图像标准化很常见,甚至是目前 Tensorflow 中唯一的内置功能(主要是因为非常容易实现)。它用于您提到的确切原因(同一图像的白天与夜晚)。但是,如果您想象一个控制照明的更理想的场景,那么每个图像之间的相对差异在算法中将具有很大的价值,我们不希望通过每个图像归一化来消除它(并且希望在整个训练数据集的上下文中进行归一化)。

这个话题有两个方面:

  1. 归一化以使所有数据保持相同的比例->在对每个图像或整个图像数据集进行归一化时,结果将是相似的
  2. 保留相关信息 --> 这是在每个图像或每个集合的基础上进行归一化产生很大差异的地方

例如,如果你想学习一个 CNN 来识别夜景和白天场景,并在每张图像的基础上进行归一化,那么网络将严重失败,因为所有图像都将被平等地缩放。

每个图像归一化的另一个缺陷是您可能会人为地获取图像传感器散粒噪声(例如对于非常黑暗的场景),这会使 CNN 将此类噪声混淆为有用信息。

关于规范化的最后一点警告:如果操作不正确,可能会导致不可恢复的信息丢失,例如图像裁剪(生成低于图像数据类型有效范围的值)或饱和度(高于有效范围)。当使用 uint8 变量来表示图像时,这是一个典型的错误,由于标准化/预处理操作,值低于 0 或超过 255。一旦发生这种情况,图像信息就会丢失并且无法恢复,因此 CNN 将无法从这些图像像素中学习任何有用的信息。