美文网首页
使用DeepLabV3+训练自己的图像语义分割模型

使用DeepLabV3+训练自己的图像语义分割模型

作者: 自带BGM的老司机 | 来源:发表于2019-02-15 23:54 被阅读0次

    图像语义分割(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数据集以及预训练的参数文件然后加载。

    部分验证结果

    部分验证结果

    相关文章

      网友评论

          本文标题:使用DeepLabV3+训练自己的图像语义分割模型

          本文链接:https://www.haomeiwen.com/subject/ygpveqtx.html