11

我正在尝试使用来自 keras 的预训练 VGG 16。但我真的不确定输入范围应该是多少。

快速回答,这些颜色顺序是什么?

  • RGB
  • BGR

和哪个范围?

  • 0 到 255?
  • 从大约 -125 到大约 +130 平衡?
  • 0比1?
  • -1比1?

我注意到定义模型的文件导入了一个输入预处理器:

from .imagenet_utils import preprocess_input

但是这个预处理器从不在文件的其余部分中使用。

另外,当我检查这个预处理器的代码时,它有两种模式:caffetf(tensorflow)。

每种模式的工作方式不同。

最后,我在互联网上找不到一致的文档。

那么,工作的最佳范围是多少?模型权重训练到什么范围?

4

1 回答 1

14

模型权重是从 caffe 移植过来的,所以是BGR 格式

Caffe 使用 BGR 颜色通道方案来读取图像文件。这是由于 imread 的底层 OpenCV 实现。RGB 的假设是一个常见的错误。

您可以在 VGG 网站上找到原始的 caffe 模型权重文件。这个链接也可以在 Keras 文档中找到。

我认为第二个范围是最接近的。训练期间没有缩放,但作者减去了 ILSVRC2014 训练集的平均值。如原始 VGG 论文第 2.1 节所述:

我们所做的唯一预处理是从每个像素中减去在训练集上计算的平均 RGB 值。

这句话实际上是做什么imagenet_utils.preprocess_input(mode='caffe')的。

  1. 从 RGB 转换为 BGR:因为keras.preprocessing.image.load_img()以 RGB 格式加载图像,所以 VGG16(以及从 caffe 移植的所有模型)都需要这种转换。
  2. 减去平均 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 训练的范围。

于 2017-10-07T18:53:57.537 回答