当图像大小不同时,如何格式化图像数据以进行训练/预测?

Posted

技术标签:

【中文标题】当图像大小不同时,如何格式化图像数据以进行训练/预测?【英文标题】:how to format the image data for training/prediction when images are different in size? 【发布时间】:2017-06-13 22:32:38 【问题描述】:

我正在尝试训练对图像进行分类的模型。 我的问题是,它们的尺寸不同。我应该如何格式化我的图像/或模型架构?

【问题讨论】:

请展示您迄今为止尝试过的内容以及似乎不适合您的内容。 然后是 Inception v4 的代码。我不同意这种现成的评论。多一点输入会很好——比如我们正在谈论什么样的网络——但反对票根本没有道理。这一个真正的问题。 问题是 ImageNet 如何格式化他们的图像数据以便对训练有用? 【参考方案1】:

你没有说你在谈论什么架构。既然你说你想对图像进行分类,我假设它是一个部分卷积、部分全连接的网络,如 AlexNet、GoogLeNet 等。一般来说,你的问题的答案取决于你正在使用的网络类型。

例如,如果您的网络仅包含卷积单元 - 也就是说,不包含全连接层 - 它可以不受输入图像大小的影响。这样的网络可以处理输入图像,然后返回另一个图像(“一直卷积”);您必须确保输出符合您的预期,因为您当然必须以某种方式确定损失。

但是,如果您使用的是全连接单元,那么您就有麻烦了:在这里,您的网络必须使用固定数量的学习权重,因此不同的输入将需要不同数量的权重 - 这是不可能的.

如果这是您的问题,您可以采取以下措施:

不要担心压缩图像。无论如何,网络可能会学会理解内容。规模和视角对内容有什么意义吗? 将图像居中裁剪为特定大小。如果您担心丢失数据,请进行多次裁剪并使用它们来扩充您的输入数据,以便将原始图像拆分为 N 大小正确的不同图像。 用纯色填充图像到正方形大小,然后调整大小。 结合使用。

填充选项可能会为网络的预测引入额外的错误源,因为网络可能(阅读:可能会)偏向包含此类填充边框的图像。 如果您需要一些想法,请查看 TensorFlow 文档的 Images 部分,其中有 resize_image_with_crop_or_pad 之类的内容可以帮助您完成更大的工作。

至于不关心挤压,here's 一段著名的 Inception 网络的预处理管道:

# This resizing operation may distort the images because the aspect
# ratio is not respected. We select a resize method in a round robin
# fashion based on the thread number.
# Note that ResizeMethod contains 4 enumerated resizing methods.

# We select only 1 case for fast_mode bilinear.
num_resize_cases = 1 if fast_mode else 4
distorted_image = apply_with_random_selector(
    distorted_image,
    lambda x, method: tf.image.resize_images(x, [height, width], method=method),
    num_cases=num_resize_cases)

他们完全意识到这一点并且无论如何都会这样做。

根据您想要或需要走多远,实际上有一篇名为 Spatial Pyramid Pooling in Deep Convolution Networks for Visual Recognition 的论文 here 通过处理任意大小的输入来处理它们很特别的方式。

【讨论】:

当您处理对象检测和实例分割时,这个主题似乎要复杂得多,因为如果您有一个图像大小差异很大的数据集,锚框大小也是超参数需要调整。 长宽比对于区分圆形和椭圆的网络起着非常重要的作用。 另一个普遍的观察是批次不一定必须具有相同的尺寸;第一批可以处理 4:3 的图像,第二批可以处理 16:9 等,只要注意密集层。 @Tobitor,始终使网络的输入尽可能接近实际(测试或推理时间)数据。如果您的所有图像都比高宽得多,您还应该对您的网络进行建模以像这样处理您的图像。也就是说,如果您无法说出您的“使用”数据会是什么样子,那么您必须在训练期间做出一些牺牲。在这种情况下,将图像的大小从 1000x200 调整为 256x256 通常是可以的(想象一下以 60 度角看那个车牌 - 现在它大致是方形的)。 @Tobitor 完全没有要求图像是正方形的,如果您在推理过程中不知道实际图像大小,这恰好是最不坏的权衡。 :^) 至于尺寸,越小越好,但图像需要足够大才能捕捉到所需的最精细细节——一般来说,请记住,如果您作为人类专家,可能无法确定图像中的内容图片,网络也不能。【参考方案2】:

尝试制作空间金字塔池化层。然后将其放在最后一个卷积层之后,以便 FC 层始终获得恒定维度向量作为输入。在训练期间,使用一个时期的特定图像大小训练来自整个数据集的图像。然后在下一个 epoch 中,切换到不同的图像大小并继续训练。

【讨论】:

您能否详细说明与常规池相比什么是“空间金字塔池”? 请阅读 blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2@Matthieu 中用于视觉识别的深度卷积网络中的空间金字塔池

以上是关于当图像大小不同时,如何格式化图像数据以进行训练/预测?的主要内容,如果未能解决你的问题,请参考以下文章

手把手写深度学习(13):如何利用官方预训练模型做微调/迁移学习?(以Resnet50提取图像特征为例)

如何训练 libsvm 格式的图像(像素)数据以用于 Java 识别

手把手写深度学习(14):如何利用官方预训练模型做微调/迁移学习?(以Resnet50提取图像特征为例)

具有更大输入图像尺寸的 Caffe 预训练模型

LIBSVM 如何准备带有图像的训练数据集以进行徽标检测?

4. 使用预训练的PyTorch网络进行图像分类