做东西,最重要的就是动手了,所以这篇文章动手跑了一个fcn32s和fcn8s以及deeplab v3+的例子,这个例子的数据集选用自动驾驶相关竞赛的kitti数据集, FCN8s在训练过程中用tensorflow2.0自带的评估能达到91%精确率, deeplab v3+能达到97%的准确率。
这篇文章适合入门级选手,在文章中不再讲述fcn的结构,直接百度就可以搜到。
文章使用的是tensorflow2.0框架,该框架集成了keras,在模型的训练方面极其简洁,不像tf1.x那么复杂,综合其他深度学习框架,发现这个是最适合新手使用的一种。
文章中用到的库函数,参数等均可在tensorflow2.0 api中查找到。
文章的代码在github可以获取,地址:https://github.com/fengshilin/tf2.0-FCN
文章的结构如下:
1.数据的下载与分析
一般深度学习的教程都使用官方的数据集进行训练,这样省去很多步骤,训练过程很简单,易于初学者的学习。对于CNN等分类算法也不无不可,但是对于语义分割这一类像素级别的分类,用官方的例子,就不便于对模型的输入与输出的理解,像素级别的算法需要输入的label为类别,而往往拿到的label都是像素值。所以文章中用kitti竞赛的未做过处理数据集来做训练。
在做模型训练的时候一般需要对数据集进行分析,查看label的结构,以及影像的特点,以此确定对影像做哪些数据增强。(数据增强可以用python的库imgaug,现在可以先不看这个库怎么用,先跑通模型再研究imgaug的使用)
数据的下载
测试使用的是kitti数据集(https://pan.baidu.com/s/1n46UXqpl2-Yc_DaXSrj7XA
, 提取码:3s6k ),数据下载好后可以看一下数据结构,在dataroad/training目录下有一个gt_image2与image2目录,分别存放标签与图片。
查看training中的文件可以发现,gt_image2中命名规则为*_road_.png*或者*_lane_.png*。
其中lane表示自己车道,road表示所有车道。所以对一张图可能同时又road与lane两张label。跑模型时先忽略lane的数据。
其中um表示只有一条道路分割线的道路,umm表示有多个道路分割线的道路,uu表示无道路分割线的道路。
注意: 图片的大小是不一致的,在训练模型时需要将其resize到一致的大小再进行训练。
可以看到影像与road lable的一一对应如下:
模型结果展示
用deeplab的模型在测试集上的结果:
准确率
开始
建议用python3.6版本,至少需要python3.x版本。
安装好python并配置好环境后,安装需要的库。
anaconda版本
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow==2.0.0
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scipy==1.0.0
python版本
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple tensorflow==2.0.0
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
pip3 install -i https://pypi.tuna.tsinghua.edu.cn/simple scipy==1.0.0
使用gpu跑模型会快很多,所以推荐用GPU,安装gpu的步骤可以参看博客。
点击文章开头,文章结构中的连接可跳至其他章节。