2、语义分割基础回顾:FCN、U-Net、DeepLab系列核心原理速通

好,咱们直接进入正题。语义分割,说白了就是给图像里的每个像素打标签。你想想看,一张图里有人、有车、有路,模型得告诉我哪个像素属于人,哪个属于车。这跟分类不一样——分类只告诉你图里有啥,分割得告诉你“在哪儿”。

我在车规芯片上部署分割网络时,最深的体会是:精度和速度永远在打架。但别急,咱们先把几个经典网络的核心捋清楚,后面再聊怎么在芯片上“调教”它们。

2.1 FCN:全卷积网络的“开山之作”

FCN(Fully Convolutional Network)是2015年的工作。它的核心思想很简单:把分类网络最后的全连接层换成卷积层。为什么?因为全连接层会把空间信息丢掉,而分割任务恰恰需要保留空间位置。

我记得第一次在嵌入式板子上跑FCN时,心里直犯嘀咕——这玩意儿输出分辨率也太糙了吧?确实,FCN通过上采样恢复尺寸,但细节丢失严重。它用了跳跃连接(skip connection)来融合浅层和深层特征,算是早期的一个补救措施。

核心要点:
  • 全卷积化:去掉全连接,保留空间信息
  • 上采样:用转置卷积或双线性插值恢复分辨率
  • 跳跃连接:融合浅层细节和深层语义
我的经验:FCN在车规芯片上基本被淘汰了。原因很简单——上采样太粗糙,边缘分割效果差。但它的思想影响了后续所有分割网络,理解它很重要。

2.2 U-Net:编码器-解码器的“经典范式”

U-Net最初是为医学图像设计的,但后来在自动驾驶领域也大放异彩。它的结构像个U形:左边是编码器(下采样),右边是解码器(上采样),中间有跳跃连接把对应层的特征拼起来。

为什么U-Net效果好?我个人觉得,关键在于跳跃连接保留了高分辨率信息。编码器下采样时,空间分辨率降低,但语义信息增强;解码器上采样时,通过跳跃连接把浅层的细节“捞”回来。这样既能看到全局,又能看清细节。

我在项目中遇到过一个问题:U-Net的参数量其实不小,尤其是深度版本。在车规芯片上,如果内存带宽有限,U-Net的跳跃连接反而会成为瓶颈——因为要同时存储多层的特征图。嗯,这里要注意,内存访问模式对部署影响很大,后面我会专门讲。

U-Net关键设计:
  • 对称的编码器-解码器结构
  • 跳跃连接:拼接(concat)而非相加(add)
  • 适合小样本学习,数据增强效果好

2.3 DeepLab系列:空洞卷积与ASPP的“高光时刻”

DeepLab系列是我个人最喜欢的分割网络之一。它解决了两个核心问题:如何扩大感受野而不降低分辨率,以及如何捕捉多尺度信息

2.3.1 空洞卷积:不降分辨率也能看更远

普通卷积的感受野跟层数成正比。你想增大感受野?要么堆更多层,要么用池化下采样。但下采样会丢失细节,这对分割来说是致命的。

空洞卷积(Dilated Convolution)的妙处在于:在卷积核里插入“空洞”。比如一个3x3的卷积,空洞率(dilation rate)设为2,它的感受野就变成了5x5,但参数量和计算量不变。说白了,就是用同样的成本,看到了更大的范围。

# 空洞卷积的简单实现(PyTorch风格)
import torch.nn as nn

# 普通3x3卷积
conv_standard = nn.Conv2d(64, 128, kernel_size=3, padding=1, dilation=1)

# 空洞卷积,感受野等效5x5
conv_dilated = nn.Conv2d(64, 128, kernel_size=3, padding=2, dilation=2)
避坑指南:我曾经在部署时踩过一个坑——空洞卷积在有些芯片的加速器上支持不好。比如某些NPU对dilation rate > 1的卷积做了特殊处理,但性能反而下降。所以选芯片时一定要确认它对空洞卷积的原生支持情况

2.3.2 ASPP:多尺度信息的“集大成者”

ASPP(Atrous Spatial Pyramid Pooling)是DeepLab v3的核心模块。它的思路很直接:用多个不同空洞率的卷积并行提取特征,然后把结果拼起来

为什么会这样?因为现实场景中物体的尺度差异很大。近处的车很大,远处的车很小。单一空洞率的卷积只能捕捉一个尺度的信息。ASPP用1x1卷积、3x3卷积(空洞率6、12、18)再加上全局平均池化,把不同尺度的特征一网打尽。

分支 操作 作用
分支1 1x1卷积 捕捉局部细节
分支2 3x3卷积,dilation=6 中等感受野
分支3 3x3卷积,dilation=12 较大感受野
分支4 3x3卷积,dilation=18 全局上下文
分支5 全局平均池化 + 1x1卷积 图像级特征

你想想看,这五个分支并行跑,最后把特征图在通道维度上拼接。模型就能同时看到“近处的车”和“远处的路”,分割效果自然好。

部署小技巧:ASPP虽然效果好,但计算量不小。我在车规芯片上部署时,经常做两件事:一是减少ASPP的分支数(比如去掉dilation=18的分支),二是把空洞卷积换成可分离卷积。精度损失不大,但速度能提升30%以上。

2.4 小结:从原理到部署的“第一公里”

好了,咱们快速过了一遍三个经典网络。FCN是奠基者,U-Net是编码器-解码器的代表,DeepLab系列则把空洞卷积和ASPP玩到了极致。

我个人觉得,理解这些网络的核心思想比背结构更重要。因为部署时你经常要根据芯片特性做裁剪和优化——比如把标准卷积换成深度可分离卷积,或者把ASPP的并行分支改成串行以减少内存占用。

下一章,咱们会深入车规芯片的硬件特性,聊聊怎么把这些网络“塞”进芯片里,还能跑得快、跑得稳。到时候你会发现,算法和硬件的配合才是真正的艺术