车道线检测算法通常分为两种类型:一种是基于基于视觉特征来做语义分割或者实例分割,例如LaneNet
和SCNN
;另一种是通过视觉特征来预测车道线所在位置的点,以此来解决no-visual-clue
问题的模型,比如本文提到的Ultra-Fast-Lane-Detection
。
offical github:https://github.com/cfzd/Ultra-Fast-Lane-Detection
paper:Ultra Fast Structure-aware Deep Lane Detection
模型
下图展示了整个模型的结构,基本可以分为三个部分: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
是常用的分类、分割任务中常用的两种损失。
结构损失的目的是利用车道结构的先验知识来约束预测出来的车道线的形状。其中L_sim
为相似度损失,L_shp
为形状损失。
相似度损失的出发点是同一个车道中,相邻的两个点之间的距离应该尽可能的近,这里使用L1
范式来进行距离的约束。
形状损失的出发点是基于大多的的车道线都是直线,即使是曲线其大部分也是近似的直线。对于同一条车道线,在相邻row achor
上的车道线的候选点的位置的选择应该尽可能的相近。理想的状况下它的值应该为0
。
Loc
函数的含义是第i
条车道的第j
个row anchor
中车道点的期望。Prob
代表的是第i
条车道的第j
个row anchor
中,第k
个位置是车道点的概率。因为背景不被计算在内,因此k
的取值从1
开始。
性能
论文给出metric
结果如下所示,其评估硬件应该为NVIDIA GTX 1080TI
。该方法在保证精度接近的情况下,极大的提升了推理速度,很适合实时检测的任务。
为了测试其真实的推理性能,我在NVIDIA RTX 3070+CUDA11+Pytorch1.7
的环境性进行了测试。模型的backbone
为resnet18
,输入尺寸为(288, 800, 3)
的情况下,Ultra-Fast-Lane-Detection
的推理性能如下所示,单batch
推理速度约为350FPS
,其性能与论文给出的结果基本一致。
type | time | fps |
---|---|---|
average | 2.82ms | 354 |
slowest | 3.02ms | 331 |
fastest | 1.98ms | 503 |
网友评论