论文基础信息标题Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation会议ECCV 2018单位Google Inc.代码github.com/tensorflow/models/tree/master/research/deeplab论文https://arxiv.org/pdf/1802.02611.pdf一、论文核心总览这篇论文把空间金字塔池化和编码器-解码器结构的优势焊死在一起在DeepLabv3基础上加了极简解码器同时用深度可分离卷积把速度和精度拉满在PASCAL VOC 2012和Cityscapes两个数据集刷到SOTA是语义分割领域兼顾精度与速度的里程碑工作。一句话总结DeepLabv3 超强编码器DeepLabv3ASPP 极简高效解码器 深度可分离空洞卷积。图 1.我们对 DeepLabv3 进行了改进该模型采用了空间金字塔池化模块a以及编码器-解码器结构b。所提出的模型 DeepLabv3 从编码器模块中获取了丰富的语义信息而详细的对象边界则通过简单但有效的解码器模块得以恢复。编码器模块允许我们通过应用空洞卷积在任意分辨率下提取特征。二、核心创新点人话版结构融合把DeepLabv3的多尺度上下文捕获能力和编码器-解码器的边界恢复能力结合灵活分辨率用空洞卷积任意控制编码器特征密度平衡精度和算力轻量化升级改造Xception backbone全链路用深度可分离卷积更快更强边界优化专用解码器专门修复物体边缘分割边界更锐利三、核心技术详解带公式通俗解释图 2. 3×3 深度分离卷积将标准卷积分解为a深度卷积针对每个输入通道应用单一滤波器和b点卷积将深度卷积在不同通道中的输出进行组合。在本研究中我们探讨了空洞分离卷积其中在深度卷积中采用了空洞卷积如图c所示其采样率为 2。1. 空洞卷积Atrous Convolution论文核心公式公式1y[i]∑kx[ir⋅k]w[k]y[i] \sum_k x[i r \cdot k]w[k]y[i]k∑​x[ir⋅k]w[k]字母逐词解释y[i]y[i]y[i]输出特征图第iii个位置的像素值xxx输入特征图rrr空洞率atrous rate控制卷积核的孔洞大小越大感受野越大kkk卷积核内部元素的索引w[k]w[k]w[k]卷积核第kkk个位置的权重参数通俗解释普通卷积是密集采样空洞卷积就是在卷积核里插r−1r-1r−1个0不增加参数就能扩大感受野还能保持特征分辨率解决分割任务下小物体丢失、边缘模糊的问题。2. 深度可分离空洞卷积Atrous Separable Convolution把标准卷积拆成两步深度卷积每个通道单独卷积不跨通道混合逐点卷积1×1卷积融合通道信息再把空洞卷积嵌入深度卷积计算量砍半精度不降反升。通俗解释相当于把卷积的「空间滤波」和「通道融合」分开做再加上空洞扩大感受野轻量大感受野一举两得。3. 编码器-解码器整体结构图 3. 我们提出的 DeepLabv3 通过采用编码器-解码器结构对 DeepLabv3 进行了扩展。编码器模块通过在多个尺度上应用空洞卷积来编码多尺度的上下文信息而简单的但有效的解码器模块则沿着对象边界对分割结果进行细化。结构拆解编码器DeepLabv3 backbone ASPP模块捕获多尺度语义信息解码器编码器输出上采样4倍拼接主干网低层细粒度特征两层3×3卷积细化特征再上采样4倍得到最终分割图通俗解释编码器负责「看懂这是什么」解码器负责「把边缘画精准」两者结合既懂语义又抠细节。4. ASPP模块空洞空间金字塔池化并行4路不同空洞率的3×3卷积 1路全局池化同时捕获小、中、大、全局尺度的上下文解决多尺度物体分割难题。5. Modified Aligned Xception图 4. 我们对 Xception 进行了如下修改1增加层数与 MSRA 的修改相同但入口流程有所变化2将所有的最大池化操作替换为具有步长的深度可分离卷积3在每个 3×3 深度卷积之后添加额外的批量归一化和 ReLU 操作类似于 MobileNet。论文对Xception做了3点改造加深网络保留Entry Flow结构保证速度最大池化全部替换为带步幅的深度可分离卷积每个3×3深度卷积后加BN和ReLU通俗解释把Xception改成全卷积、可空洞、更稳定的分割专用backbone。四、实验结果与分析带表格解读实验表格总览出处DeepLabv3论文表1、表2、表61. 解码器1×1卷积通道数实验表1Channels816324864mIOU77.61%77.92%78.16%78.21%77.94%分析通道数48时mIOU达到峰值78.21%通道太少特征不足太多引入冗余噪声论文最终选用48通道作为低层特征压缩维度2. 解码器结构设计实验表2结构方案mIOU两层3×3卷积256通道78.85%一层3×3卷积78.21%三层3×3卷积78.02%分析两层3×3卷积效果最优过多卷积导致过拟合仅用Conv2低层特征比叠加Conv3更高效证明论文解码器简单但极其有效3. SOTA对比实验表6模型mIOUDeepLabv385.7%DeepLabv3Xception87.8%DeepLabv3Xception-JFT89.0%分析相比DeepLabv3提升3.3%加入JFT预训练再提1.2%无任何后处理刷到VOC 2012测试集89.0%登顶SOTA4. 边界精度实验论文用trimap实验验证边界效果窄边界区域mIOU提升4.8%~5.4%解码器对边缘细节的修复能力显著优于单纯双线性上采样五、核心代码实现TensorFlow2importtensorflowastffromtensorflow.kerasimportlayers,Model# 空洞卷积论文核心算子defatrous_conv2d(x,filters,kernel_size,rate1,**kwargs): 空洞卷积扩大感受野不损失分辨率 :param rate: 空洞率r对应论文公式中的r returnlayers.Conv2D(filters,kernel_size,dilation_raterate,paddingsame,**kwargs)(x)# 深度可分离空洞卷积DeepLabv3专属defatrous_sep_conv2d(x,filters,kernel_size,rate1,**kwargs):xlayers.DepthwiseConv2D(kernel_size,paddingsame,dilation_raterate,**kwargs)(x)xlayers.Conv2D(filters,1,paddingsame)(x)returnx# ASPP模块空洞空间金字塔池化defASPP(x,output_stride16):shapex.shape.as_list()conv1x1layers.Conv2D(256,1,paddingsame)(x)rate6ifoutput_stride16else12conv3x3_r6atrous_sep_conv2d(x,256,3,raterate)conv3x3_r12atrous_sep_conv2d(x,256,3,raterate*2)conv3x3_r18atrous_sep_conv2d(x,256,3,raterate*3)# 图像级全局特征image_poollayers.GlobalAveragePooling2D()(x)image_poollayers.Reshape((1,1,shape[-1]))(image_pool)image_poollayers.Conv2D(256,1,paddingsame)(image_pool)image_poollayers.UpSampling2D((shape[1],shape[2]))(image_pool)# 拼接融合xlayers.Concatenate()([conv1x1,conv3x3_r6,conv3x3_r12,conv3x3_r18,image_pool])xlayers.Conv2D(256,1,paddingsame)(x)returnx# 解码器模块论文核心创新defdecoder_module(encoder_out,low_level_features):# 4倍上采样xlayers.UpSampling2D((4,4))(encoder_out)# 低层特征通道压缩low_level_featureslayers.Conv2D(48,1,paddingsame)(low_level_features)# 特征拼接xlayers.Concatenate()([x,low_level_features])# 边界细化xatrous_sep_conv2d(x,256,3)xatrous_sep_conv2d(x,256,3)# 最终4倍上采样xlayers.UpSampling2D((4,4))(x)returnx# DeepLabv3完整模型defDeepLabv3Plus(input_shape(512,512,3),num_classes21):inputslayers.Input(input_shape)# 加载ResNet101 backbonebackbonetf.keras.applications.ResNet101(weightsimagenet,include_topFalse,input_tensorinputs)low_level_featuresbackbone.get_layer(conv2_block3_out).output# 编码器encoder_outASPP(backbone.output)# 解码器decoder_outdecoder_module(encoder_out,low_level_features)# 像素分类outputslayers.Conv2D(num_classes,1,activationsoftmax)(decoder_out)returnModel(inputs,outputs)完整可运行代码sandbox://tos-cn-i-ik7evvg4ik/ci/38422596160947970_1776741507562/deeplabv3_core_code.py六、全文精读总结1. 核心贡献提出编码器-解码器ASPP的混合结构兼顾上下文与边界设计极简高效解码器专门修复分割边缘改造Xception深度可分离空洞卷积实现速度精度双提升在两大分割数据集刷到SOTA无后处理VOC 2012达89.0%2. 适用场景城市景观分割Cityscapes通用物体语义分割PASCAL VOC移动端/边缘端部署轻量化优势3. 行业影响DeepLabv3成为工业界最常用的语义分割基线模型后续大量分割算法都基于它改进是从学术到落地的经典之作。