关于语义分割的亿点思考

news/2024/7/7 19:02:07

前言 本文为大家重点剖析现有的语义分割框架,带领大家一步步探讨。

本文转载自CVHub

作者丨派派星

欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。

先来简单总结下传统图像分割。对于传统的图像分割算法,无论是阈值分割、区域分割、边缘分割或基于聚类的方法等,几乎都停留在纯手工设计的阶段,例如人为确定一个阈值或者定义一个滤波器模板。此类方法更加适应的场景偏颜色、纹理、形状或梯度等简单的底层特征提取。然而,当遇到光照变化、姿态变化或者背景变化等情况几乎无能为力,更遑论提取到更进一步的高级语义特征。此外,此类先验知识往往需要专家经验,完全不易于推而广之。因此,基于传统的图像分割算法目前较多的是作为预处理(简单去噪)或者后处理(比如条件随机场和分水岭算法平滑边界轮廓)的一种手段去使用,亦或者取其精华去其糟粕,将其核心思想凝练出来融于现代的神经网络架构。

随着 AlexNet 引爆深度学习热潮开始,以卷积神经网络为代表的新一代神经网络架构逐渐开始流行起来,几乎在每个深度学习子领域均遍地开花。特别地,自全卷机神经网络(Fully Convolutional Network, FCN)这个里程碑式的网络被提出后,基于深度学习的语义分割正式拉开帷幕。既然谈到 FCN 势必很多人会拿它跟 U-Net 作比较。其实这两个网络包括整体的结构设计和思路是大同小异的,只不过是一个应用在场景解析任务,另一个应用在医学图像分割任务;一个长跳跃连接采用相加的操作然后直接一步到位上采样到原始空间分辨率,另一个长跳跃连接方式是通过拼接操作后再用卷积进行更细致的特征融合,然后不断细化,使其整体结构更加对称。后续提出的多数语义分割方法大都是基于此架构从不同方向延伸发展而成的。

因此,要想捋清楚语义分割究竟何去何从,首先先从分析这个编解码架构出发无疑是更合适的。

编解码架构

早期的语义分割以追求性(涨)能(点)为主,整体核心思想均是考虑如何高效建模上下文信息而设计。下面我们将围绕编解码器展开详细的讨论。

编解码的思想早期是出自自编码器,这个结构是由 Hinton 提出并发表在 Nature 上,主要用于解决图像压缩和去噪任务,随后该思路被广泛应用到图像分割任务上。编解码架构(Encoder-Decoder Architecture)主要由编码器、长跳跃连接和解码器所组成。

编码器

首先,让我们来看下编码器。众所周知,编码器一般可视为整个网络的特征提取器(a.w.a Backbone),用于压缩原始图像并逐步地提取出富含高级语义信息的特征图。这个过程中最关键的因素便是上下文信息,它是提升语义分割性能最为重要的因素之一,而有效感受野则大致决定了网络能够利用到多少上下文信息。

对于大部分网络结构来说,通常都会在编码的过程中引入池化或步长卷积来逐步降低输入特征图的空间分辨率,一方面可以降低计算资源的消耗,另一方面也能够在一定程度扩大感受野。此外,除了卷积操作本身(参数共享)所具备的平移等变性 translation equivalence 外,引入池化操作还能够为网络带来一定的平移不变性 translation invariant,使网络对目标位置不那么敏感,间接地增强了网络对未知数据的推理能力,同时又通过共享卷积核来达到控制模型复杂度的目的。

理论上,通过堆叠足够深的卷积(池化)层,网络的感受野能够覆盖到输入图像的全局区域。然而,考虑到以下三点:

  1. 网络的实际感受野远小于其理论感受野,理论上呈高斯分布;

  2. 考虑到参数量激增和计算量消耗与性能之间的平衡;

  3. 频繁的下采样操作会导致小目标的细节信息丢失严重;

所以,单纯依赖堆叠一堆常规的卷积池化操作来实现覆盖原图的感受野其实是不太实际的。扯到这里,我想还有部分人没明白究竟上下文信息是个什么概念?考虑下面这张图片:

先看第一行第三列,这里模型将远处的一艘船的部分误判为车,这是因为它具有与汽车相似的外观,而模型由于缺乏有效的局部上下文信息容易导致分割失败。局部上下文信息是分割领域中不可或缺的一部分,常用于区分具备相似特征的不同对象。

