目标检测部署聊完了,这篇进入语义分割。语义分割的任务是给图像中每个像素分配一个类别标签——这个像素是地面、那个像素是墙壁、那个像素是人。机器人需要理解场景的几何结构,语义分割是最直接的感知手段。

语义分割和目标检测的区别:检测只给你框和类别,分割给你每个像素的类别。分割的信息更丰富,但任务也更难——不仅要识别"是什么",还要精确描绘"在哪里"。

从FCN到DeepLab,语义分割经历了多次重要演进。面试中语义分割的追问通常围绕:上采样方法、空洞卷积的作用、多尺度特征融合。把这些概念搞清楚,分割相关的模型都能看懂。

一、FCN:全卷积网络的开创

FCN(Fully Convolutional Network)是2015年的工作,第一次把CNN用于语义分割。核心思想很简单:把分类网络(VGG/ResNet)后面的全连接层换成卷积层,让网络能接受任意尺寸的输入,输出一个和输入尺寸对应的特征图。

但CNN的下采样(stride=2的卷积和池化)让特征图分辨率越来越小。最终的特征图可能只有输入的1/32。怎么恢复到原始尺寸?FCN用转置卷积(也叫反卷积)做上采样。

# FCN的核心结构
# Backbone: VGG16 (去掉全连接层)
# 在conv7后面加上1x1卷积(调整通道数到类别数)
# 然后用转置卷积上采样到原始尺寸
self.score_fr = nn.Conv2d(4096, num_classes, 1)
self.upsample = nn.ConvTranspose2d(num_classes, num_classes, 
                                    kernel_size=64, stride=32)

FCN还引入了跳跃连接(skip connection)——把浅层的高分辨率特征和深层的强语义特征融合。浅层特征有空间细节(边缘、纹理),深层特征有语义信息(是什么物体)。两者融合才能得到既准确又精细的分割结果。

FCN的局限:转置卷积的上采样效果不够好,输出有棋盘效应。没有显式地处理多尺度信息。精度在现在看不高,但开创了全卷积分割的先河。后续的分割模型(DeepLab、PSPNet、U-Net)本质上都是在FCN的基础上改进上采样和多尺度特征融合的策略。

FCN有三个变体:FCN-32s(直接32倍上采样)、FCN-16s(融合conv4的跳跃连接后16倍上采样)、FCN-8s(再融合conv3的跳跃连接后8倍上采样)。越浅的跳跃连接保留的空间细节越多,分割边界越精细。FCN-8s是效果最好的版本。

二、DeepLab系列

DeepLab是Google推出的语义分割系列,从v1到v4不断演进。

DeepLabv1:首次把空洞卷积(Atrous/Dilated Convolution)引入语义分割。空洞卷积在不增加参数、不降低分辨率的情况下扩大感受野。传统3x3卷积看3x3区域,dilation=2的3x3空洞卷积看5x5区域,dilation=3看7x7区域。

DeepLabv2:提出ASPP(Atrous Spatial Pyramid Pooling)——用多个不同dilation rate的空洞卷积并行处理,捕获多尺度信息。dilation rate分别取6、12、18、24,每个分支看不同大小的区域。

# ASPP模块
class ASPP(nn.Module):
    def __init__(self, in_ch, out_ch):
        super().__init__()
        # 1x1卷积
        self.conv1 = nn.Conv2d(in_ch, out_ch, 1)
        # 空洞卷积,不同dilation rate
        self.conv6 = nn.Conv2d(in_ch, out_ch, 3, padding=6, dilation=6)
        self.conv12 = nn.Conv2d(in_ch, out_ch, 3, padding=12, dilation=12)
        self.conv18 = nn.Conv2d(in_ch, out_ch, 3, padding=18, dilation=18)
        # 全局平均池化
        self.global_pool = nn.Sequential(
            nn.AdaptiveAvgPool2d(1),
            nn.Conv2d(in_ch, out_ch, 1)
        )

