摘要:LaneNet是一种端到端的车道线检测方法,包含 LanNet + H-Net 两个网络模型。

本文分享自华为云社区《【论文解读】LaneNet基于实体分割的端到端车道线检测》,作者:一颗小树x。

前言

这是一种端到端的车道线检测方法,包含LanNet+H-Net两个网络模型。

LanNet是一种多任务模型,它将实例分割任务拆解成“语义分割”和“对像素进行向量表示”,然后将两个分支的结果进行聚类,得到实例分割的结果。

H-Net是个小网络,负责预测变换矩阵H,使用转换矩阵H对同属一条车道线的所有像素点进行重新建模。即:学习给定输入图像的透视变换参数,该透视变换能够对坡度道路上的车道线进行良好地拟合。

整体的网络结构如下:

论文地址:TowardsEnd-to-EndLaneDetection:anInstanceSegmentationApproach

开源数据集TuSimple:https://github.com/TuSimple/tusimple-benchmark/issues/3

开源代码:https://github.com/MaybeShewill-CV/lanenet-lane-detection

一、LanNet

LanNet对输入图像进行实例分割,其中网络结构分为两个方向,一个是语义分割,另一个是对像素进行向量表示,最后将两个分支的结果进行聚类,得到实例分割的结果。LaneNet输出实例分割的结果,为每个车道线像素分配一个车道线ID。

1.1网络结构

先看看网络结构:

分支1:语义分割,Segmentation,对像素进行二分类,判断像素属于车道线还是背景;

分支2:对像素进行向量,Embedding,对像素进行嵌入式表示,把图像特征表示为嵌入空间中,特征之间的关系映射在嵌入空间。

聚类,基于Mean-Shift算法实现的,把将两个分支的结果进行聚类,得到实例分割的结果。

LaneNet是基于ENet的encoder-decoder模型,如下图所示,ENet由5个stage组成,其中stage2和stage3基本相同,stage1,2,3属于encoder,stage4,5属于decoder。

1.2语义分割

这部分是对像素进行二分类,判断像素属于车道线还是背景;并且高度不平衡,因此参考了ENet,损失函数使用的是标准的交叉熵损失函数。

设计语义分割模型时,为了处理遮挡问题,论文对被车辆遮挡的车道线和虚线进行了还原(估计);

Loss使用softmax_cross_entropy,为了解决样本分布不均衡的问题,使用了boundedinverseclassweight对loss进行加权:

其中,p为对应类别在总体样本中出现的概率,c是超参数。

Loss的设计参考了:论文ENet:ADeepNeuralNetworkArchitectureforReal-TimeSemanticSegmentation

1.3像素映射到嵌入空间

当分割识别得到车道后,为了知道哪些像素归这条车道,哪些归那条车道,需要训练一个车道instanceembedding分支网络。它能输出一个车道线像素点距离,归属同一车道的像素点距离近,反之远,基于这个策略,可聚类得到各条车道线。

为了区分车道线上的像素属于哪条车道,为每个像素初始化一个embedding向量,并且在设计loss时,使属同一条车道线的表示向量距离尽可能小,属不同车道线的表示向量距离尽可能大。

这部分的loss函数是由三部分组成:方差损失、距离损失、回归损失:

其中,C是车道线数量,Nc是属同一条车道线的像素点数量,μc是车道线的均值向量,xi是像素向量(pixelembedding)。

该loss函数源自于论文《SemanticInstanceSegmentationwithaDiscriminativelossfunction》

方差loss(Lvar):当像素向量(pixelembedding)xi与对应车道线均值向量μc的距离大于δv时,模型会进行更新,使得xi靠近μc;

距离loss(Ldist):当不同车道线均值向量μca和μcb之间的距离小于δd时,模型会进行更新,使得μca与μcb远离彼此;

方差loss(Lvar)使得像素向量向车道线的均值向量μc靠近,距离loss(Ldist)则会推动聚类中心远离彼此。

1.4聚类

embedding(像素映射到嵌入空间)已经为聚类提供好的特征向量了,利用这些特征向量我们可以利用任意聚类算法来完成实例分割的目标。

聚类是基于Mean-Shift算法实现的,把将两个分支的结果进行聚类,得到实例分割的结果。

首先使用meanshift聚类,使得簇中心沿着密度上升的方向移动,防止将离群点选入相同的簇中;之后对像素向量进行划分,直到将所有的车道线像素分配给对应的车道。

二、H-Net