再看下第二行第三列,此处目标是一栋美丽的大厦,可惜模型未能将其完整的表示出来,这是由于传统的卷积运算一次仅能处理一个局部领域,这大概率会导致大尺寸对象分割的不完整性。因此,为了解决这个问题,我们需要思考如何设计更大的感受野来获取充足的全局上下文信息

再来看下这张图片:

上图展示了多个结直肠息肉数据集统计后的目标尺寸分布,可以明显看出,不同的息肉目标之间是存在明显的尺度差异的,这种现象也普遍存在于许多语义分割任务中。因此,如何有效的提取多尺度上下文信息以适应不同尺寸、形状变化多样的目标也是一个亟需解决的问题。

以上多重因素均会在一定程度上制约模型的表示能力。因此,如上所述,早期的语义分割网络大都是围绕如何在保证效率的同时尽可能的捕获有效的上下文信息开展的,而主流的方法主要有两种:扩大感受野或引入注意力机制。

扩大感受野的方法主要有以下几种方式:

  • 使用大卷积核的 GCN 等方法;

  • 使用空洞卷积的 DeepLab 等方法;

  • 使用池化操作的 PSPNet 等方法;

现在,让我们再进一步思考,以上这些方法存在什么局限性?例如:

  • 使用不同大小的卷积核组合,一方面参数量过大容易导致多拟合,另一方面理论感受野远小于实际感受野;

  • 使用空洞卷积虽然可以保留完整的空间信息,然而会引入额外的计算量,容易引起局部领域的信息丢失,同时,当扩张率选取不恰当时还会造成网格(棋盘)效应;

  • 使用池化操作虽然简单高效,但容易因为降采样导致小尺寸目标丢失;

此外,感受野是否越大越好?实际上,感受野太小,不足以建模远距离依赖捕获大尺寸对象;感受野太大,则容易引入过多噪声和无效信息,这些最终都会影响到整体的分割性能。那么,设计合理的多尺度表征来获取丰富的等效感受野就显得尤为重要了。例如,DMNet 提出了动态多尺度的过滤器来自适应不同的目标尺寸。解决了尺度参数设计的问题,那么如何更高效的融合不同尺度的信息?CPFNet通过借鉴SK-Net的思想引入了尺度感知模块来自适应的融合来自不同尺度的特征。

另一方面,引入注意力机制的作用主要是获取足够的全局上下文信息以建立远距离依赖,主要方式有:

  • 结合通道和空间双注意力的 DANet 等;

  • 借鉴自注意力机制的 NonLocal 等;

同样地,对于基于注意力机制的分割方法来说,其优化点可以考虑从不同维度去考虑如何建模,例如基于区域信息建模的PSANet以及针对不同类别信息进行像素加权的OCRNet;另一方面可以考虑从效率方面去改进注意力机制本身带来的计算资源问题,例如采用十字交叉注意力进行等效替代的CCNet、引入非对称结构的ANN、亦或是从全局上下文建模角度所实际的简化版GCNet等等。

长跳跃连接

聊完编码器部分,再来分析下长跳跃连接。

既然谈到跳跃连接,想必大家第一时间想到的是 ResNet 中的残差连接 skip connection。与原始的(短)跳跃连接操作缓解梯度弥散的动机不同,考虑到语义分割任务本身是一种密集型分类预测任务,因此 U-Net 或 FCN 中所涉及到的长跳跃连接操作本质上是为了更好的弥补编码过程中下采样导致的信息损失问题,帮助网络在解码的过程中更好的恢复对物体细节的定位。

另一方面,通过引入长跳跃连接,可以实现不同层级特征之间的信息融合,从而提取到更具有判别力的特征。因此,早期的 RefineNet 便是结合这两点,通过建模多个层级特征之间的信息交互来弥补下采样操作所带来的信息损失。那么问题来了:

  1. 如何融合更多的特征?

众所周知,不同抽象层级的特征具有不同的独特语义表征。因此,融合不同层级之间的特征是一个自然而然的想法,例如,UNet++ 中便尝试结合长、短跳跃连接来实现尽可能丰富的信息共享。

  1. 如何融合更好的特征?

