论文精读
四种版本网络的对比
v1
- 修改 VGG16
- 空洞卷积
- CRF 作为后处理
v2
- 设计 ASPP 模块,将空洞卷积的性能发挥到最大
- 沿用 VGG16 作为主网络
- 尝试使用 ResNet-101 进行对比实验
- CRF 作为后处理
v3
- 以 ResNet 作为主网络
- 设计了一种串行和一种并行的 DCNN 网络
- 微调 ASPP 模块
- 取消 CRF
v3+
- 以 ResNet 或 Xception为主网络
- 加入了编解码结构
- 取消 CRF
先验知识
分辨率的损失
- 连续的池化和下采样会导致图像分辨率大幅下降,丢失原始信息,且在上采样过程中难以恢复
- 为了减少分辨率损失,可以采样空洞卷积或步长为2的卷积操作代替池化
多尺度特征(multi-scale features)
- 由于图片中的目标大小不同、远近不同,可能会导致分割效果不尽人意
- 通过设置不同的不同参数大小的池化层或卷积层,提取到不同尺度的特征
- 再将这些特征图送入到网络中融合,对网络的性能提升很大
空洞卷积(Dilated/Atrous Convolution)
标准卷积与空洞卷积
标准卷积如下图所示:
空洞卷积就是在标准卷积核中间填充0,如下图所示:
空洞卷积的作用
- 在尽量不丢失分辨率的情况下扩大感受野
- 通过设定不同参数捕获上下文多尺度信息
为了保证输出图像尺寸不变时,padding的设定值
以实际卷积核尺寸为3为例:
DeepLab v3+
深度可分离卷积(depthwise separable convolution)
深度可分离卷积可以大大减少参数量,而效果与常规卷积几乎无异甚至要略好
方法:逐通道卷积 + 逐点卷积
逐通道卷积中,一个卷积核负责一个通道,如下图所示:
逐点卷积类似常规卷积,卷积核尺寸为 1×1×M,M 为上一层的通道数,如下图所示:
在Pytorch中的实现
分两个
算法架构
架构总览:
其中,DCNN 为 Xception 网络,如下图所示:
注意:最后一个Res块的最后一个卷积以及跳跃连接的卷积的步长应为1,因为在本次代码中想在下采样最终获得1/8或1/16的尺寸(通过改变Entry_Block3卷积层的步长)
算法实现
导入包
import math
import torch
import torch.nn as nn
import torch.nn.functional as F
Xception
fixed_padding()
该函数是对图像进行padding,以保证在步长为1的卷积中,其尺寸不变
根据下图所示公式:
def fixed_padding(inputs, kernel_size, dilation):
kernel_size_effective = kernel_size + (kernel_size - 1) * (dilation - 1) # 有效kernel_size的公式
pad_total = kernel_size_effective - 1
pad_beg = pad_total // 2
pad_end = pad_total - pad_beg
padded_inputs = F.pad(inputs, (pad_beg, pad_end, pad_beg, pad_end)) # 上下左右补零未必是对称的
return padded_inputs
深度可分离卷积
此处定义的是流程图中每一个Res小块中相同的、可重复使用的深度可分离卷积
方法:逐通道卷积 + 逐点卷积