LaneNet的输出是每条车道线的像素集合,还需要根据这些像素点回归出一条车道线。传统的做法是将图片投影到俯视图(鸟瞰图)中,然后使用2阶或者3阶多项式进行拟合。在这种方法中,变换矩阵H只被计算一次,所有的图片使用的是相同的变换矩阵,这会导致地平面(山地,丘陵)变化下的误差。

为了解决这个问题,论文训练了一个可以预测变换矩阵H的神经网络H-Net,网络的输入是图片,输出是变换矩阵H:

通过置0对转置矩阵进行约束,即水平线在变换下保持水平。(即坐标y的变换不受坐标x的影响)

由上式可以看出,转置矩阵H只有6个参数,因此H-Net的输出是一个6维的向量。H-Net由6层普通卷积网络和一层全连接网络构成,其网络结构如图所示:

三、模型效果

车道线检测效果,与其他模型对比

​模型的精度高达96.4%,这个效果挺不错了。

模型速度:

2018年:在NVIDIA1080TI上测得的512X256图像的速度。总的来说,车道检测可以以52FPS的速度运行。检测速度比较快了,实时性较高。

2020年:添加实时分割模型BiseNetV2作为Lanenet主干,新模型在单幅图像推理过程中可以达到78fps。可以在此处找到基于BiseNetV2训练的新Lanenet模型。

模型效果:

四、开源代码

开源代码:https://github.com/MaybeShewill-CV/lanenet-lane-detection

该开源代码是使用LaneNet深度神经网络模型,进行实时车道检测(非官方版)

该模型由编码器-解码器阶段、二进制语义分割阶段和使用判别损失函数进行实时车道检测任务的实例语义分割组成。

代码的运行环境:(以下是亲测的)

系统:ubuntu16.04(x64)

语言:Python3.6

深度框架:TensorFlow1.15.0(GPU版本)

其他依赖库:cv2、matplotlib、scikit_learn、numpy等。

实践过程:

1)创建conda环境

condacreate-nLineNetpython=3.6

2)进入刚才创建的环境

condaactivateLineNet

3)根据requirements.txt要求去安装相关的依赖库(这里我也阿里云加速安装了)

pip3install-rrequirements.txt-ihttps://mirrors.aliyun.com/pypi/simple/

看了一下这个的文件,发现有点问题。

tensoflow重复了:tensorflow_gpu==1.15.0、tensorflow==1.15.0,根据使用情况删除一个,我是准确使用GPU加速的,于是删掉tensorflow==1.15.0。

4)安装英伟达的cudatoolkit10.0版本

condainstallcudatoolkit=10.0

5)安装英伟达深度学习软件包7.6版本

condainstallcudnn=7.6.5

6)设置lanenet_model环境变量

exportPYTHONPATH="${PYTHONPATH}:your_path/lanenet-lane-detection/lanenet_model"

your_path是lanenet-lane-detection文件夹所在的绝对路径。

7)下载模型

链接:https://pan.baidu.com/s/1-av2fK7BQ05HXjKMzraBSA提取码:1024

一共4个文件,30M左右。

然后在lanenet-lane-detection目录下,新建一个子目录,名为model_weights,存在这个4个模型文件,待会用到。

8)测试模型

pythontools/test_lanenet.py--weights_pathmodel_weights/tusimple_lanenet.ckpt--image_path./data/tusimple_test_image/3.jpg

成功使用GPU加速:

语义分割和像素嵌入效果:

实体分割效果:

模型效果:

参考:https://www.jianshu.com/p/c6d38d648509

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

LaneNet:TowardsEnd-to-EndLaneDetection:anInstanceSegmentationApproach

ENet:ADeepNeuralNetworkArchitectureforReal-TimeSemanticSegmentation

DiscriminativeLoss:SemanticInstanceSegmentationwithaDiscriminativelossfunction

论文地址:TowardsEnd-to-EndLaneDetection:anInstanceSegmentationApproach

开源代码:https://github.com/MaybeShewill-CV/lanenet-lane-detection

本文只提供参考学习,谢谢。

点击关注,第一时间了解华为云新鲜技术~