首先,考虑下医学图像分割任务。不同于自然图像,医学图像在成像过程中,受采集设备或光照等因素的影响,不可避免的会引入许多背景噪声。此时,如果我们单纯的采用长跳跃连接操作,势必会引入浅层特征中一些不纯净的噪声,从而影响解码器输出特征的质量。为了解决此问题,一方面可以从数据源本身出发,进行去噪处理,例如nnUnet中设计了许多有效的预处理操作,例如CLAHE、Gamma增强等来更好的处理图像。另一方面可以从模型角度考虑,例如Attention-UNet中引入门控注意力来强化前景区域抑制背景区域;又或者像MultiResUNet堆叠多个1×1卷积来进行特征"提纯"。

特征融合本质上是为了获得更具有判别力的特征表示。一般而言,浅层特征注重边缘、纹理等空间细节,但缺乏高级语义;而深层特征具备精确的高级语义信息,但缺乏空间细节信息。一种自然而然的想法便是融合两者。然而,由于特征结构以及特征内容本身的限制,不同层级之间的特征融合势必会存在语义鸿沟。为了解决此问题,ExFuse提出了许多方法使网络得以在浅层特征中引入更多的语义信息,在深层特征中嵌入更多的空间信息。

解码器

解码器的作用是将编码器所提取到的高级特征上采样至固定分辨率以实现端到端的训练从而完成像素级的密集预测分类。通常来说,解码器设计的核心是如何高效的将经过压缩的高级语义特征尽可能无损的还原。这个过程中会涉及两个操作:上采样和特征输出。

如上所述,由于编码器会涉及到多次下采样操作,不可避免的会导致图像精细特征的丢失。一种解决方法是“提前止损”,正如我们上面所介绍的DeepLab,采用空洞卷积可以在无需降采样的情况下拥有更大的感受野,但这仍然会引入许多问题。另一种方法便是“直面困难”,通常将一个特征图进行上采样有两种方式,即使用线性插值和反卷积。

线性插值算法是一种与数据无关的算法,它是根据设定好的公式近似模拟出未知点的信息,这必将制约模型的表达能力。而使用反卷积由于本身自带可学习参数,一般可获得更优的分割性能,但不可避免会引入过多的参数量和计算量。因此,一种参考的解决方案便如同 DUsampleing 中基于通道重排的思路所设计的新型上采样方式,可以同时结合两者的优势。

特征输出的作为为了让网络能进行端到端的训练以更新模型参数。通常来说,大多数网络只会输出最后一层特征图,但大家思考下这一定是最优解吗?众所周知,不同层级的特征所提取到的语义是不一样的,如果能够对中间层的特征进行监督学习,是否能取得比较好的效果?这个思想早期在 GoogLeNet 中有所体现,例如该论文中所提及到的辅助损失。后续一部分语义分割网络也应用了此思路,例如 PSPNet 和 DSN。DSN 中较早提出了深监督的思想,旨在为解码器中所有层级的输出特征均建立监督机制,一来可以有效的综合多个输出层的信息来学习更加鲁邦的特征;二来可以有效的缓解训练过程中梯度消失的现象,加速网络收敛。

谈完深监督的好处,那潜在的问题会出现在哪呢?这里给大家举几个栗子:

  1. 需要监督多少层特征?

  2. 需要监督哪些层特征?

  3. 如何分配合适的权重?

对于第1点,这其实并没有一个严格的定论,关键之处还是取决于训练数据本身的特性。对于第2和第3点,一个经验法则是越靠近输出层的特征理应是最重要的,因此越靠近输出层的中间特征理应分配更多的权重,这一点其实也有不少论文验证过了。

演进思路

经过早几年的发展,这种通过设计新的网络结构或者拼接模(积)块(木)的方式所带来的性能增益,其边际效应逐渐降低,紧接着伴随而来的便是大量同质化工作的涌现,以至于在某个时间节点会出现诸如“xxx还能不能走下去”的窘境。当然,以上现象不仅限于语义分割,对于大部分视觉任务来说亦如此。

