在进行图像分割时如何处理可变尺寸的图像?

人工智能 神经网络 卷积神经网络 数据集 图像分割 全卷积网络
2021-11-08 19:51:05

我面临着在分割任务中将不同尺寸的图像作为输入的问题。请注意,图像甚至没有相同的纵横比。

我在深度学习中普遍发现的一种常见方法是裁剪图像,正如这里也建议的那样但是,就我而言,我无法裁剪图像并保持其中心或类似的东西,因为在分割中,我希望输出与输入具有相同的尺寸。

本文建议,在分割任务中,可以将同一图像多次输入网络,但规模不同,然后聚合结果。如果我正确理解了这种方法,那么只有在所有输入图像具有相同的纵横比时它才会起作用。如果我错了,请纠正我。

另一种选择是将每个图像的大小调整为固定尺寸。我认为这也是这个问题的答案提出的。但是,没有指定调整图像大小的方式。

我考虑采用数据集中的最大宽度和高度,并将所有图像的大小调整为该固定大小,以避免信息丢失。但是,我相信我们的网络可能难以处理扭曲的图像,因为图像中的边缘可能不清晰。

  1. 在将图像输入网络之前调整图像大小的最佳方法可能是什么?

  2. 有没有其他我不知道的选项来解决具有不同尺寸图像的问题?

  3. 此外,考虑到计算复杂性以及网络可能的性能损失,您认为哪种方法最好?

如果我的问题的答案包括一些指向源的链接(如果有的话),我将不胜感激。

4个回答

您可能会遇到 2 个问题。

  1. 您的神经网络(在本例中为卷积神经网络)在物理上无法接受不同分辨率的图像。如果一个具有完全连接的层,这通常是这种情况,但是,如果网络是完全卷积的,那么它应该能够接受任何维度的图像。全卷积意味着它不包含全连接层,而仅包含卷积、最大池化和批量归一化层,所有这些都对图像的大小是不变的。

    正是在这篇开创性的论文Fully Convolutional Networks for Semantic Segmentation中提出了这种方法。请记住,他们的架构和训练方法现在可能已经过时了。类似的方法被广泛用于U-Net:用于生物医学图像分割的卷积网络,以及许多其他用于对象检测、姿态估计和分割的架构。

  2. 卷积神经网络不是尺度不变的。例如,如果在固定分辨率的图像上训练像素大小相同的猫,那么网络在更小或更大尺寸的猫的图像上都会失败。为了克服这个问题,我知道两种方法(文献中可能更多):

    1. 在全卷积网络中对不同大小的图像进行多尺度训练,以使模型对尺度变化更加鲁棒;

    2. 具有多尺度架构。

    一个起点是看这两篇著名的论文:Feature Pyramid Networks for Object DetectionHigh-Resolution Representations for Labeling Pixels and Regions

您还可以查看论文Spatial Pyramid Pooling in Deep Convolutional Networks for Visual Recognition (2015),其中提出了 SPP-net。SSP-net 基于“空间金字塔池”的使用,它消除了具有固定大小输入的要求。

在摘要中,作者写道

现有的深度卷积神经网络 (CNN) 需要固定大小(例如 224×224)的输入图像。此要求是“人为的”,可能会降低对任意大小/比例的图像或子图像的识别精度。在这项工作中,我们为网络配备了另一种池化策略“空间金字塔池化”,以消除上述要求。称为SPP-net的新网络结构可以生成固定长度的表示,而不管图像大小/比例如何。

金字塔池对对象变形也很稳健。凭借这些优势,SPP-net 通常应该改进所有基于 CNN 的图像分类方法。在 ImageNet 2012 数据集上,我们证明了 SPP-net 提高了各种 CNN 架构的准确性,尽管它们的设计不同。在 Pascal VOC 2007 和 Caltech101 数据集上,SPP-net 使用单一的全图像表示且无需微调实现了最先进的分类结果。SPP-net 的强大功能在目标检测中也很重要. 使用 SPP-net,我们只计算整个图像的特征图一次,然后将任意区域(子图像)中的特征池化以生成用于训练检测器的固定长度表示。这种方法避免了重复计算卷积特征。在处理测试图像时,我们的方法比 R-CNN 方法快 24-102 倍,同时在 Pascal VOC 2007 上获得更好或相当的准确度。在 ImageNet 大规模视觉识别挑战赛 (ILSVRC) 2014 中,我们的方法在对象中排名第二在所有 38 个团队中,检测和图像分类排名第三。这份手稿还介绍了为本次比赛所做的改进。

假设您有一个大型数据集,并且它是按像素标记的,解决该问题的一种巧妙方法是通过根据您想要的尺寸插入水平和垂直边距来预处理图像以具有相同的尺寸,至于标签您添加虚拟额外输出对于边距像素,因此在计算损失时,您可以掩盖边距。

尝试使用最近邻插值技术将图像大小调整为神经网络架构的输入尺寸(在标准 2D U-net 架构中将其固定为 128*128) 。这是因为如果您使用任何其他插值调整图像大小,可能会导致篡改地面实况标签。这在分割中尤其是一个问题。在分类方面你不会遇到这样的问题。

尝试以下操作:

import cv2 
resized_image = cv2.resize(original_image, (new_width, new_height), 
                           interpolation=cv2.INTER_NEAREST)