自定义 Caffe 数据集中的图像均值减法?

Image Mean Subtraction in Custom Caffe Dataset?

我目前正在创建图像数据集,以使用 Caffe 训练、验证和测试基本的自定义 ConvNet。

具体来说,我已经收集了 JPG 图像 (RGB),现在正在决定如何为我的网络预处理图像。我希望对图像应用基本标准化,例如将图像均值减去 'center' 图像。

ImageNet 教程 http://caffe.berkeleyvision.org/gathered/examples/imagenet.html 提到了这个操作,描述了如何通过将 LMDB 传递给 $CAFFE_HOME/build/tools 中的 compute_image_mean 可执行文件来为数据集生成均值 .binaryproto 文件.

我已经这样做了,现在有一个 .binaryproto 文件用于我的 LMDB 训练。据我了解,该文件本质上包含传递的 LMDB 中所有图像的平均像素值的表示。因此,我假设它正在存储某种形式的数组,其中包含三个通道的像素值。


问题:

如何使用此 .binaryproto 文件执行均值减法?

我应该为我的每个 LMDB(训练、验证、测试)创建单独的 .binaryproto 文件吗?或者我应该先创建一个包含数据集中所有图像的 LMDB,从中生成平均值,然后将减法应用于所有子集?

如有任何建议,我们将不胜感激。

您需要仅使用您的训练集获取 .binaryproto 文件,并在训练、验证和测试时使用它。

这是因为如果您对所有图像取均值,则在训练时会间接向网络提供有关验证图像和测试图像的性质的信息,这可能有助于它比其他情况下表现得更好。

您可能知道,您需要将其添加到 transform_paramprototxt 文件的数据层中。

layer {
    name: "data" #the name
    # other attributes
    transform_param {
        mean_file: "path/to/training/binaryproto"
    }
}

This question on stats.stackexchange.com also refers to the same query, which also links to this useful resource.