原论文: Ultra Fast Structure-aware Deep Lane Detection
原github: Ultra-Fast-Lane-Detection
在Ultra-Fast-Lane-Detection之前,已经出现很多基于深度学习的车道线检测方法, 如: LaneNet, SCNN,Apollo的Dark SCNN. 但这些车道线检测网络的问题是前向速度太慢,实时性能差,原因在于它们都把车道线检测当做图像的基于像素点的语义分割处理.
而在Ultra-Fast-Lane-Detection里另辟蹊径,将基于像素的图片粗颗粒化, 将像素级语义分割问题转换为网格级车道线检测. 特征表示的维度数量级降低,从而是算法达到端到端实时车道线检测.
我们人类大脑是如何感知车道线的? 大脑根据生活中先验知识,可以知道车辆行驶的前方左右两侧很大概率有车道线,它或被我们的眼睛直接感知,或因被其他障碍物遮挡大部分但大脑仍能联想出大概那个位置有车道线.
基于上述原理, 作者创新性地为可能有车道线的图像区域添加先验预测框,就像物体检测网络Faster RCNN,SSD,YOLO等那样设置先验候选锚框(anchor),不同的是本算法添加的是基于行的锚框,称为行锚框(row anchor). 进一步利用语义分割辅助结果做辅助,让行锚框从全局特征上获取车道线全局信息,最终识别出完整车道线,对于遮挡的车道线也有较强识别能力.
如上图所示(图片来源于原论文)
1. 算法首先将输入图像可能有车道线的区域分割成一行一行的锚框,每一行由划分出一定宽度的小格, 这样所有行锚框组成一个大的网格.
2. 每一个网格用来表示当前网格内是否有车道线.这样的好处是: 原来基于像素的语义分割任务,被颗粒化为网格的语义分割任务, 很明显这样存储和计算量都数量级减小; 这也是该算法能够达到实时车道线检测的原因.
如下图所示(图片来源于原论文)
1.对于输入的图像x,首先将其变换为800x288的尺寸.
2.对resize后的图片,送入称为parsingNet的网络,首先利用ResNet或VGG-16为骨干网络获取第2层,第3层及第4层特征. 这里会有两个分支:
3. 损失计算
在训练阶段算法,分别共计算四种损失:
cls_loss: 使用nn.NLLLoss();
relation_loss: 使用torch.nn.functional.smooth_l1_loss();
aux_loss: 使用torch.nn.CrossEntropyLoss();
relation_dis: 使用torch.nn.L1Loss().
总的loss等于上面四种损失的值乘以各自的权值后的和.
创建和实现ROS功能包的过程略,直接上测试结果:
从上面效果图可以看出, 该算法基本上可以满足车道线检测需求, 关键是检测速度快,对硬件要求低, 即使不使用GPU,直接在CPU上跑也很顺畅.
但实际效果上也存在不足, 从上图可以看到,预测的车道线不连续或长度不够, 针对这个问题, 可以对检测到的车道线拟合出曲线方程,用传统方法适当延长.