推陈出新
上面笔者已经简单的为大家过一篇语义分割的简略发展史,下面将带大家追本溯源,一步一步的探讨出语义分割未来发展的诸多可能性。
先来简单总结下传统图像分割。对于传统的图像分割算法,无论是阈值分割、区域分割、边缘分割或基于聚类的方法,几乎都停留在纯手工设计的阶段,例如人为确定一个阈值或者定义一个滤波器模板。此类方法更加适应的场景偏颜色、纹理、形状或梯度等简单的底层特征提取。然而,当遇到光照变化、姿态变化或者背景变化等情况几乎无能为力,更遑论提取到更进一步的高级语义特征。此外,此类先验知识往往需要专家经验,完全不易于推而广之。因此,基于传统的图像分割算法目前较多的是作为预处理(简单去噪)或者后处理(比如条件随机场和分水岭算法平滑边界轮廓)的一种手段去使用,亦或者取其精华去其糟粕,将其核心思想凝练出来融于现代的神经网络架构。
随着 AlexNet 引爆深度学习热潮开始,以卷积神经网络为代表的新一代神经网络架构逐渐开始流行起来,几乎在每个深度学习子领域均遍地开花。特别地,自全卷机神经网络(Fully Convolutional Network, FCN)这个里程碑式的网络被提出后,基于深度学习的语义分割正式拉开帷幕。既然谈到 FCN 势必很多人会拿它跟 U-Net 作比较。其实这两个网络包括整体的结构设计和思路是大同小异的,只不过是一个应用在场景解析任务,另一个应用在医学图像分割任务;一个长跳跃连接采用相加的操作然后直接一步到位上采样到原始空间分辨率,另一个长跳跃连接方式是通过拼接操作后再用卷积进行更细致的特征融合,然后不断细化,使其整体结构更加对称。后续提出的多数语义分割方法大都是基于此架构从不同方向延伸发展而成的。
因此,要想捋清楚语义分割究竟何去何从,从分析这个编解码架构的角度出发无疑是较合适的。
性能
早期的语义分割以追求性(涨)能(点)为主,整体核心思想均是考虑如何高效建模上下文信息而设计。下面我们将围绕编解码器展开详细的讨论。
编解码的思想早期是出自自编码器,这个结构是由 Hinton 提出并发表在 Nature 上,主要用于解决图像压缩和去噪任务,随后该思路被广泛应用到图像分割任务上。编解码架构(Encoder-Decoder Architecture)主要由编码器、长跳跃连接和解码器所组成。
编码器
首先,让我们来看下编码器。众所周知,编码器一般可视为整个网络的特征提取器(a.w.a Backbone),用于压缩原始图像并逐步地提取出富含高级语义信息的特征图。这个过程中最关键的因素便是上下文信息,它是提升语义分割性能最为重要的因素之一,而有效感受野则大致决定了网络能够利用到多少上下文信息。
对于大部分网络结构来说,通常都会在编码的过程中引入池化或步长卷积来逐步降低输入特征图的空间分辨率,一方面可以降低计算资源的消耗,另一方面也能够在一定程度扩大感受野。此外,除了卷积操作本身(参数共享)所具备的平移等变性 translation equivalence 外,引入池化操作还能够为网络带来一定的平移不变性 translation invariant,使网络对目标位置不那么敏感,间接地增强了网络对未知数据的推理能力,同时又通过共享卷积核来达到控制模型复杂度的目的。
理论上,通过堆叠足够深的卷积(池化)层,网络的感受野能够覆盖到输入图像的全局区域。然而,考虑到以下三点:
- 网络的实际感受野远小于其理论感受野,理论上呈高斯分布;
- 考虑到参数量激增和计算量消耗与性能之间的平衡;
- 频繁的下采样操作会导致小目标的细节信息丢失严重;
所以,单纯依赖堆叠一堆常规的卷积池化操作来实现覆盖原图的感受野其实是不太实际的。扯到这里,我想还有部分人没明白究竟上下文信息是个什么概念?考虑下面这张图片:
先看第一行第三列,这里模型将远处的一艘船的部分误判为车,这是因为它具有与汽车相似的外观,而模型由于缺乏有效的局部上下文信息容易导致分割失败。局部上下文信息是分割领域中不可或缺的一部分,常用于区分具备相似特征的不同对象。
再看下第二行第三列,此处目标是一栋美丽的大厦,可惜模型未能将其完整的表示出来,这是由于传统的卷积运算一次仅能处理一个局部领域,这大概率会导致大尺寸对象分割的不完整性。因此,为了解决这个问题,我们需要思考如何设计更大的感受野来获取充足的全局上下文信息
再来看下这张图片:
Figure from PraNet
上图展示了多个结直肠息肉数据集统计后的目标尺寸分布,可以明显看出,不同的息肉目标之间是存在明显的尺度差异的,这种现象也普遍存在于许多语义分割任务中。因此,如何有效的提取多尺度特征以适应不同尺寸、形状变化多样的目标也是一个亟需解决的问题。
以上多重因素均会在一定程度上制约模型的表示能力。因此,如上所述,早期的语义分割网络大都是围绕如何在保证效率的同时尽可能的捕获有效的上下文信息开展的,而主流的方法主要有两种:扩大感受野或引入注意力机制。
扩大感受野的方法主要有以下几种方式:
- 使用大卷积核的 GCN 等方法;
- 使用空洞卷积的 DeepLab 等方法;
- 使用池化操作的 PSPNet 等方法;
现在,让我们再进一步思考,以上这些方法存在什么局限性?例如:
- 使用不同大小的卷积核组合,一方面参数量过大容易导致多拟合,另一方面理论感受野远小于实际感受野;
- 使用空洞卷积虽然可以保留完整的空间信息,然而会引入额外的计算量,容易引起局部领域的信息丢失,同时,当扩张率选取不恰当时还会造成网格(棋盘)效应;
- 使用池化操作虽然简单高效,但容易因为降采样导致小尺寸目标丢失;
此外,感受野是否越大越好?实际上,感受野太小,不足以建模远距离依赖捕获大尺寸对象;感受野太大,则容易引入过多噪声和无效信息,这些最终都会影响到整体的分割性能。那么,设计合理的多尺度表征来获取丰富的等效感受野就显得尤为重要了。例如,DMNet 提出了动态多尺度的过滤器来自适应不同的目标尺寸。解决了尺度参数设计的问题,那么如何更高效的融合不同尺度的信息?CPFNet通过借鉴SK-Net的思想引入了尺度感知模块来自适应的融合来自不同尺度的特征。
另一方面,引入注意力机制的作用主要是获取足够的全局上下文信息以建立远距离依赖,主要方式有:
- 结合通道和空间双注意力的 DANet 等;
- 借鉴自注意力机制的 NonLocal 等;
同样地,对于基于注意力机制的分割方法来说,其优化点可以考虑从不同维度去考虑如何建模,例如基于区域信息建模的PSANet以及针对不同类别信息进行像素加权的OCRNet;另一方面可以考虑从效率方面去改进注意力机制本身带来的计算资源问题,例如采用十字交叉注意力进行等效替代的CCNet、引入非对称结构的ANN、亦或是从全局上下文建模角度所实际的简化版GCNet等等。
长跳跃连接
聊完编码器部分,再来分析下长跳跃连接。
既然谈到跳跃连接,想必大家第一时间想到的是 ResNet 中的残差连接 skip connection。与原始的(短)跳跃连接操作缓解梯度弥散的动机不同,考虑到语义分割任务本身是一种密集型分类预测任务,因此 U-Net 或 FCN 中所涉及到的长跳跃连接操作本质上是为了更好的弥补编码过程中下采样导致的信息损失问题,帮助网络在解码的过程中更好的恢复对物体细节的定位。
另一方面,通过引入长跳跃连接,可以实现不同层级特征之间的信息融合,从而提取到更具有判别力的特征。因此,早期的 RefineNet 便是结合这两点,通过建模多个层级特征之间的信息交互来弥补下采样操作所带来的信息损失。那么问题来了:
1.如何融合更多的特征?
众所周知,不同抽象层级的特征具有不同的独特语义表征。因此,融合不同层级之间的特征是一个自然而然的想法,例如,UNet++ 中便尝试结合长、短跳跃连接来实现尽可能丰富的信息共享。
2.如何融合更好的特征?
首先,考虑下医学图像分割任务。不同于自然图像,医学图像在成像过程中,受采集设备或光照等因素的影响,不可避免的会引入许多背景噪声。此时,如果我们单纯的采用长跳跃连接操作,势必会引入浅层特征中一些不纯净的噪声,从而影响解码器输出特征的质量。为了解决此问题,一方面可以从数据源本身出发,进行去噪处理,例如nnUnet中设计了许多有效的预处理操作,例如CLAHE、Gamma增强等来更好的处理图像。另一方面可以从模型角度考虑,例如Attention-UNet中引入门控注意力来强化前景区域抑制背景区域;又或者像MultiResUNet堆叠多个1×1卷积来进行特征"提纯"。
特征融合本质上是为了获得更具有判别力的特征表示。一般而言,浅层特征注重边缘、纹理等空间细节,但缺乏高级语义;而深层特征具备精确的高级语义信息,但缺乏空间细节信息。一种自然而然的想法便是融合两者。然而,由于特征结构以及特征内容本身的限制,不同层级之间的特征融合势必会存在语义鸿沟。为了解决此问题,ExFuse提出了许多方法使网络得以在浅层特征中引入更多的语义信息,在深层特征中嵌入更多的空间信息。
解码器
解码器的作用是将编码器所提取到的高级特征上采样至固定分辨率以实现端到端的训练从而完成像素级的密集预测分类。通常来说,解码器设计的核心是如何高效的将经过压缩的高级语义特征尽可能无损的还原。这个过程中会涉及两个操作:上采样和特征输出。
如上所述,由于编码器会涉及到多次下采样操作,不可避免的会导致图像精细特征的丢失。一种解决方法是“提前止损”,正如我们上面所介绍的DeepLab,采用空洞卷积可以在无需降采样的情况下拥有更大的感受野,但这仍然会引入许多问题。另一种方法便是“直面困难”,通常将一个特征图进行上采样有两种方式,即使用线性插值和反卷积。
线性插值算法是一种与数据无关的算法,它是根据设定好的公式近似模拟出未知点的信息,这必将制约模型的表达能力。而使用反卷积由于本身自带可学习参数,一般可获得更优的分割性能,但不可避免会引入过多的参数量和计算量。因此,一种参考的解决方案便如同 DUsampleing 中基于通道重排的思路所设计的新型上采样方式,可以同时结合两者的优势。
特征输出的作为为了让网络能进行端到端的训练以更新模型参数。通常来说,大多数网络只会输出最后一层特征图,但大家思考下这一定是最优解吗?众所周知,不同层级的特征所提取到的语义是不一样的,如果能够对中间层的特征进行监督学习,是否能取得比较好的效果?这个思想早期在 GoogLeNet 中有所体现,例如该论文中所提及到的辅助损失。后续一部分语义分割网络也应用了此思路,例如 PSPNet 和 DSN。DSN 中较早提出了深监督的思想,旨在为解码器中所有层级的输出特征均建立监督机制,一来可以有效的综合多个输出层的信息来学习更加鲁邦的特征;二来可以有效的缓解训练过程中梯度消失的现象,加速网络收敛。
谈完深监督的好处,那潜在的问题会出现在哪呢?这里给大家举几个栗子:
- 需要监督多少层特征?
- 需要监督哪些层特征?
- 如何分配合适的权重?
对于第1点,这其实并没有一个严格的定论,关键之处还是取决于训练数据本身的特性。对于第2和第3点,一个经验法则是越靠近输出层的特征理应是最重要的,因此越靠近输出层的中间特征理应分配更多的权重,这一点其实也有不少论文验证过了。
演进思路
经过早几年的发展,这种通过设计新的网络结构或者拼接模(积)块(木)的方式所带来的性能增益,其边际效应逐渐降低,紧接着伴随而来的便是大量同质化工作的涌现,以至于在某个时间节点会出现诸如“xxx还能不能走下去”的窘境。当然,以上现象不仅限于语义分割,对于大部分视觉任务来说亦如此。
尽管在中间这段短暂的时间也涌现一些有意思的工作,但最终都未能掀起大的波澜,好比下面这个段子:
- 手动设计网络结构 → NAS搜索;
- 固定感受野 → 引入动态加权实现感受野的自动调节;
- 效果提升不上去 → 换个思路做实时分割来对比结果;
- 强监督太热门 → 换成弱监督(GAN, 知识蒸馏, ...) + trick = 差不多的指标;
- DNN 太枯燥,融入点传统视觉的方法设计成端到端模式;
- CNN 太单调,配合 GCN 搞点悬念;
- 嫌 2D 分割过于饱和,转 3D 点云分割;
当然,以上这些更多的是从一个点去旁敲侧击,这两年也有从图像分割这个任务本身去思考改良的,如 K-Net → MaskFormer → kMaX-DeepLab → Mask2Former → OneFormer → Mask DINO 这条线路,有种逐渐大一统的韵味,这也不失为一个有意思的研究方向,当然大部分小作坊伤不起。另外一个现象就是纯靠刷点真是很难再刷上去了,你看看各个榜单的斜率已经都快贴地了,一直到 ViT 出现才勉强的带火了一波,继而延续多了2年辉煌。可惜到后面大家又在 Transformer 身上看到了 CNN 当年的那种窘况,愣是成为了一个无情的堆积木玩具,以至于后期顶会上的论文只能又往各种 zero-shot | one-shot | few-shot | weak-shot | xxx-shot 又或者转移到各种 domain | multi-modal 去靠边,总之就是避开正面交锋,靠故事靠生动形象的图表实验去打动审稿人,但却极少有人结合实际的落地应用场景去解决问题,做到真正的产学研结合。不过既然都聊到 ViT 了,下面还是简单的跟大家介绍下这两年的 SOTA 之星。
随着 ViT 的诞生,吹响了 Transformer 席卷 CV 界的号角,一时间横扫计算机视觉各个子领域的 SOTA 之星,成为了夜空中最亮的仔,间接盘活了这盘棋。虽然 Transformer 同普通的卷积在数学概念上基本是等价的,整体的架构也都很类似,只不过在优化和实现细节上有所出入,但是整体而言还是有许多不同之处,主要体现在几个方面。
归纳偏置
对于 CNN 来说,由于有了归纳偏置,无需大量训练数据和精心设计的 trick 便能够取得不错的效果;反观 Transformer,尽管少了这层约束,但是却造就其无限潜力的可能,而且这种性能上的差异会伴随着数据和算力规模的提升被逐渐放大。
远距离依赖
众所周知,由于感受野有限无法捕获有效的长距离依赖,CNN 在高层视觉语义信息中相对缺乏特征的连贯性来关联实例,导致在大尺寸目标对象上的分割结果堪忧。尽管可以通过其他方式(见上)辅助,但效果铁定不如 Transformer 这种开场即全局来得更加直接。
空间分辨率
Transformer 的另一个特性便是能够自始至终保持输入和输出的空间分辨率不变,这对于语义分割这种非常注重空间细节信息的密集型预测分类任务来说是非常有用的,在一定程度上可以缓解 CNN 多次下采样所导致的小目标信息损失的问题。
不过,Transformer 对于底层特征的提取其实并不擅长,容易导致对小目标的错误预测,这也是后面为什么涌现出这么多 CNN + Transformer 的混合双打架构,当然还有其他的益处,例如降低计算量。其实,Transformer 发展到后期更多的是蜕变为一种类似于 CNN 的基础组件供大家选择,毕竟任何事物的成长是由于某种因素的推动和影响,使其逐渐发展壮大,但这种发展是有限度的,当它发展到一定程度时,总有其它因素限制。
总的来说,找到一个合适的点去开展并不难,关键是要摆脱思维的禁锢,下面给大家举几个示例,更多的研究方向可参考前面"语义分割扩展"章节。
- 当感觉定量结果上已经难以再去提升时,可以尝试从定性角度出发,譬如从改善图像分割边缘这个点入手,虽然从数值指标上几乎不会有什么差距,但可视化结果展示出来的分割边界就是个极大的优势,不失为一个亮点去宣传。
- 当感觉主流的数据集已经趋于饱和时,尝试转换个思路去突破,例如大家都做白天,你便可以做夜视场景;大家都做基于陆地的场景解析,你可以做基于水下的场景分割;大家都在做基于晴天的场景,你便可以尝试做风雷雨雪等极端场景下的分割等等;甚至自己还可以开辟一个新的方向出来开源新数据集。
- 正所谓它山之石可以攻玉,平常一定要多阅读积累,广泛涉猎相关领域的知识,不求精通点到为止。下面以半监督学习为例,其核心问题在于如何有效利用无标注样本,作为有标签样本的补充,以提升模型性能。一种很容易想到的方法便是借助知识蒸馏的方法,首先基于另一半有标签的数据训练处一个模型;随后基于这个训练好的模型为剩余另一半没有带标签的数据提供标签,即伪标签;最后再用这些伪标签去训练模型。常规的做法是通过样本筛选只保留高置信度预测的结果,这种做法会存在几个:
- 如何保证最终筛选出来的伪标签就是高质量的?
- 如何保证被剔除掉的数据就是真正的无效?
如果我们将大量的无标签数据排除在训练过程外,便会导致模型训练不充分。此外,如果模型不能较好地预测某些困难类别,那么后面就更难为该类别的无标签像素分配准确的伪标签,从而无法获得提升,形成「马太效应」。因此,有效的解决了包括不可靠样本在内的全部无标签数据,理论上一定是可以提升算法精度的,这便是 U2P 所提倡的。此前如果你有涉猎到目标跟踪的算法,你会惊奇的发现这其实跟 ByteTrack 有着异曲同工之妙,有时候思想的火花一碰撞便能产生美妙的灵感。