带你读AI论文丨LaneNet基于实体分割的端到端车道线检测的更多相关文章

  1. 带你读AI论文丨ACGAN-动漫头像生成

    摘要:ACGAN-动漫头像生成是一个十分优秀的开源项目. 本文分享自华为云社区<[云驻共创]AI论文精读会:ACGAN-动漫头像生成>,作者:SpiderMan. 1.论文及算法介绍 1. ...

  2. 带你读AI论文丨用于目标检测的高斯检测框与ProbIoU

    摘要:本文解读了<Gaussian Bounding Boxes and Probabilistic Intersection-over-Union for Object Detection&g ...

  3. 带你读AI论文丨RAID2020 Cyber Threat Intelligence Modeling GCN

    摘要:本文提出了基于异构信息网络(HIN, Heterogeneous Information Network)的网络威胁情报框架--HINTI,旨在建模异构IOCs之间的相互依赖关系,以量化其相关性 ...

  4. 带你读AI论文:NDSS2020 UNICORN: Runtime Provenance-Based Detector

    摘要:这篇文章将详细介绍NDSS2020的<UNICORN: Runtime Provenance-Based Detector for Advanced Persistent Threats& ...

  5. 深度学习笔记(十二)车道线检测 LaneNet

    论文:Towards End-to-End Lane Detection: an Instance Segmentation Approach 代码:https://github.com/MaybeS ...

  6. 语义分割之车道线检测Lanenet(tensorflow版)

    Lanenet 一个端到端的网络,包含Lanenet+HNet两个网络模型,其中,Lanenet完成对车道线的实例分割,HNet是一个小网络结构,负责预测变换矩阵H,使用转换矩阵H对同属一条车道线的所 ...

  7. 车道线检测LaneNet

    LaneNet LanNet Segmentation branch 完成语义分割,即判断出像素属于车道or背景 Embedding branch 完成像素的向量表示,用于后续聚类,以完成实例分割 H ...

  8. Lane-Detection 近期车道线检测论文阅读总结

    近期阅读的几篇关于车道线检测的论文总结. 1. 车道线检测任务需求分析 1.1 问题分析 针对车道线检测任务,需要明确的问题包括: (1)如何对车道线建模,即用什么方式来表示车道线. 从应用的角度来说 ...

  9. SCNN车道线检测--(SCNN)Spatial As Deep: Spatial CNN for Traffic Scene Understanding(论文解读)

    Spatial As Deep: Spatial CNN for Traffic Scene Understanding 收录:AAAI2018 (AAAI Conference on Artific ...

随机推荐

  1. 网站图片无缝兼容 WebP/AVIF

    前言 WebP 格式发布已有十余年,但不少站点至今仍未使用,只为兼顾极少数低版本浏览器.至于去年发布的 AVIF 格式,使用的站点就更少了. 然而图片往往是流量大户,与其费尽心机优化脚本体积,可能还不 ...

  2. Selenium启动Chrome浏览器提示“请停用以开发者模式运行的扩展程序”的解决办法

    安装了python selenium,运行下面代码: 1 from selenium import webdriver 2 3 browser = webdriver.Chrome() 4 brows ...

  3. 「AGC035C」 Skolem XOR Tree

    「AGC035C」 Skolem XOR Tree 感觉有那么一点点上道了? 首先对于一个 \(n\),若 \(n\equiv 3 \pmod 4\),我们很快能够构造出一个合法解如 \(n,n-1, ...

  4. Django基础010--ORM操作

    orm返回的数据有两种,QuerySet,object 1.QuerySet支持链式编程,可以在all()后面继续.方法 teachers = models.Teacher.objects.all() ...

  5. 前端009-vue框架

    vue-admin-element https://panjiachen.github.io/vue-element-admin-site/zh/ 基于vue的生态做的很好,提供的很多的文档,中文.并 ...

  6. USB数据线 单独供电

    USB数据线上剪掉两个电源线,只保留两个是数据就无法传数据了.数据线传输数据需要通过芯片来进行数据交换,芯片的工作离不开电源,没有电源,芯片无法工作,当然也就无法传输数据了.电源线特别是负极线,同时还 ...

  7. C编译器

    GCC:GNU Compiler Collection,即 GNU 编译器套件.TDM-GCC 4.8.1 32-BIT Release: 查看GCC的版本:C:\Program Files\Dev- ...

  8. canvas实现任意正多边形的移动(点、线、面)

    前言 我在上一篇文章简单实现了在canvas中移动矩形(点线面),不清楚的小伙伴请看我这篇文章:用canvas 实现矩形的移动(点.线.面)(1). ok,废话不多说,直接进入文章主题, 上一篇文章我 ...

  9. Leetcode:面试题55 - II. 平衡二叉树

    Leetcode:面试题55 - II. 平衡二叉树 Leetcode:面试题55 - II. 平衡二叉树 Talk is cheap . Show me the code . /** * Defin ...

  10. 超详细!搭建本地大数据研发环境(16G内存+CDH)

    工欲善其事必先利其器,在经过大量的理论学习以后,需要有一个本地的研发环境来进行练手.已经工作的可以不依赖于公司的环境,在家也可以随意的练习.而自学大数据的同学,也可以进行本地练习,大数据是一门偏实践的 ...