【语义分割】综述——一文搞定语义分割

本文记录了博主阅读的关于语义分割(Semantic Segmentation)的综述类文章的笔记,更新于2019.02.19。

参考文献网址

  1. An overview of semantic image segmentation
  2. Qure.ai Blog: A 2017 Guide to Semantic Segmentation with Deep Learning —— 注: Qure.ai是一家用人工智能做医疗的公司,其中涉及到医疗领域的图像处理,这里给出主页网址博客网址。其中,主页上有该公司的发表物,博客网址中有该公司的大量博客。
  3. 《A Review on Deep Learning Techniques Applied to Semantic Segmentation》(博主的笔记可以看这里

An overview of semantic image segmentation.

这一部分记录了第一个参考文献(An overview of semantic image segmentation.)的阅读笔记。作者介绍了如何用卷积神经网络完成图像语义分割任务。图像分割是计算机视觉中的一项任务,其目的是对显示出来的图像依照不同目标存在的区域进行划分和标注。概括来讲,图像分割回答了如下问题:

“图像中有什么?他们(它们)在什么位置?”
“What’s in this image, and where in the image is it located?”

具体而言,语义图像分割就是将每个像素都标注上其对应的类别。由于所有的像素都要考虑到,因此语义图像分割任务也被视为是稠密预测(dense prediction)的一种。

在这里插入图片描述
上图是语义分割的实例。图片来源

需要注意的是,这里不会区分属于同一类别的不同个体,而仅关心该像素属于哪个类别。换句话说,如果输入图像中有两个属于同一类别的目标,分割图是没有办法区分这两个目标的。而还有另一类称为实例分割(isntance segmentation)的分割模型,这些模型是可以区分相同类别的不同目标的。

分割模型对于多种任务都非常有用,比如:

  • 自动驾驶汽车(Autonomous vehicles)
    为了使自动驾驶汽车能够适应现存道路,其需要具有对周围环境的感知能力。
    在这里插入图片描述
    上图是用于自动驾驶的实时道路场景分割。图片来源

  • 医疗图像诊断(Medical image diagnostics)
    可以通过机器辅助放射治疗师的分析,从而加速放射检查。
    在这里插入图片描述
    上图是一个胸腔x-射线片,包括分割出的心脏(hear,红色),肺(lungs,绿色)和锁骨(clavicles,蓝色)。图片来源

任务描述(Representing the task)

简而言之,我们的目标是给定一幅RGB彩色图像(高x宽x3)或一幅灰度图像(高x宽x1),输出一个分割图谱,其中包括每个像素的类别标注(高x宽x1)。具体如下图所示:

在这里插入图片描述
注意:为了视觉上清晰,上面的预测图是一个低分辨率的图。在实际应用中,分割标注的分辨率需要与原始图像的分辨率相同。

与标准分类值(standard categorical values)的做法相似,这里也是创建一个one-hot编码的目标类别标注——本质上即为每个类别创建一个输出通道。

在这里插入图片描述
如上图所示,预测的结果可以通过对每个像素在深度上求argmax的方式被整合到一张分割图中。进而,我们可以轻松地通过重叠的方式观察到每个目标。

在这里插入图片描述
当只有一层通道被重叠至原始图像时,我们称之为mask,即只指示某一特定类别所存在的区域。

构建一个结构(Constructin an architecture)

一个比较初级的方式构造神经网络模型就是单纯堆叠数个卷积层(利用相同的padding以保证维度不变)再输出一个最终的分割图。这种模型通过一系列特征映射的变换直接学习得到一个从输入图像到输出分割结果的映射。然而,整个网络都在全分辨率下计算所带来的计算量是非常巨大的。
在这里插入图片描述
图片来源

回顾在深卷积网络模型中,前面的层学习得到low-level概念,而后面的层则学到high-level(专门的)特征映射。为了保证表现,在加深网络的同时,通常需要增加特征图(通道数)的个数。

与图像分类单纯地需要目标类别不同,图像分割需要每个像素的位置信息,因此不能像分类任务中那样放心地使用pooling或大步长卷积来降低计算量,图像分割需要一个全分辨率的语义估计。

一种比较流行的图像分割模型是编码器-解码器结构。编码器部分通过下采样降低输入的空间分辨率,从而生成一个低分辨率的特征映射(计算高效且能够有效区分不同类别);解码器则对这些特征描述进行上采样,将其恢复成全分辨率的分割图。

在这里插入图片描述
图片来源

上采样方法

有几种不同的上采样方法。pooling可以通过整合一个局部区域的信息为一个值的方式进行下采样(如average or max pooling),unpooling则通过将一个值分布在更高的分辨率下实现上采样。

在这里插入图片描述
图片来源

目前最流行的方式是transpose convolution,因为其允许习得上采样。

在这里插入图片描述
图片来源

反卷积(transpose convolution)本质上与正向卷积的操作相反。后者求取每个滤波器覆盖位置上的值与对应滤波器权重的点积,而反卷积则是从低分辨率特征图中提取一个值,之后乘以每个权重,再映射到输出特征图的不同位置上。下图是一个简单的通过反卷积操作进行的1D上采样示例。图片来源

在这里插入图片描述
对于在输出特征图上会造成重叠的操作(比如下图所示的3x3的窗口,步长为2的操作),重叠部分的值会被单纯地求和。这种操作会导致输出中产生人为的棋盘现象,而这种现象是我们所不希望看到的。所以,建议保证滤波器的尺寸不会导致重叠。

在这里插入图片描述
图片来源

全卷积网络(Fully convolutional networks)

这个网络结构再下文中也有介绍,这里做一个补充。这个网络结构利用iamge classification networks(如AlexNet)作为编码器,利用反卷积层实现上采样恢复分辨率作为解码器,实现端到端训练的全卷积网络。

在这里插入图片描述
图片来源(下文也有这个图片)

下图是完整的网络结构,可以看出网络是基于像素级别的交叉熵损失训练的。

在这里插入图片描述
图片来源

然而,由于编码器模块产生的分辨率是原始输入的1/32,解码器模块必须非常努力去恢复原始分辨率。如下图所示。

在这里插入图片描述
在这里插入图片描述

引入skip connections

通过在早期的层上增加skip conncetions来实现缓慢(分步)上采样在对两个特征图求和的方式,上述问题得到了缓解。

在这里插入图片描述
图片来源

这些skip connections保留了一些必要的细节,从而使得分割的边界更准确。

在这里插入图片描述
随后,Ronneberger等人通过扩张解码器模块的容量的方式改进了上述的全卷积结构(fully convolutional architecture)。具体来讲,这种N-Net结构“consists of a contracting path to capture context and a symmetric expanding path that enables precise localization”。这种结构目前非常流行,已经被拓展至了多种分割问题上。(下文中也有介绍,图片来源

在这里插入图片描述
注意:The original architecture introduces a decrease in resolution due to the use of valid padding. However, some practitioners opt to use same padding where the padding values are obtained by image reflection at the border.

Whereas Long et al. (FCN paper) reported that data augmentation (“randomly mirroring and “jittering” the images by translating them up to 32 pixels”) did not result in a noticeable improvement in performance, Ronneberger et al. (U-Net paper) credit data augmentations (“random elastic deformations of the training samples”) as a key concept for learning. It appears as if the usefulness (and type) of data augmentation depends on the problem domain.

改进的U-Net变体

Drozdzal等人用残差模块替换了基础卷积模块用于堆叠。这种残差模块在模块内部含有skip conncetions,同时保留了与U-Net相同的在编码器与译码器对应特征图之间的skip connections。他们称这种方式能够使得网络更快收敛,也能够适用于更深的网络结构。

基于此,Jegou等人提出了使用dense blocks,也是遵从于U-Net结构,称dense blocks的属性使得它们能够更好地适应语义分割任务,因为其天然携带skip connections和多尺度监督。这些dense blocks之所以好用是因为它们携带了从前序层

### 关于语义分割的论文解读 #### 小样本语义分割的研究进展 近年来,小样本语义分割成为计算机视觉领域的一个重要研究方向。一篇发表于ICCV 2021的论文《Simpler is Better: Few-shot Semantic Segmentation with Classifier Weight Transformer》提出了通过分类器权重变换器(Classifier Weight Transformer, CWT)来解决小样本语义分割问题的方法[^1]。该方法的核心在于简化模型结构的同时提升性能,具体来说,它利用Transformer架构捕获支持集和支持图像之间的关系,从而实现更高效的特征映射。 #### 超高分辨率图像处理的技术挑战 对于超高分辨率图像的语义分割任务,传统的上采样和裁剪策略各有不足之处。例如,在下采样的过程中可能会丢失重要的细节信息;而在裁剪操作中,则可能限制模型获取全局上下文的能力[^2]。针对这些问题,一些新的技术方案被提出并应用于实际场景之中。比如MagNet(CVPR 2021) 和 FCtL(ICCV 2021),它们分别尝试改进网络设计以更好地适应大尺寸输入数据的需求。 #### 实现高效的小样本学习机制 为了进一步探讨如何构建更加鲁棒有效的少镜头学习框架,《Few-Shot Learning via Meta-Learning and Self-Supervision》一文中介绍了一种结合元学习(meta-learning)以及自监督(self-supervision) 的新思路。这种方法不仅提高了模型泛化能力而且减少了标注成本。虽然此篇未直接涉及语义分割应用案例,但它所提供的理论基础同样适用于此类复杂任务环境下的探索实践。 ```python import torch.nn as nn class SimpleSegmentationModel(nn.Module): def __init__(self, num_classes=21): super(SimpleSegmentationModel, self).__init__() self.conv1 = nn.Conv2d(3, 64, kernel_size=7, stride=2, padding=3,bias=False) def forward(self,x): out=self.conv1(x) return out ``` 上述代码展示了一个简单的卷积神经网络用于语义分割的基础模块定义过程。尽管这是一个非常基础的例子,但在深入理解现代先进算法之前掌握这些基本概念是非常必要的。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值