图像语义分割(Object Segmentation)领域DeepLabV3+是现在效果比较好的网络,Pascal VOC 2012 评分靠前的模型里面很多都是DeepLabV3+的变种。
具体DeepLabV3+的模型结构原理方法就不说了,网上很多的介绍文章,Baidu一下就有了。这里直接上干货使用在Pascal Voc 2012数据集上预训练的模型和参数做一个fine tuning,来训练自己的分割模型。
论文原文:Encoder-Decoder with Atrous Separable Convolution for Semantic Image Segmentation
要求
tensorflow-1.10.0
keras-2.1.6
代码
Git:DeeplabV3Plus-Keras-Retraining
实现
手上没有什么好用的数据集,并且本文主要的目的是展示怎么对DeepLabV3+进行fine tune,所以就使用大家都熟悉的MNIST数据集进行一个手写数字的分割训练。
模型结构代码主要在model.py文件的Deeplabv3方法定义,方法返回一个keras的model类型对象。
def Deeplabv3(weights='pascal_voc', input_tensor=None, input_shape=(512, 512, 3), classes=21, backbone='mobilenetv2', OS=16, alpha=1.)
参数可以参考代码的注释,做fine tune主要涉及以下几个参数:
input_shape:输入图片的shape,MNIST数据集的图片都是28*28大小,这里在train调用的时候传入(28, 28, 3)。这里MNIST实际是灰度图也就是shape是(28, 28),生成训练数据的input的时候把图片按channel维度复制3份封装成(28, 28, 3)就行。
classes:分类数,按照MNIST分为0-9十个数字加上背景共11类。
backbone:mobilenetv2或者xception,为了训练速度快速获得结果,这里选用mobilenetv2。
调用代码详细请参见train.py
basemodel = Deeplabv3(input_shape=(28, 28, 3), classes=11, backbone='mobilenetv2')
训练代码就使用的keras的fit_generator函数来训练,是否多GPU训练,optimizer,batch_size,learning_rate,loss函数还有一些callback之类的配置详见train.py文件。
训练过程主要是给fit_generator函数提供一个data_generator按batch喂数据就OK了。
数据生成参见data_gen.py文件的data_generator函数。
def data_generator(x_data, y_data, batch_size=32)
这个函数主要功能是按batch_size生成一个批次的input以及gt数据。返回值x,y,l
x:就是一个批次32张(假设batch_size为32)数字图片组成的矩阵,shape为(32, 28, 28, 3)最后的这个channel维度3是把原图复制了3次按channel维度拼接在一起。
y:是图片的真实mask,也就是在原图上非数字的像素点值为0,数字的像素点的值按照0-9分别标注为1-10,一共10个数字加1个背景区域一共11个类别。
l:数字标注的具体值,0-9,返回给代码做验证,没什么作用。
代码的实现部分的主要功能就说完了,运行train.py文件开始训练,keras会自动下载MNIST数据集以及预训练的参数文件然后加载。