首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

原理讲解-项目实战<->基于语义分割实现斑马线道路划分

精选文章,第一时间送达

好久没有更新语义分割系列的文章了,但是大家放心,我会持续更新的,话不多说,这期就讲解基于MobileNet的SegNet语义分割实现斑马线的划分~

还没有看过的fans,可以先看一下哦~

前言:

语义分割基础模型结构图如下,也就是Convolutional Enconder-Decoder的结构,也就是卷积层编码Enconder与解码Deconder的过程。

编码Encoder的过程就是对我们Input的图片通过特征提取网络不断进行特征提取,这个过程中图片的长和宽不断的进行压缩,通道也会变得越来越大。

解码Decoder的过程就是对特征提取网络最终提取到的特征层进行长和宽的不断的放大,放大到和原图差不多的尺寸。

然后再对每一个像素点进行分类,最终我们得到每个像素点所属的类是什么, 如下图所示:

总结:输入图片—>编码Enconder(特征提取网络提取特征)—> Deconder(将提取到的特征放大)—>对像素点进行分类。

SegNet语义分割模型

模型实现流程图:

在结构图中,输入一张图片在Enconder中进行卷积特征提取到f4层时(图片的宽和高压缩了4次之后的特征层),我们对该特征层进行Deconder处理。

Deconder主要是对提取到的f4有效特征层进行上采样Upsampling2D进行3次上采样(图片的宽高放大)处理,最后我们得到一个具有一定宽w和高h的通道数为filter=n_classes的特征层,最后一个卷积Conv2D, filter设置为n_classes是因为filter代表的是每个像素点所属的种类的类别总数。

总结:首先利用主干特征提取网络MobileNet(下采样)提取图像的特征,得到5个不同大小的有效的特征层,然后Segnet对特征层解码(一系列的上采样upSampling2D),利用softmax函数对每个像素点进行分类,最后保存整个模型。

MobileNet模型原理讲解:

训练自己的语义分割模型

使用主干特征提取网络为MobileNet的SegNet语义分割模型实现划分斑马线。

数据集:斑马线数据集

训练图片:

训练标签:

单独拿图片4.jpg的标签,我们可以看到4.jpg对应的标签4.png像素值仅由000和111组成,原图斑马线部分对应的标签像素值为111,而其它部分的像素值为000,分别对应RGB三通道。

对于语义分割数据集来讲,它的标签的每一个像素点的值就代表了它所属的种类,在本项目中分两类:背景和斑马线,背景区域所对应的像素值为000,而斑马线区域对应的像素值为111。

如果是多分类,那么还会存在222、333这样的RGB值的像素点,像素点的不同像素值代表该像素点属于不同的类别。

项目结构

dataset2里面的jpg文件夹存放的是我们数据集中对应的原图,而png文件夹存放的是我们原图所对应的标签,而train.txt里面存储的原图和其标签的对应关系。

模型代码实现流程:

主干特征提取网络MobileNet:提取图片特征,获取5个不同大小的有效的特征层,详情请见 mobilenet.py 文件。

SegNet解码网络,对特征层进行解码(一系列的上采样upSampling2D),详情请见segnet.py。

最后利用softmax函数对每个像素点进行分类,最后保存整个模型。

模型训练

训练50个epoch,训练文件详情见train.py,训练后保存训练权重。

使用到的损失函数是交叉熵损失函数,y_true代表真实标签,y_pred代表的是预测标签,实际上就是比较预测的标签和真实标签的像素值(代表类别)之间的交叉熵,优化器使用的是Adam。

训练结果:

模型预测:

四、代码下载和环境设置

环境

python==3.6

tensorflow-gpu==1.13.1

keras==2.1.5

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20201231A04Y7000?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

相关快讯

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券