2

在阅读VGG 模型的 Tensorflow 实现时,我注意到作者对输入的 RGB 图像执行了一些缩放操作,如下所示。我有两个问题:是什么VGG_MEAN 意思以及如何进行设置?其次,为什么我们需要减去这些平均值来得到bgr

VGG_MEAN = [103.939, 116.779, 123.68]

ef build(self, rgb):
    """
    load variable from npy to build the VGG
    :param rgb: rgb image [batch, height, width, 3] values scaled [0, 1]
    """

    start_time = time.time()
    print("build model started")
    rgb_scaled = rgb * 255.0

    # Convert RGB to BGR
    red, green, blue = tf.split(3, 3, rgb_scaled)
    assert red.get_shape().as_list()[1:] == [224, 224, 1]
    assert green.get_shape().as_list()[1:] == [224, 224, 1]
    assert blue.get_shape().as_list()[1:] == [224, 224, 1]
    bgr = tf.concat(3, [
        blue - VGG_MEAN[0],
        green - VGG_MEAN[1],
        red - VGG_MEAN[2],
    ])
    assert bgr.get_shape().as_list()[1:] == [224, 224, 3]
4

3 回答 3

2

首先:用于将 RGB 转换为 BGR 的 opencv 代码是:

from cv2 import cvtColor, COLOR_RGB2BGR
img = cvtColor(img, COLOR_RGB2BGR)

在您的代码中,执行此操作的代码是:

bgr = tf.concat(3, [
    blue - VGG_MEAN[0],
    green - VGG_MEAN[1],
    red - VGG_MEAN[2],
])

图像不是[Height x Width]矩阵,它们是[H x W x C]立方体,C颜色通道在哪里。在 RGB 到 BGR 中,您正在交换第一个和第三个通道。

第二:你不减去平均值来获得 BGR,你这样做是为了将颜色通道值标准化为以平均值为中心——所以值将在 [-125, 130] 的范围内,而不是在范围内[0, 255]。

请参阅:从图像中减去平均值

我编写了一个 python 脚本来获取 BGR 通道对目录中所有图像的含义,这可能对您有用:https ://github.com/ebigelow/save-deep/blob/master/get_mean.py

于 2016-08-20T16:05:06.177 回答
0
  1. 平均值来自计算训练数据中每一层的平均值。
  2. rgb -> bgr 用于 opencv 问题。
于 2016-08-02T16:25:10.743 回答
0

该模型是从 Caffe 移植的,我相信它依赖于 OpenCV 功能并使用 BGR 通道的 OpenCV 约定。

于 2016-08-17T18:03:11.260 回答