是否可以将可变大小的图像作为输入到卷积神经网络?


17

我们能否将尺寸可变的图像作为卷积神经网络的输入以进行目标检测?如果可能,我们该怎么做?


但是,如果我们尝试裁切图像,则会丢失图像的某些部分,如果尝试调整大小,则会丢失图像的清晰度。如果将图像清晰度作为主要考虑因素,这是否意味着使用固有的网络属性是最好的?

Answers:


9

有很多方法可以做到这一点。在StackOverflow,Quora和其他内容网站上的许多帖子中已经介绍了其中大多数内容。

总之,列出的大多数技术可以分为两类解决方案,即

  1. 转变
  2. 固有 网络属性

在转换中,可以查找诸如

  • 调整大小,这是上述所有技术中最简单的一种
  • 裁剪,可以作为滑动窗口或一次性裁剪进行,但会丢失信息

人们还可以研究具有固有属性的网络,以通过构建网络的层行为来不受输入大小的影响。例如,

  • 完全卷积网络(FCN),对输入大小完全没有限制,因为一旦描述了内核和步长大小,每一层的卷积就可以根据相应的输入生成适当的维数输出。

  • 空间金字塔池(SPP),FCN没有完全连接的密集层,因此与图像大小无关,但是说如果要使用密集层而不考虑输入变换,那么有一篇有趣的论文可以解释深度学习网络。

参考文献:

  1. https://www.quora.com/How-are-varially-shaped-and-sized-images-given-inputs-to-convoluted-neural-networks
  2. /ai/2008/how-can-neural-networks-deal-with-varying-input-sizes
  3. https://discuss.pytorch.org/t/how-to-create-convnet-for-variable-size-input-dimension-images/1906

PS我可能会因为一些技巧而错过。不声称这是详尽的清单。


1
从理论上讲这听起来不错,但在Tensorflow上不起作用。有人有任何实现吗?
侯赛因

1
@Hossein我在实际实现中也遇到了一些问题,但是我今天在Tensorflow Keras 2.x中使用了可变大小的CNN,但有一些限制。我在回答中就一些实际细节发布了该方法的概述。祝你好运!
J特拉纳

4

卷积层和池化层本身与输入维无关。但是,对于不同大小的图像,卷积层的输出将具有不同的空间大小,如果以后我们有一个完全连接的层(因为我们的完全连接的层需要固定大小的输入),这将引起问题。有几种解决方案:

1.全局池:避免在卷积层末端使用完全连接的层,而是使用池(例如全局平均池)来将要素图的形状从(N,H,W,C)减少(在全局池之前) )塑造(N,1,1,C)(在全局池之后),其中:

N =小批量样本的数量
H =特征图的空间高度
W = 特征图的空间宽度
C =特征图(​​通道)的数量

As可以看出,输出维数(N * C)现在独立于特征图的空间大小(H,W)。如果进行分类,则可以继续在顶部使用完全连接的层来获取类的登录信息。

2.可变大小的池:使用可变大小的池区域来针对不同的输入大小获得相同的要素图大小。

3.裁剪/调整大小/填充输入图像:您可以尝试重新缩放/裁剪/填充输入图像,使它们都具有相同的形状。


在迁移学习的上下文中,您可能希望使用与训练模型所使用的原始输入大小不同的输入。这里是一些这样做的选项:

4.创建新的完全连接层:您可以完全抛弃原始的完全连接层,并使用所需的维数初始化一个新的完全连接层,并从头开始进行训练。

5.将完全连接的层视为卷积:通常,在将特征图馈送到完全连接的层之前,我们将特征图从(N,H,W,C)重塑为(N,H * W * C)。但是,您也可以将完全连接的层视为具有(H,W)接收场的卷积。然后,您可以将其与特征映射卷积在一起,而不管其特征映射的大小如何(如果需要,请使用零填充)http://cs231n.github.io/transfer-learning/ ]。


1

我今天必须解决这个问题,所以我想分享一下我发现可行的内容。我发现网络上有很多“理论上可行的”答案和花絮,但实际却很少,“这是您具体实现的方式”。

为了使用Tensorflow Keras实施此操作,我必须执行以下操作。也许其他人可以发现其中一些可以修改,放松或删除。

  1. 设置网络的输入以允许使用“无”作为input_shape上的占位符尺寸的可变大小的输入。参见弗朗索瓦·乔列(Francois Chollet)的回答
  2. 仅在发生全局池化操作之前才使用卷积层(例如GlobalMaxPooling2D)。然后可以使用密集层等,因为现在大小已固定。
  3. 只能使用1的批次大小。这样可以避免在一个批次中处理混合尺寸。
  4. 编写一个小的自定义序列,该序列从输入列表中创建大小为1的批次。我这样做是为了避免在单个Numpy数组中处理不同的大小。
  5. 在自定义序列上使用Model.fit_generator进行训练和验证。(相对于Model.fit)
  6. 由于某些原因,即使使用上述序列,也会弹出Model.predict_generator。我不得不对单个输入使用Model.predict。

请注意,调用Model.predict确实抱怨性能-考虑到该解决方案的低效率,这不足为奇-但这确实有效!


-2

是的,只需选择一个适当的骨干网,该骨干网不依赖于输入图像的大小来获得某个精确值-大多数网络都满足此条件。


3
您没看错,但是您的答案不是很实用-扩展它来解释为什么大多数现代的CNN可以处理可变大小的图像吗?此外,这种可变性有什么限制(例如,不要尝试在同一小批量生产中混合使用不同尺寸的图像...)?来自老式MLP(输入长度​​是固定的)或老式CNN(AlexNet和VGG-1X)的大多数人,由于其讨厌的Flatten层次,根本不了解现代CNN原则上如何拍摄任何大小的图像。
DeltaIV
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.