模型权重是从 caffe 移植过来的,所以是BGR 格式。
Caffe 使用 BGR 颜色通道方案来读取图像文件。这是由于 imread 的底层 OpenCV 实现。RGB 的假设是一个常见的错误。
您可以在 VGG 网站上找到原始的 caffe 模型权重文件。这个链接也可以在 Keras 文档中找到。
我认为第二个范围是最接近的。训练期间没有缩放,但作者减去了 ILSVRC2014 训练集的平均值。如原始 VGG 论文第 2.1 节所述:
我们所做的唯一预处理是从每个像素中减去在训练集上计算的平均 RGB 值。
这句话实际上是做什么imagenet_utils.preprocess_input(mode='caffe')
的。
- 从 RGB 转换为 BGR:因为
keras.preprocessing.image.load_img()
以 RGB 格式加载图像,所以 VGG16(以及从 caffe 移植的所有模型)都需要这种转换。
- 减去平均 BGR 值:
(103.939, 116.779, 123.68)
从图像数组中减去。
预处理器不用于vgg16.py
. 它被导入到文件中,这样用户就可以通过调用来使用预处理函数keras.applications.vgg16.preprocess_input(rgb_img_array)
,而不用关心模型权重来自哪里。for 的参数preprocess_input()
始终是 RGB 格式的图像数组。如果模型是用 caffe 训练的,preprocess_input()
会将数组转换为 BGR 格式。
请注意,该函数preprocess_input()
不打算从imagenet_utils
模块调用。如果您使用的是 VGG16,调用keras.applications.vgg16.preprocess_input()
并且图像将被转换为适合 VGG16 训练的格式和范围。同样,如果您使用的是 Inception V3,调用keras.applications.inception_v3.preprocess_input()
并且图像将转换为 Inception V3 训练的范围。