我正在使用https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/3
以便从图像中提取特征向量。但是,对于在将图像传递通过模块之前如何对其进行预处理,我有些困惑。
基于相关的Github解释,据说应该执行以下操作:
image_path = "path/to/the/jpg/image"
image_string = tf.read_file(image_path)
image = tf.image.decode_jpeg(image_string, channels=3)
image = tf.image.convert_image_dtype(image, tf.float32)
# All other transformations (during training), in my case:
image = tf.random_crop(image, [224, 224, 3])
image = tf.image.random_flip_left_right(image)
# During testing:
image = tf.image.resize_image_with_crop_or_pad(image, 224, 224)
但是,使用上述转换,我得到的结果表明可能有问题。此外,Resnet paper表示应通过以下方式对图像进行预处理:
从图像或其图像中随机采样224×224作物 水平翻转,减去每个像素的平均值...
我不太明白这是什么意思。有人可以指出我正确的方向吗?
期待您的回答!
答案 0 :(得分:1)
TensorFlow Hub上的图像模块都希望像素值在[0,1]范围内,就像您在上面的代码段中所看到的那样。这样可以轻松安全地在模块之间进行切换。
在模块内部,将输入值缩放到训练网络的范围。模块https://tfhub.dev/google/imagenet/resnet_v2_50/feature_vector/3是从TF-Slim检查点发布的(请参阅文档),该模块使用了与He&al不同的另一种规范输入的约定。 -但是这一切都得到了照顾。
揭开He&al。中语言的神秘面纱:它是指在他们研究的数据集的所有像素上聚合的均值R,G和B值,这是一种古老的观念,即将输入标准化为零均值有助于神经网络更好地训练。但是,以后有关图像分类的论文不再将这种注意力集中在特定于数据集的预处理上。
答案 1 :(得分:0)
您提到的Resnet论文的引用基于Alexnet paper的以下解释:
ImageNet由可变分辨率的图像组成,而我们的系统需要恒定的输入维数。因此,我们将图像下采样到256×256的固定分辨率。给定一个矩形图像,我们首先对图像进行缩放,以使较短的一侧的长度为256,然后从生成的图像中裁剪出中心256×256色块。除了从每个像素中减去训练集上的平均活动量之外,我们没有以其他任何方式对图像进行预处理。
因此,在Resnet论文中,类似的过程包括对图像(或其水平翻转版本)的224x224像素部分进行采样,以确保为网络提供恒定大小的图像,然后通过减去均值来将其居中。