基于深度神经网络LaneNet的车道线检测
使用tensorflow主要基于IEEE IV会议论文“走向端到端的车道检测:实例分割方法”,实现用于实时车道检测的深度神经网络。有关详细信息,请参阅他们的论文 https:// arxiv .org / abs / 1802.05591。该模型由编码器-解码器阶段,二进制语义分割阶段和使用区分性损失函数的实例语义分割组成,用于实时车道检测任务。
LaneNet将车道线检测看作是一个实例分割问题,解决的是一个端到端的问题,其中:
输入为一张图片,输出为车道线像素点的坐标和车道线ID,在得到这些信息之后,通常是将图像投射到鸟瞰视角,进一步完善车道线拟合。这里传统做法为,使用固定的变换矩阵,对图像透视变换,这种做法在路面平整时效果不错,但在路面不平的情况下,就存在很大误差了。论文中,提出了一个H-Net的神经网络。说白了就是将图像输入到H-Net,它输出对应的鸟瞰图变换矩阵,来替代传统做法。完成鸟瞰图变换之后,使用最小二乘法拟合多项式,从而完成车道线检测。
论文解析
论文提出了一种端到端的车道线检测算法,包括LaneNet和H-Net两个网络模型。其中LaneNet是一种将语义分割和对像素进行向量表达结合起来的多任务模型,最后利用聚类完成对车道线的实例分割;H-Net模型是另一个神经网络结构,由卷积层和全连接层组成的网络模型,主要负责预测转换矩阵H,使用转换矩阵H对属于同一条车道线的所有像素点进行重新建模。
系统概述laneNet
1、语义分割中主要考虑的两个问题:
语义分割:负责对图像进行二分类,主要判断像素属于车道线还是背景
1、在构建label时,为了处理遮挡问题,论文中对被车辆遮挡的车道线和虚线进行了还原
2、Loss使用交叉熵,解决图像中车道线像素和背景像素不均衡问题,参考论文ENet
2、聚类(embedding branch):
为方便对图像像素进行聚类,实例分割loss中设置δ_d > 6*δ_v。
对像素点进行嵌入式表达,训练得到的embedding向量用来聚类
在进行聚类时,首先使用mean shift聚类,使得簇中心沿着密度上升的方向移动,防止将离群点选入相同的簇中;之后对像素向量进行划分:以簇中心为圆心,以2δ_v为半径,选取圆中所有的像素归为同一车道线。重复该步骤,直到将所有的车道线像素分配给对应的车道。
像素embedding时,embedding_branch为每个像素初始化一个embedding向量,并在设计loss时,使属于同一车道线的像素向量距离尽可能的小,属于不同车道线的像素向量距离尽可能大,从而区分车道线上的像素属于哪条车道。
这部分,根据车道线向量距离不同从而区别车道的算法,主要是基于Loss函数的,计算方差和距离
方差和距离计算主要思路:
方差:当像素向量x_i与对应车道线均值向量u_c的距离大于δ_v时,模型就会更新,使得像素向量x_i靠近u_c
距离:当不同车道线均值向量u_a和u_b之间的距离小于δ_d时,模型就会更新,使得u_a和u_b远离彼此。
也就是说,方差loss使得像素向量向车道线的均值向量 μ_c 靠近,距离loss则会推动聚类中心远离彼此。
在聚类时,首先使用mean shift聚类,使得簇中心沿着密度上升的方向移动,防止将离群点选入相同的簇中;之后对像素进行划分:以簇为中心,以2δ_v为半径,选取圆中所有的像素归为同一车道线。重复该步骤,直到将所有的车道线像素分配给对应的车道。
将语义分割和像素聚类得到的结果进行结合,利用均值偏移算法聚类,得到实例分割结果
均值偏移算法思路(mean shift)
对于给定的一定数量样本,任选其中一个样本,以该样本为中心划定一个圆形区域,求取该圆形区域内样本的质心,即密度,再以该点为中心继续执行上述迭代过程,直至最终收敛。
mean shift其实是一个迭代的过程,先算出当前点的偏移均值,移动该点到其偏移均值处,然后以此为新的起始点,继续移动,直到满足要求。
H-Net模型
另一个简单的神经网络结构,由卷积层和全连接层组成的网络模型,主要负责预测转换矩阵H,使用转换矩阵H对属于同一条车道线的所有像素点进行重新建模。
在LaneNet中,输出的是每条车到线的像素集合,还需要根据这些像素点回归出一条车线。传统做法是将图片投影到鸟瞰图中,然后进行矩阵变换拟合。传统方法在地面不平时存在误差。在这情况下,论文训练了一个预测变换矩阵H的神经网络H-Net,网络输入的是图片,输出的是变换矩阵H
转置矩阵H通过置0对转置矩阵进行约束,即水平线在变换下保持水平。
主要的网络架构如下:
LaneNet架构模型训练
安装
TensorFlow实现及基于tuSimple数据集的模型训练。借鉴lanenet-lane-detection项目https://github.com/850977164/lanenet-lane-detection
环境使用,ubuntu 16.04(x64),python3.6,cuda-9.0,cudnn-7.0上,tensorflow 1.12.0。其他必须的软件包,可以使用此方式同步
pip3 install -r requirements.txt
若有一些未下载成功,可先跳过,后面用到时在下载
数据准备,下载tuSimple数据集,train_set.zip test_set.zip test_label.json
下载完成后解压到一个目录,目录内容如下
数据集tsSimple训练自己的模型
资料准备
数据集合下载之后,需要参考data /training_data_example文件夹结构来组织训练数据。并且您需要生成train.txt和val.txt来记录用于训练模型的数据。
训练样本包括三个部分。二进制分割标签文件和实例分割标签文件以及原始图像。二进制分段使用255表示泳道字段,使用0表示其余字段。该实例使用不同的像素值表示不同的车道字段,其余部分使用0。
我们使用项目lanenet-lane-detection中的脚本generate_tusimple_dataset
cd lanenet-lane-detection/tools
python3 generate_tusimple_dataset.py --src_dir=/home/local/I/xintingkai/tensorflow/workspace/lanenet-lane-detection/data/training_data_example/tuSimple
执行之后会自动在tuSimple目录下生成training和testing两个目录
接着使用脚本生成tensor记录文件tfrecord文件,命令如下:
python data_provider/lanenet_data_feed_pipline.py
--dataset_dir./data/training_data_example/tuSimple/training
--tfrecords_dir./data/training_data_example/train/tfrecords
显示效果如下:
代码结构
训练模型
作者使用了vgg16作为网络的实现结构。不能翻墙的朋友,可以去我的百度云下载~ ~
链接:百度网盘地址提取码:4ruk
下载完成以后将vgg16.npy放到data目录里
用nohup送入后台运行,方便查看日志信息
nohup python -u train_lanenet.py >nohup 2>&1 &
然后使用tools/train_lanenet.py开始训练:
python tools/train_lanenet.py --net vgg--dataset_dir ./data/training_data_example/tusimple/train -m 0
训练过程中,会出现了ModuleNotFoundError: No module named 'config'问题,添加如下解决
训练效果图-_-
使用tensorboard查看训练过程:
cd tboard/tusimple_lanenet_vgg/
tensorboard --logdir=.
在训练过程中,可以通过tensorboard查看模型在验证集上的总损失(val_cost)、分割损失(val_binary_seg_loss)、嵌入损失(val_instance_seg_loss)以及分割精度(val_accuracy)变化曲线,如下所示:
我们还可以查看模型在训练过程中的分割分支和嵌入分支输出到预测图,如下图所示:
此文档仅记载训练流程,以备后面学习使用,欢迎指正~~~
--后续---
检测效果
模型训练结束,检测一下训练效果
训练完成之后,权重文件会存在model / tusimple_lanenet_vgg /中。
您可以按以下步骤在训练后的模型上测试单个图像
python tools/test_lanenet.py --weights_path ./model/tusimple_lanenet_vgg/tusimple_lanenet_vgg.ckpt--image_path ./data/tusimple_test_image/0.jpg
如果出现找不到文件的错误 ,类似the save_path is not a valid checkpoint问题,是路径的问题,写成绝对路径就可以了,同样修改./model/tusimple_lanenet_vgg目录下的checkpoint文件即可
测试效果
参考文献
https://blog.csdn.net/c20081052/article/details/80622722
网友评论