基于深度神经网络LaneNet的车道线检测

基于深度神经网络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

https://www.cnblogs.com/xuanyuyt/p/11523192.html

https://github.com/MaybeShewill-CV/lanenet-lane-detection

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容