2、语义分割基础回顾:FCN、U-Net、DeepLab系列核心原理速通
好,咱们直接进入正题。语义分割,说白了就是给图像里的每个像素打标签。你想想看,一张图里有人、有车、有路,模型得告诉我哪个像素属于人,哪个属于车。这跟分类不一样——分类只告诉你图里有啥,分割得告诉你“在哪儿”。
我在车规芯片上部署分割网络时,最深的体会是:精度和速度永远在打架。但别急,咱们先把几个经典网络的核心捋清楚,后面再聊怎么在芯片上“调教”它们。
2.1 FCN:全卷积网络的“开山之作”
FCN(Fully Convolutional Network)是2015年的工作。它的核心思想很简单:把分类网络最后的全连接层换成卷积层。为什么?因为全连接层会把空间信息丢掉,而分割任务恰恰需要保留空间位置。
我记得第一次在嵌入式板子上跑FCN时,心里直犯嘀咕——这玩意儿输出分辨率也太糙了吧?确实,FCN通过上采样恢复尺寸,但细节丢失严重。它用了跳跃连接(skip connection)来融合浅层和深层特征,算是早期的一个补救措施。
- 全卷积化:去掉全连接,保留空间信息
- 上采样:用转置卷积或双线性插值恢复分辨率
- 跳跃连接:融合浅层细节和深层语义
2.2 U-Net:编码器-解码器的“经典范式”
U-Net最初是为医学图像设计的,但后来在自动驾驶领域也大放异彩。它的结构像个U形:左边是编码器(下采样),右边是解码器(上采样),中间有跳跃连接把对应层的特征拼起来。
为什么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)
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卷积 | 图像级特征 |
你想想看,这五个分支并行跑,最后把特征图在通道维度上拼接。模型就能同时看到“近处的车”和“远处的路”,分割效果自然好。
2.4 小结:从原理到部署的“第一公里”
好了,咱们快速过了一遍三个经典网络。FCN是奠基者,U-Net是编码器-解码器的代表,DeepLab系列则把空洞卷积和ASPP玩到了极致。
我个人觉得,理解这些网络的核心思想比背结构更重要。因为部署时你经常要根据芯片特性做裁剪和优化——比如把标准卷积换成深度可分离卷积,或者把ASPP的并行分支改成串行以减少内存占用。
下一章,咱们会深入车规芯片的硬件特性,聊聊怎么把这些网络“塞”进芯片里,还能跑得快、跑得稳。到时候你会发现,算法和硬件的配合才是真正的艺术。