DeepLabv1:空洞卷积+全连接CRF屠榜PASCAL VOC
论文信息
- 标题:Semantic Image Segmentation with Deep Convolutional Nets and Fully Connected CRFs
- 会议:ICLR 2015
- 单位:加州大学洛杉矶分校、Google、CentraleSupélec、INRIA
- 代码:https://bitbucket.org/deeplab/deeplab-public
- arxiv:https://arxiv.org/pdf/1412.7062.pdf
一、前言:CNN做分割为啥“糊”?
DCNN在分类、检测乱杀,但一到语义分割就拉胯,核心俩坑:
- 下采样太狠:池化+步幅把分辨率干到原图1/32,边界直接磨平
- 空间不变性:分类要“鲁棒”,分割要“精准”,天生矛盾
DeepLabv1直接给出双神技:
- 空洞卷积(Atrous Convolution):不降分辨率、不增参数量,扩大感受野
- 全连接CRF(DenseCRF):把CNN的“糙图”精修到像素级边缘
一句话总结:CNN管分类,CRF管抠边,速度快、精度炸。
二、核心创新1:空洞卷积(Atrous / Hole算法)
1. 问题根源
标准VGG16一路池化,输出步幅32,特征太稀疏,边界全丢。
2. 空洞卷积原理
公式(1维示意):
y [ i ] = ∑ k x [ i + r ⋅ k ] ⋅ w [ k ] y[i] = \sum_k x[i + r \cdot k] \cdot w[k]y[i]=k∑x[i+r⋅k]⋅w[k]
- y [ i ] y[i]y[i]:输出特征第i个位置
- x xx:输入特征图
- r rr:膨胀率(空洞大小)
- w [ k ] w[k]w[k]:卷积核第k个参数
- i + r ⋅ k i + r \cdot ki+r⋅k:带空洞的采样位置
通俗解释:卷积核中间插0,不增大尺寸,直接“跳着看”更大区域。
3. DeepLabv1对VGG16魔改
- 后两个池化层步幅改1,不降分辨率
- conv5三层卷积膨胀率=2
- FC层转卷积,第一层膨胀率=4
- 最终输出步幅=8,用双线性插值上采样回原图
好处:精度不掉,训练10小时搞定,FCN要几天。
4. 核心代码(PyTorch)
# 空洞卷积模块classAtrousConv(nn.Module):def__init__(self,in_channels,out_channels,kernel_size,dilation=1):super().__init__()self.conv=nn.Conv2d(in_channels,out_channels,kernel_size,padding=dilation,dilation=dilation)defforward(self,x):returnself.conv(x)# DeepLabv1 LargeFOV 核心(VGG16改)classDeepLabV1_LargeFOV(nn.Module):def__init__(self,num_classes=21):super().__init__()# 前序VGG16卷积层(省略)...# 原FC6 → 空洞卷积,dilation=12,通道压缩self.fc6_conv=AtrousConv(512,1024,3,dilation=12)self.fc7_conv=nn.Conv2d(1024,1024,1)self.fc8_conv=nn.Conv2d(1024,num_classes,1)self.relu=nn.ReLU(inplace=True)self.dropout=nn.Dropout2d(0.5)defforward(self,x):# 前序VGG16特征提取(省略)...x=self.relu(self.fc6_conv(x))x=self.dropout(x)x=self.relu(self.fc7_conv(x))x=self.dropout(x)x=self.fc8_conv(x)# 双线性上采样×8x=F.interpolate(x,scale_factor=8,mode='bilinear',align_corners=False)returnx出处:论文3.1、3.2节 + GitHub官方复现
三、核心创新2:全连接CRF精修边缘
1. 为啥普通CRF不行?
局部CRF只会平滑,会把细结构抹掉,而我们要恢复边缘。
2. 全连接CRF能量函数
E ( x ) = ∑ i θ i ( x i ) + ∑ i < j θ i j ( x i , x j ) E(x) = \sum_i \theta_i(x_i) + \sum_{i<j} \theta_{ij}(x_i,x_j)E(x)=i∑θi(xi)+i<j∑θij(xi,xj)
- E ( x ) E(x)E(x):整张图的标注损失,越小越好
- θ i ( x i ) \theta_i(x_i)θi(xi):一元势,CNN给的第i像素类别置信度
- θ i j ( x i , x j ) \theta_{ij}(x_i,x_j)θij(xi,xj):二元势,i、j像素是否该同类
二元势用双边高斯核:
θ i j = μ ( x i , x j ) ⋅ [ w 1 exp ( − ∣ ∣ p i − p j ∣ ∣ 2 2 σ α 2 − ∣ ∣ I i − I j ∣ ∣ 2 2 σ β 2 ) + w 2 exp ( − ∣ ∣ p i − p j ∣ ∣ 2 2 σ γ 2 ) ] \theta_{ij} = \mu(x_i,x_j) \cdot \Big[ w_1\exp\big(-\frac{||p_i-p_j||^2}{2\sigma_\alpha^2}-\frac{||I_i-I_j||^2}{2\sigma_\beta^2}\big) + w_2\exp\big(-\frac{||p_i-p_j||^2}{2\sigma_\gamma^2}\big) \Big]θij=μ(xi,xj)⋅[w1exp(−2σα2∣∣pi−pj∣∣2−2σβ2∣∣Ii−Ij∣∣2)+w2exp(−2σγ2∣∣pi−pj∣∣2)]
- p i p_ipi:像素i坐标
- I i I_iIi:像素i颜色
- μ \muμ:Potts模型,不同类罚分
- σ \sigmaσ:高斯核带宽,控制“相似”范围
通俗解释:位置近+颜色像,就强行归为一类,把CNN的毛边修顺。
3. 核心代码(DenseCRF)
importnumpyasnpimportpydensecrf.densecrfasdcrfdefdense_crf_refine(img,logits,num_classes=21):H,W=img.shape[:2]# Softmax转概率probs=np.exp(logits-np.max(logits,axis=0,keepdims=True))probs/=np.sum(probs,axis=0,keepdims=True)# 初始化CRFdc=dcrf.DenseCRF2D(W,H,num_classes)# 一元势:-log(概率)unary=-np.log(probs.clip(1e-5,1.0))dc.setUnaryEnergy(unary.reshape(num_classes,-1))# 二元势:高斯+双边dc.addPairwiseGaussian(sxy=3,compat=3)dc.addPairwiseBilateral(sxy=80,srgb=13,rgbim=img,compat=10)# 均值场推理Q=dc.inference(10)returnnp.argmax(Q,axis=0).reshape(H,W)出处:论文4.2节 + pydensecrf官方示例
四、多尺度预测(MSc)
在输入与前4个池化层后接小型MLP,特征拼接融合,增强细节。
- 新增5组×128通道=640维特征
- 只训新增层,速度快
- 提升约1.5% mIOU,不如CRF明显
出处:论文4.3节
五、实验结果:屠榜PASCAL VOC 2012
1. 验证集效果(Table 1(a))
| 方法 | 平均mIOU(%) |
|---|---|
| DeepLab | 59.80 |
| DeepLab-CRF | 63.74 |
| DeepLab-MSc | 61.30 |
| DeepLab-MSc-CRF | 65.21 |
| DeepLab-CRF-7x7 | 67.64 |
| DeepLab-CRF-LargeFOV | 67.64 |
| DeepLab-MSc-CRF-LargeFOV | 68.70 |
出处:论文Table 1(a)
分析:
- CRF一上,直接+4%,边缘精修立竿见影
- LargeFOV:参数量从134.3M→20.5M,速度×3.36,精度持平
- 多尺度+CRF+LargeFOV,强强联合
2. 测试集SOTA(Table 1(b))
| 方法 | 平均mIOU(%) |
|---|---|
| MSRA-CFM | 61.8 |
| FCN-8s | 62.2 |
| TTI-Zoomout-16 | 64.4 |
| DeepLab-CRF | 66.4 |
| DeepLab-MSc-CRF | 67.1 |
| DeepLab-CRF-LargeFOV | 70.3 |
| DeepLab-MSc-CRF-LargeFOV | 71.6 |
出处:论文Table 1(b)
分析:超越FCN等SOTA,领先7.2%,登顶VOC 2012。
3. 感受野/速度对比(Table 2)
| 方法 | 卷积核 | 输入步幅 | 感受野 | 参数 | mIOU | 训练速度 |
|---|---|---|---|---|---|---|
| DeepLab-CRF-7x7 | 7×7 | 4 | 224 | 134.3M | 67.64 | 1.44 img/s |
| DeepLab-CRF | 4×4 | 4 | 128 | 65.1M | 63.74 | 2.90 img/s |
| DeepLab-CRF-4x4 | 4×4 | 8 | 224 | 65.1M | 67.14 | 2.90 img/s |
| DeepLab-CRF-LargeFOV | 3×3 | 12 | 224 | 20.5M | 67.64 | 4.84 img/s |
出处:论文Table 2
分析:LargeFOV轻量高速,精度打平大模型。
4. 可视化效果
分析:
- CNN输出:区域准、边缘糊
- CRF迭代后:边缘锐利、细节拉满
六、速度与工程亮点
- 空洞卷积+全卷积:GPU推理8 FPS
- 全连接CRF均值场:单图≈0.5秒
- 训练流程:CNN训完再调CRF,简单稳定
- 双线性上采样替代转置卷积,快且无棋盘格伪影
出处:论文1、3、4节
七、总结:DeepLabv1到底牛在哪?
- 空洞卷积:不降分辨率、扩大感受野,奠定密集预测基石
- 全连接CRF:CNN+概率图,完美解决定位与分类矛盾
- LargeFOV:轻量高速,工业界友好
- VOC 2012刷到71.6%,开启DeepLab系列传奇
这篇是语义分割必读奠基论文,空洞卷积+CRF的组合思路,至今仍影响着分割、检测、跟踪等任务。