DeepLabv3+:目前使用最广泛的版本。Encoder-Decoder结构。Encoder用修改过的Xception或ResNet做backbone,加上ASPP模块提取多尺度语义特征。Decoder把编码器的低分辨率输出上采样,和浅层特征融合,恢复空间细节。

DeepLabv3+的一个关键设计:backbone的最后两个阶段用空洞卷积替代stride=2的下采样。这样特征图分辨率保持在输入的1/8(而不是1/32),分割精度大幅提升。代价是计算量增加了——特征图大了4倍。

三、其他重要分割模型

U-Net:对称的U形结构,encoder提取特征,decoder逐步恢复分辨率。每个decoder层都和对应的encoder层做skip connection(通道拼接)。U-Net最初用于医学图像分割,因为结构简洁效果好,被广泛应用到各种分割任务。在机器人领域也常用于可行驶区域检测等场景。

PSPNet:在backbone后面加一个金字塔池化模块——用不同大小的adaptive average pooling(1x1、2x2、3x3、6x6)捕获不同尺度的上下文信息,然后上采样拼接。让网络能理解全局场景结构。

SegFormer:用Transformer做backbone的分割模型。轻量级的MLP-Decoder做分割头。在ADE20K等数据集上精度超过CNN方法。但推理速度比DeepLab慢。

四、机器人场景的语义分割

语义分割在机器人里有很多应用场景:可行驶区域检测(哪些区域可以走)、障碍物分割(区分不同类型的障碍物)、室内场景理解(地面、墙壁、家具)。

机器人场景的特殊挑战:需要实时处理(帧率要求高)、需要处理鱼眼图像(畸变大)、边缘部署(算力有限)。实际项目中通常用DeepLabv3+搭配轻量backbone(MobileNet/EfficientNet-B0),或者直接用U-Net的轻量化变体。

部署方面,语义分割模型也可以用TensorRT加速。但分割模型的输出尺寸大(和输入一样大),后处理的内存带宽是瓶颈。用FP16推理、减少中间特征图的通道数,是常用的优化手段。

五、面试高频追问

Q:空洞卷积有什么问题? A:gridding effect(网格效应)。dilation rate大的时候,卷积核的元素之间间隔很大,中间的位置完全没有被采样到。这导致特征不连续,丢失了细粒度的信息。解决办法是用HDC(Hybrid Dilated Convolution)——多个空洞卷积层用不同的dilation rate,保证采样点不重叠。

Q:语义分割的评估指标有哪些? A:mIoU(mean Intersection over Union)是最常用的。对每个类别计算预测和GT的IoU,然后取平均。还有pixel accuracy(像素准确率,但类别不均衡时不可靠)、frequency weighted IoU。实际项目中mIoU是标准指标。

Q:分割标注成本太高怎么办? A:半监督学习——用少量标注数据+大量无标注数据训练。弱监督学习——用图像级标签(而不是像素级标注)训练。仿真数据——在仿真环境里自动生成带标注的分割数据。还有交互式标注工具(如SAM)来加速标注过程。

语义分割是机器人场景理解的核心技术。FCN的开创性设计、DeepLab系列的空洞卷积与ASPP、其他重要模型对比、机器人场景应用,这四个方面理解了,语义分割的知识框架就搭好了。掌握这些基础,后面的实例分割就更好理解了。下一篇我们聊实例分割Mask R-CNN。


语义分割是机器人场景理解的关键技术。FCN全卷积开创、DeepLab系列空洞卷积与ASPP、其他重要分割模型对比、机器人场景应用实践,这四个维度覆盖了语义分割的核心知识。

上一篇:第291篇 目标检测部署TensorRT 

下一篇聊实例分割Mask R-CNN。

如果这篇文章对你有帮助,欢迎点赞支持一下,你的鼓励是我持续更新的动力!

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