0

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

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] 

回答

0
  1. 平均值是从训练数据计算每一层的平均水平。
  2. rgb - > bgr是opencv的问题。
+0

嗨乔尼,对答复表示感谢。但原始文章中包含的原始代码不会导入opencv。 – user288609

0

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

0

第一关:你会使用到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]的范围。

参见:Subtract mean from image

我写了一个python脚本,以获得BGR通道是指在目录中的所有图像,这可能是对你有用:https://github.com/ebigelow/save-deep/blob/master/get_mean.py