尽管在中间这段短暂的时间也涌现一些有意思的工作,但最终都未能掀起大的波澜,好比下面这个段子:

  1. 手动设计网络结构 → NAS搜索;

  2. 固定感受野 → 引入动态加权实现感受野的自动调节;

  3. 效果提升不上去 → 换个思路做实时分割来对比结果;

  4. 强监督太热门 → 换成弱监督(GAN, 知识蒸馏, ...) + trick = 差不多的指标;

  5. DNN 太枯燥,融入点传统视觉的方法设计成端到端模式,如 EMANet 等;

  6. CNN 太单调,配合 GCN 搞点悬念,如 SAGNN 等;

  7. 嫌 2D 分割过于饱和,转 3D 点云分割, 如 2DPASS 等;

作者:湃森 链接:www.zhihu.com/question/39… 来源:知乎

当然,以上这些更多的是从一个点去旁敲侧击,这两年也有从图像分割这个任务本身去思考改良的,如 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 的基础组件供大家选择,毕竟任何事物的成长是由于某种因素的推动和影响,使其逐渐发展壮大,但这种发展是有限度的,当它发展到一定程度时,总有其它因素限制。

总的来说,找到一个合适的点去开展并不难,关键是要摆脱思维的禁锢,下面给大家举几个示例,更多的研究方向可参考前面"语义分割扩展"章节。

  1. 当感觉定量结果上已经难以再去提升时,可以尝试从定性角度出发,譬如从改善图像分割边缘这个点入手,虽然从数值指标上几乎不会有什么差距,但可视化结果展示出来的分割边界就是个极大的优势,不失为一个亮点去宣传。另一方面,也可以从不同角度找个侧重点去集中优化某一块,例如一直困扰目标检测中的小目标问题,语义分割同样也会有这种问题,特别是遥感语义分割这类的任务。

  2. 当感觉主流的数据集已经趋于饱和时,尝试转换个思路去突破,例如大家都做白天,你便可以做夜视场景;大家都做基于陆地的场景解析,你可以做基于水下的场景分割;大家都在做基于晴天的场景,你便可以尝试做风雷雨雪等极端场景下的分割等等;有条件的同学还可以尝试往多模态去靠,这也是一个不可逆转的发展趋势。

  3. 正所谓它山之石可以攻玉,平常一定要多阅读积累,广泛涉猎相关领域的知识,不求精通点到为止。下面以半监督学习为例,其核心问题在于如何有效利用无标注样本,作为有标签样本的补充,以提升模型性能。一种很容易想到的方法便是借助知识蒸馏的方法,首先基于另一半有标签的数据训练处一个模型;随后基于这个训练好的模型为剩余另一半没有带标签的数据提供标签,即伪标签;最后再用这些伪标签去训练模型。常规的做法是通过样本筛选只保留高置信度预测的结果,这种做法会存在几个:

  • 如何保证最终筛选出来的伪标签就是高质量的?

  • 如何保证被剔除掉的数据就是真正的无效?

如果我们将大量的无标签数据排除在训练过程外,便会导致模型训练不充分。此外,如果模型不能较好地预测某些困难类别,那么后面就更难为该类别的无标签像素分配准确的伪标签,从而无法获得提升,形成「马太效应」。因此,有效的解决了包括不可靠样本在内的全部无标签数据,理论上一定是可以提升算法精度的,这便是 U2P 所提倡的。此前如果你有涉猎到目标跟踪的算法,你会惊奇的发现这其实跟 ByteTrack (高、低阈值) 有着异曲同工之妙,有时候思想的火花一碰撞便能产生美妙的灵感。

欢迎关注公众号CV技术指南,专注于计算机视觉的技术总结、最新技术跟踪、经典论文解读、CV招聘信息。

【技术文档】《从零搭建pytorch模型教程》122页PDF下载

QQ交流群:444129970。群内有大佬负责解答大家的日常学习、科研、代码问题。

模型部署交流群:732145323。用于计算机视觉方面的模型部署、高性能计算、优化加速、技术学习等方面的交流。

其它文章

经典文章:Transformer是如何进军点云学习领域的?

CVPR 2023 Workshop | 首个大规模视频全景分割比赛

如何更好地应对下游小样本图像数据?

U-Net在2022年相关研究的论文推荐

用少于256KB内存实现边缘训练,开销不到PyTorch千分之一

PyTorch 2.0 重磅发布:一行代码提速 30%

