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

94

我正在尝试训练一个分类图像的模型。问题在于,这些图像的大小不同。我应该如何格式化我的图像或模型架构?


2
请展示一下你已经尝试过的内容以及似乎无法正常工作的部分。 - Keith John Hutchison
16
于是 Inception v4 的代码就这样消失了。我不同意那个简单粗暴的评论。更多的输入信息将会更好,比如我们正在谈论什么样的网络,但是这些负评并不合理。那确实是一个真正的问题。 - sunside
4
ImageNet是如何格式化其图像数据以便训练使用的? - mskw
2个回答

156
您没有说明所涉及的架构是什么。由于您说您想要对图像进行分类,我假设它是一个部分卷积、部分全连接的网络,如AlexNet、GoogLeNet等。一般来说,您的问题的答案取决于您所使用的网络类型。
例如,如果您的网络仅包含卷积单元 - 也就是说,不包含全连接层 - 它可以对输入图像的大小具有不变性。这样的网络可以处理输入图像并返回另一张图像(“全程卷积”);当然,您必须确保输出与您期望的匹配,因为您必须以某种方式确定损失。
但是,如果您使用的是全连接单元,则会遇到麻烦:在这里,您的网络必须使用固定数量的学习权重,因此不同的输入将需要不同数量的权重 - 这是不可能的。
如果这是您的问题,以下是一些解决方法:
  • 不用担心压缩图像。网络可能会学习理解内容,而大小和视角对于内容来说意义不大。
  • 将图像居中裁剪到特定大小。如果您担心丢失数据,请进行多次裁剪并使用这些增强输入数据的图像,以便原始图像将被分成正确大小的N个不同的图像。
  • 用纯色填充图像,使其成为正方形,然后调整大小。
  • 进行上述操作的组合。

填充选项可能会向网络的预测引入额外的错误源,因为网络可能(即:很可能)会偏向包含这样的填充边框的图像。 如果您需要一些想法,请查看TensorFlow文档中的Images部分,其中有一些像resize_image_with_crop_or_pad这样的代码片段可以减轻工作负担。

关于不关心压缩的问题,这里是著名的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)

他们完全知道这一点,但仍然这样做。
根据您的需求和要求,实际上有一篇论文在这里,名为“深度卷积网络中的空间金字塔池化用于视觉识别”,通过非常特殊的方式处理任意大小的输入。请注意,保留HTML标签。

12
如果你在处理目标检测和实例分割时,这个主题似乎就更加复杂了,因为锚框大小也是超参数,如果你的数据集中图像大小差异很大,就需要进行调整。 - CMCDragonkai
1
另一个普遍的观察是,批次不一定要具有相同的维度;第一批可以处理4:3图像,第二批可以处理16:9等,只要密集层得到处理即可。 - sunside
有人使用ROI池化层(https://deepsense.ai/region-of-interest-pooling-explained/)训练分类模型吗? - Jonny Vu
1
@Tobitor,始终让网络的输入尽可能接近实际(测试或推理时间)数据。如果你的所有图像的宽度远大于高度,你也应该模仿这种情况来设计你的网络处理图像。话虽如此,如果你无法预测你的“使用”数据会是什么样子,你在训练期间就必须做出一些妥协。在这种情况下,将图像从1000x200调整到256x256通常是可以的(想象一下以60度角查看那个牌照-现在大致上是正方形的) 。 - sunside
2
@Tobitor 其实图片的尺寸没有具体的规定,只是如果在推断过程中无法确定实际图像大小的话,正方形可能是最好的选择。:) 关于尺寸,越小越好,但图像需要足够大以便捕捉所需的最细节部分 - 一般来说,请记住,如果您作为人类专家都无法确定图像中的内容,网络也会无法确定。 - sunside
显示剩余5条评论

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

你能详细解释一下"空间金字塔池化"相对于常规池化有何不同吗? - Matthieu
请阅读https://blog.acolyer.org/2017/03/21/convolution-neural-nets-part-2/中有关深度卷积神经网络视觉识别中的空间金字塔池化的内容。@Matthieu - Asif Mohammed

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接