计算机视觉有许多子领域,而图像分割是其中重要的一个。通过对图像中的每个像素进行分类或对这些像素应用回归,可以生成对输入图像非常精确的解释。
这样的解释在医疗和生物成像或自动驾驶等高精度领域非常有用,这里仅举几个例子。
图像分割中的关键架构之一是 U-Net。在本文中,我们将了解 Ronneberger 等人在 2015 年提出的原始 U-Net 架构。我们将学习收缩路径、扩展路径以及跳跃连接——以及它们如何组合在一起形成 U 形。此外,我们还将讨论现代 U-Net 是如何使用各种卷积神经网络(ConvNet)骨干网络构建的。
因此,读完这篇介绍后,你将了解:
让我们开始吧!
图像分割概述
使用深度学习解决方案的经典计算机视觉方法侧重于分类。由 Krizhevsky 等人(2012 年)创建的 AlexNet 就是一个例子。它使用卷积层进行特征学习,之后附加一组密集连接的层,用于为输入图像分配类别。
这使模型能够区分猫和狗、马和牛或汽车和卡车,这里仅举几个例子。
但是,你还可以对图像做更多事情!例如,应该能够在其中检测到对象。如果你已经熟悉深度学习和计算机视觉,那么很可能你已经听说过像 YOLO 或 Transformer 这样的方法,它们会在图像中存在的对象周围绘制框。
然而,应该可以为你的图像添加更多精度。虽然经典的对象检测器会绘制边界框,但图像分割方法会在像素级别执行其工作。换句话说,会检查每个像素并为其分配一个类别。这允许你绘制非常清晰的框来分隔你的对象。
像素级分类
如果你之前构建过分类模型,你就知道 Softmax 用于在目标类别上生成伪概率分布。然后,你可以简单地取 Softmax 输出张量的最大参数,以找到样本所属的类别。这被称为分割掩码。
在图像分割网络的尾部,输出张量并不代表整幅图像,而是像素级别的输出。这意味着 Softmax 将在像素级别应用,并且你可以为每个像素取最大参数来找到它所属的类。
对于回归也是如此
如果我们简单地去掉 Softmax,并将输出通道数设置为 1(或者如果你有多个因变量回归变量,则设置为 >1),那么我们将为每个像素得到一个线性输出。这类似于你在构建回归模型时所做的,但现在是在像素级别上。通过使用 MAE 或 MSE 等损失函数,你现在也可以对回归进行图像分割。
这也意味着,通过简单地移除 Softmax 激活函数(或者如果 Softmax 实际上应用于损失函数中,则仅更改损失函数——这两种情况都是可能的),用于分类的图像分割预训练模型可以适应于回归场景。
回归图像分割的示例如下:
在本文的其余部分中,我们将了解 U-Net,这是一种用于图像分割的模型。它由 Ronneberger 等人在 2015 年发表的一篇关于生物医学科学中图像分割的论文中提出。在原始工作中,U-Net 用于分类。
U-Net:高级视角
下图表示 U-Net。由于该网络由形状像 U 的层组组成,因此其名称的来源也就不足为奇了。U 的左半部分和底部称为收缩路径,而右半部分称为扩展路径。在跳跃连接的帮助下,U-Net 联合起来对输入图像进行下采样,以了解其显著特征,并通过上采样重建输入(或派生产品,如分割掩码)。
现在,让我们来看一下各个组成部分,首先从收缩路径(contracting path)开始。
在Ronneberger等人(2015)关于U-Net的工作中,他们从一个常规的卷积神经网络(Convolutional Neural Network, ConvNet)入手。每个ConvNet就是他们所说的收缩网络(contracting network)。用更简单的术语来说,这意味着卷积层(以及可能的池化层)会缩小特征图(输出)的尺寸。
例如,如果常规ConvNet的输入是一个32x32x3的图像(实际上,这可以是一个CIFAR-10样本),那么一个带有常规步长(stride)和12个特征图的简单2x2卷积层将产生一个30x30x12的输出。通过将多个卷积层(以及可能的池化层)堆叠在一起,可以将原始输入缩小到例如10x10x64。
回想一下,这使得卷积神经网络能够学习从更详细的特征(在网络开始处)到更粗粒度的特征(在网络尾部)的特征层次结构。由于网络看起来有点像一个金字塔(越往下越窄),它在收缩,因此被称为收缩网络。
从收缩到上采样
在U-Net中,使用了收缩网络,但扩展了一个上采样网络以重建特定分辨率的输出。这个网络被称为扩展路径(expansive path)。
请注意,在U-Net的当代变体中,输出在宽度和高度维度上总是与输入大小相等(例如,32x32x3 → 32x32xC)。然而,在原始的U-Net中,情况并非如此!
跳过连接的必要性
现在,假设你有一个由收缩层和上采样层组成的工作堆栈,因此看起来非常像一个U-Net。是时候开始训练了,我们这样做时不使用预训练的权重,而是使用例如He初始化或Xavier初始化来初始化权重,这取决于我们使用的激活函数。
当对图像进行前向传递时,它们首先通过U-Net类模型的收缩部分。然后,从收缩的输入中,它们被再次上采样以找到例如一个掩码(mask)。当从收缩网络的末端(或概念上更概括地说是总结后的)输入进行上采样以找到看起来像原始图像的东西时,这真的很难——因为你在盲目地进行!在网络的那个点上,你完全没有关于原始输入看起来像什么的信息——除了总结。如果你想象它是在许多门之间做出选择,你实际上需要走过每一扇门,看看它是否是正确的门可以穿过,如果不是就返回并尝试另一扇。
因此,一点点引导向正确门的帮助会非常有用。在U-Net中,这是通过跳过连接(skip connections)实现的,它们将收缩网络中每个级别的输出传递到上采样网络中对应的级别。与当前的上采样状态一起,它被用来进一步上采样。通过结合关于输入图像的高级信息(这来自收缩网络的末端)和关于级别的高级信息,结果预计会更好。
事实证明,它不仅适用于生物医学分割问题!凭借数万次引用,Ronneberger等人(2015)的论文是深度学习图像分割领域的关键论文之一。U-Net是一种广泛使用的架构,并且至今仍是图像分割中最好的选择之一。
U-Net的各个组成部分
现在你已经了解了U-Net的高级架构,最好看一下它的各个组成部分。我们从收缩路径开始,然后是扩展路径和跳过连接。
收缩路径
收缩部分由多个卷积层模块组成,即所谓的卷积块。
卷积块的数量是可配置的,但在原论文中设定为五个。
需要注意的是,除最后一个卷积块外,每个卷积块的输出都会用作跳跃连接(skip connection),因此在五个卷积块的设置下,我们总共有四个跳跃连接。
收缩路径遵循卷积网络的典型架构。它由两个3x3卷积(无填充卷积)的重复应用组成,每个卷积后面都跟着一个修正线性单元(ReLU)和一个步幅为2的2x2最大池化操作以进行下采样。
Ronneberger等人(2015年)
U-Net收缩路径中的每个卷积块都由两个具有3x3核大小的卷积层组成。它们不进行填充。回顾一下,当使用步幅为1的3x3核时,图像的高度和宽度都会各自减少2个像素。这在展示收缩路径的图像中清晰可见。例如,输入图像在卷积块中被从572x572像素压缩到570x570像素,然后再压缩到568x568像素。
每个卷积层后面都跟着一个ReLU激活函数。
在每个卷积块之间,会执行一个最大池化操作。它使用2x2的池化大小和步幅为2来进行下采样。这意味着输入图像的宽度和高度都会被减半。为了补偿这一点,特征图的数量会加倍。由于开始时的特征图数量是64,因此在U型结构的底部,特征图数量会加倍五次,从而得到1024个特征图。
换句话说,相对而言,U-Net在学习高分辨率特征时学习的特征较少,而在学习低分辨率特征时学习的特征较多。这有助于在资源使用上实现更好的平衡。
通过收缩路径,输入图像被下采样,并学习到了大量特征。现在,这些特征可以用于上采样,既可以使用收缩路径的输出,也可以使用跳跃连接。接下来,让我们看看这是如何实现的。
扩展路径
既然我们已经了解了收缩路径,那么现在来看看扩展路径。扩展路径与收缩路径中的过程相似,但一切都是反向进行的。
扩展路径不是对输入图像进行下采样,而是进行上采样。因此,与收缩路径相比,扩展路径包含相同数量的块,但这些是上采样块。
这些上采样块的一般过程如下:
对于上采样,使用具有2x2核和步幅为2的上采样层。卷积层再次使用3x3核大小和步幅为1,后面跟着ReLU激活函数。
扩展路径中的每个步骤都包括对特征图进行上采样,然后进行一个2x2卷积(“上卷积”),将特征通道的数量减半,与收缩路径中相应裁剪的特征图进行拼接,以及两个3x3卷积,每个卷积后面都跟着一个ReLU。(……)在最后一层,使用1x1卷积将每个64分量特征向量映射到所需的类别数量。
Ronneberger等人(2015年)
这意味着最终你将得到一个上采样图像,其特征图数量与初始数量相同。根据你的问题——例如,具有两个可能类别的分类——现在使用1x1核卷积来减少特征图的数量。宽度和高度保持不变,但特征图然后减少到,比如说2个。
这之后当然可以跟着Softmax激活函数(作为单独的层,或者最好推到损失函数中)和分类交叉熵损失来训练你的图像分割模型。在希望使用U-Net进行回归的情况下,我们省略Softmax并让输出为线性,且(很可能)有1个输出特征图。在回归场景中,像MSE和MAE这样的损失函数是很好的起点。
跳跃连接
既然我们已经了解了收缩路径和扩展路径,那么现在是时候更详细地研究U-Nets的最后一个核心方面了。尽管在上一节中简要提及,但理解跳跃连接发生了什么很重要。
回顾收缩路径部分,跳跃连接是在每个层级生成的,除了最后一个。确实,在图中你可以看到跳跃连接从四个上层收缩层级中产生,而最后一个(作为U的底部)不生成跳跃连接。
这些跳跃连接随后在U形结构另一侧的扩展层中被重新使用。然而,请注意,在U-Net的原始设置中,跳跃连接的特征图宽度和高度与上采样输入的不相等(实际上更大)。换句话说,如果你直接构建U-Net,是不可能直接将它们拼接起来的。
在他们的研究中,Ronneberger等人(2015年)通过从跳跃连接中取中心裁剪——即裁剪到与上采样输入相同大小的图像——解决了这个问题。因此,例如,如果你的跳跃连接具有136x136像素的特征图,而上采样输入具有104x104像素的特征图,那么136x136像素的图像将通过从顶部、底部、左侧和右侧移除(136–104)/2个像素来中心裁剪到104x104像素。现在,两者可以拼接了。
U-Net从跳跃连接中大大受益,因为它们将关于“网络在收缩路径的特定层级看到了什么”的信息传递到扩展路径。回想一下门的场景:如果你有成千上万扇门要走,你可以盲目地走,但最终会走很多弯路——结果花费很长时间才能找到正确的方向。如果你有一些指引,你可能会在这里和那里犯一些判断错误,但你可以更快地找到正确的门。
一个实用的说明:现代U-Net中的不同主干网络
到目前为止,我们已经了解了Ronneberger等人在原始工作中是如何实现U-Net架构的。多年来,许多人在U-Net中使用了不同的设置,包括例如在ImageNet上进行预训练,然后针对其特定的图像分割任务进行微调。
这意味着今天,你可能会使用一个不再利用上述原始架构的U-Net——但它仍然是一个很好的起点,因为收缩路径、扩展路径和跳跃连接保持不变。
如今U-Net架构的常见主干网络是ResNet、ResNeXt、EfficientNet和DenseNet架构。通常,这些网络已经在ImageNet数据集上进行了预训练,因此已经学习了许多常见特征。通过使用这些以预训练权重初始化的主干U-Net,你可能会更快地在你的分割问题上达到收敛。
U-Net在现代机器学习中的应用
U-Net架构在机器学习中仍然非常重要,尤其是在图像处理和计算机视觉领域。它最初是为生物医学图像分割而设计的,但由于其在处理需要精确定位的任务方面的有效性,此后已被应用于各个领域,例如:
医学成像:
U-Net常用于医学图像分割,特别是用于肿瘤检测、器官分割和细胞跟踪等任务。其能够生成详细的逐像素分割,使其非常适合需要高精度的医学任务。
卫星图像分割:
U-Net用于分析卫星图像,用于土地覆盖分类、检测航空图像中的对象和监测环境变化等目的。
自动驾驶
在自动驾驶汽车的背景下,U-Net常用于道路分割、车道检测和障碍物识别。其捕捉精细细节的能力对于确保安全至关重要。
内容生成和修复:
U-Net也已被改编用于图像到图像的翻译任务,如图像超分辨率、图像去噪和图像修复。
3D图像处理:
已经开发了U-Net的变体来处理3D数据,这在体积医学成像和3D点云处理等领域非常重要。
通用分割:
由于其能够生成精确的输出掩码并处理大输入尺寸,U-Net仍然是通用分割任务的首选架构之一。
为什么U-Net仍然相关
总之,U-Net在机器学习中仍然非常重要,并且仍然是分割相关任务的强大选择。其适应性和经过验证的记录使其成为许多现代应用中常用的模型。