Hinton 最新研究:神经网络的未来是前向-前向算法

聊聊计算机视觉入门

FRNet:上下文感知的特征强化模块

DAMO-YOLO | 超越所有YOLO,兼顾模型速度与精度

《医学图像分割》综述,详述六大类100多个算法

如何高效实现矩阵乘?万文长字带你从CUDA初学者的角度入门

近似乘法对卷积神经网络的影响

BT-Unet:医学图像分割的自监督学习框架

语义分割该如何走下去?

轻量级模型设计与部署总结

从CVPR22出发,聊聊CAM是如何激活我们文章的热度!

入门必读系列(十六)经典CNN设计演变的关键总结:从VGGNet到EfficientNet

入门必读系列(十五)神经网络不work的原因总结

入门必读系列(十四)CV论文常见英语单词总结

入门必读系列(十三)高效阅读论文的方法

入门必读系列(十二)池化各要点与各方法总结

TensorRT教程(三)TensorRT的安装教程

TensorRT教程(一)初次介绍TensorRT

TensorRT教程(二)TensorRT进阶介绍

计算机视觉中的高效阅读论文的方法总结

计算机视觉中的神经网络可视化工具与项目

计算机视觉中的transformer模型创新思路总结

计算机视觉中的传统特征提取方法总结

计算机视觉中的数据预处理与模型训练技巧总结

计算机视觉中的图像标注工具总结

计算机视觉中的数据增强方法总结

计算机视觉中的注意力机制技术总结

计算机视觉中的特征金字塔技术总结

计算机视觉中的池化技术总结

计算机视觉中的高效阅读论文的方法总结

计算机视觉中的论文创新的常见思路总结

神经网络中的归一化方法总结

神经网络的初始化方法总结


作者:CV技术指南
链接:https://juejin.cn/post/7198767799484579900
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

http://lihuaxi.xjx100.cn/news/863812.html

相关文章

卡通形象人物2 写代码-睡觉 丝滑如德芙

目录 本次实现效果 目录结构 index static/css/style.css static/js/script.js 结语: 前期回顾 【 css动画 】—— 把你喜欢css动画嵌入到浏览器中_0.活在风浪里的博客-CSDN博客常用酷炫动画999合集,代码直接复制可用,总用你想找的…

回顾 | 开学季(一)- 在 Windows / macOS 上配置你的开发环境

点击蓝字关注我们编辑:Alan Wang排版:Rani Sun微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术,将…

每日go语言面试题三

1.说一下go和其他语言的区别 我是最开始是学习c语言的,c语言是面向过程的一种语言,一般用于写底层,性能高,贴合硬件,之后学习很长时间的java,java语言是面向对象语言,简单易入手,当然…

爬虫Python入门好学吗?学什么?

爬虫Python入门好学吗?学爬虫需要具备一定的基础,有编程基础学Python爬虫更容易学。但要多看多练,有自己的逻辑想法。用Python达到自己的学习目的才算有价值。如果是入门学习了解,开始学习不难,但深入学习有难度&#…

【VictoriaMetrics】VictoriaMetrics启停脚本

先看结果,启动VictoriaMetrics UI界面可访问

Mysql数据库09——分组聚合函数

类似pandas里面的groupby函数,SQL里面的GROUP BY子句也是可以达到分组聚合的效果。 常用的聚合函数有COUNT(),SUM(),AVG(),MAX(),MIN(),其用法看名字都看的出来,下面一一介绍 聚合函数 COUNT()计数 统计student表中计科系学生的人数。 SE…

分享112个JS菜单导航,总有一款适合您

分享112个JS菜单导航,总有一款适合您 112个JS菜单导航下载链接:https://pan.baidu.com/s/1Dm73d2snbu15hZErJjTXxg?pwdfz1c 提取码:fz1c Python采集代码下载链接:https://wwgn.lanzoul.com/iKGwb0kye3wj base_url "h…

Hive 连接及使用

1. 连接 有三种方式连接 hive: cli:直接输入 bin/hive 就可以进入 clihiveserver2、beelinewebui 1.1 hiveserver2/beeline 1、开启 hiveserver2 服务 // 前台运行,当 beeline 输入命令时,服务端会返回 OK [roothadoop1 bin]…