3

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 论文说图像应该通过以下方式进行预处理:

从图像或其水平翻转中随机采样 224×224 裁剪,减去每个像素的平均值......

我不太明白这是什么意思。有人可以指出我正确的方向吗?

期待您的解答!

4

2 回答 2

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 值,遵循将输入归一化为零均值有助于神经网络更好地训练的古老智慧。然而,后来关于图像分类的论文不再将这种程度的注意力集中在特定于数据集的预处理上。

于 2019-06-20T12:53:15.330 回答
1

您提到的 Resnet 论文的引用基于 Alexnet 论文的以下解释

ImageNet 由可变分辨率的图像组成,而我们的系统需要恒定的输入维度。因此,我们将图像下采样到 256×256 的固定分辨率。给定一个矩形图像,我们首先重新缩放图像,使短边的长度为 256,然后从生成的图像中裁剪出中心的 256×256 块。我们没有以任何其他方式预处理图像,除了从每个像素中减去训练集上的平均活动。

因此,在 Resnet 论文中,类似的过程包括获取图像(或其水平翻转版本)的 224x224 像素部分,以确保为网络提供恒定大小的图像,然后通过减去均值将其居中。

于 2019-06-20T13:01:33.080 回答