目录
测试模型
LaneATT
PolyLaneNet
Ultra-Fast-Lane-Detection
LaneNet
测试模型
LaneATT 、PolyLaneDetection、Ultra-Fast-Lane-Detection、LaneNet。
LaneATT
- 提出了一种在大型复杂数据集上比现有最先进的方法更精确的实时车道检测方法;
- 比其他大多数模型更快,检测速度达到了250FPS;
- 提出了一种新的基于锚的车道检测注意机制。
通过网络结构图,解析整个处理过程:
- backbone通过输入图像生成特征图;
- 没一个anchor投影到特征图上生成投影;
- 这个投影用来与注意力机制模块生成的另一个特征集合相结合;
- 使用这个特征集同时进入两层处理,一层做分类,另一层做回归,作出最终的预测;
模型输出由三个主要组成部分组成,最后通过非极大值抑制NMS给出最后的预测结果。
- K+1概率(K条车道线类型和一个类别的背景);
- 水平偏移x0,x1…(预测与锚线之间的水平距离);
- 车道线长度l。
测试个人数据集:
- 1.按照tusimple数据集格式整理自己的数据
- 2.dataloader根据test_label.json加载数据,所以修改test_label.json数据对应的路径
- 3.修改cfgs文件夹下预使用的模型对应的文件,将test->root的路径改为测试数据集的路径
- 3.python main.py test --exp_name laneatt_r34_tusimple
- 4.检测结果会保存在项目文件夹根目录下
使用通航机场数据测试效果:
PolyLaneNet
一种用于端到端车道线检测估计的卷积神经网络。PolyLaneNet从安装在车辆中的前视摄像头获取输入图像,并输出代表图像中每个车道标记的多项式,以及域车道多项式和每个车道的置信度得分。该方法与现有的最新方法相比具有竞争优势,同时速度更快,不需要后处理即可获得车道估算值。并公开发布了源代码(用于训练和推理)和经过训练的模型,从而可以复制本文中介绍的所有结果。
测试个人数据集:
- 测试个人数据需按照tusimple数据集格式整理
- dataloader加载数据根据test_label.json加载,图片最少35张,最简单的办法将自己的图片替换路径中图片
- config.yaml中设置测试数据集路径
- python test.py --exp_name tusimple --cfg config.yaml --epoch 2695
通航机场数据测试
Ultra-Fast-Lane-Detection
贡献
- 提出一种简单有效的车道检测方法,快且解决了在图上无车道时推测车道的问题;快:将语义分割问题转化成分类问题(减少运算),Row Anchor, 300+FPS;解决图上无车道时车道推测:结合全局的特征预测车道,相比语义方法有更大的感受野;
- 基于上述的方法提出一个结构化损失函数;
- SOTA;
模型框架
上下两个分支:
主下,先ResNet特征提取,再按rowanchor分类;
次上,语义分割,仅在训练时有效;
下图展示了整个模型的结构,基本可以分为三个部分:Backbone
、 Auxiliary
部分和用于车道线候选点选择的Group Classification
部分。可以看出,由于整个pipeline
中参与最终inference
的部分只进行了下采样而不像分割模型还进行了多轮的上采样,因此模型整体的计算量是相当低的,根据论文给出的结果可以达到300FPS
。
Backbone
部分采用了较小的ResNet18
或者ResNet34
,下采样到4X
的部分作为最终的特征,这里其实是较为浅层的特征,一般分割模型要下采样到16x
或者32x
。论文里也提到了使用较大的感受野就可以达到不错的检测效果,这样就可以极大的提高模型的推理速度。
Auxiliary
部分对三层浅层特征进行了concat
和上采样,用来进行实例分割。其目的是在训练过程中增强视觉特征,不参与推理。
Group Classification
部分如下所示,论文称之为row-based selecting method based on global image features
,即在全局特征上进行行索引来计算候选点,这样的方法将先验假设融入到了车道线检测的任务中。
在分割任务上,最终的特征图的大小是HxWxC
。分类是要沿着C
方向的,C
方向的向量代表一个像素位置的特征向量属于哪一个类别;在本方法中,最终的特征图的大小是hx(w+1)xC
。h
是要在垂直方向上采样的行的数量(row anchor
),h<H
;w
是行方向上车道线候选点的位置(grid cell
)的数量,w<W
。C
是车道线的数量。分类是沿着w
方向的,即对每个车道线,在其预设的垂直方向h
上,计算其出现在水平位置上每个grid cell
中的概率。
文章中使用的Loss
函数分为三部分,分别是多分类损失L_cls
, 分割损失L_seg
和车道结构化损失L_str
。其中L_cls
和L_seg
是常用的分类、分割任务中常用的两种损失。
测试个人数据:
- 将数据按照tusimple数据集格式整理;
- dataloder加载数据会根据test.txt文件中的顺序加载,所以需要对照数据集修改该文件
- python demo.py configs/culane.py --test_model path_to_culane_18.pth
- 测试结束后会将以test.avi的结果存储到项目文件夹根目录
通航机场数据测试
LaneNet
基于此,2018年Davy Neven等人提出一种新的车道线检测网络LaneNet,LaneNet主要做出了如下两个贡献:
- 将车道检测问题归结为一个实例分割问题,其中每条车道都形成了自己的实例,可以端到端地进行训练。
- 构建了一个新的网络H-Net,用于学习给定输入图像的透视变换参数,该透视变换能够对坡度道路上的车道线进行良好地拟合,克服了鲁棒性不好的问题。
整体结构
作者提出一个多分支结构LaneNet+HNet
LaneNet网络结构
二值化分割网络:Lanenet的一个分支为二值化分割网络,该网络将车道线像素与背景区分开。由于目标类别是2类(车道/背景),并且高度不平衡,因此参考了ENet,损失函数使用的是标准的交叉熵损失函数。
实例分割网络:该分支网络参考了《Semantic Instance Segmentation with a Discriminative Loss Function》,使用基于one-shot的方法做距离度量学习,将该方法集成在标准的前馈神经网络中,可用于实时处理。该分支网络训练后输出一个车道线像素点距离,基于归属同一车道的像素点距离近,不同车道线像素点距离远的基本思想,利用聚类损失函数聚类得到各条车道线。
HNet网络结构
LaneNet网络输出的是每条车道线的像素集合,常规的处理是将图像转为鸟瞰图,然后用二次或三次多项式拟合出弯曲的车道线。然而,目前所使用的透视变换矩阵的参数通常是预先设定、不会改变的,在面对水平线波动的影响(如上下坡)等情况下的车道线拟合并不准确,鲁棒性不强。因此,作者提出了H-net模型,用来学习透视变换矩阵的参数H。
测试个人数据:
- 将图片放置到data文件夹下
- --image_path 对应图片路径
- python tools/test_lanenet.py --weights_path model/tusimple_lanenet.ckpt --image_path ./data/tusimple_test_image/4.jpg
通航机场数据测试,720p的图片检测速度为72ms左右,所以检测速度小于15FPS。
结论
通过使用通航机场滑行道图片进行模型测试:
PolyLaneNet检测结果最差
LaneNet检测速度不满足需要
LaneATT和Ultra-Fast-Lane-Detection可以进一步使用自制数据集进一步训练后,再进行测试查看效果。