项目实践中对语义分割网络DeepLabV3+的改进
概述
最近用DeepLabV3+做了一些语义分割的工作,从github上下载了别人实现的tensorflow实现。发现速度不能满足需求,所以本人对DeepLabV3+做了一些改进。
原始的网络结构
下图左侧是DeepLabV3的结构,中间是U-Net风格的编解码结构,最右侧就是DeepLabV3+的结构。和V3相比,V3+融合了一次底层特征图(主干网络也换了,但是这里体现不出来)。
改进方向
替换backbone
DeepLabV3+论文里的backbone是Xception, 我下到的工程里用的是ResnetV2-50和ResnetV2-101。
整体的模型保存为PB有一百多M, 在CPU上的运行时间是1秒多。
为了加快网络速度,将backbone替换为MobileNetV2。
使用深度分离卷积替换普通卷积
ASPP部分和decoder部分的参数数量同样吓人,为此把所有的普通卷积替换为深度分离卷积。
同时ASPP和decoder部分的通道数量也做了一定的删减。
增加一次对底层特征的融合
在做身份证部件解析的时候发现细节切分效果较差。为了改善细节,将1/2大小的特征图和decoder特征进行融合,最终取得了不错的效果。
最终效果
整个模型保存为PB固化文件后只有2.5M, 300x400的图片解析时间在CPU上0.2秒左右。
图片效果见《基于语义分割的身份证部件解析和文字检测》
参考资料
DeeplabV3+:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation