1. 介绍
论文“Ultra Fast Structure aware Deep Lane Detection”发表于2020年8月,该论文提出了一种新颖、高效的车道线检测算法,旨在极大地提高检测效率(320 FPS with 1080 TI)以及克服极端场景(遮挡和过曝等因素导致的no visual clue)。
简单来说,作者将输入图片划分为若干行(利用神经网络提取全局特征,并不是粗暴切割),并在每一行定位车道线,最终得到整幅图的车道线位置。另外,该算法还根据车道线连续、多为直线的特点设计了一个结构化的损失函数。以上两点是该算法的主要创新。
2. 设计思想
作者用一句话概括该算法的设计:“row-based selecting method based on global image features”。如下图所示:图b是一般语义分割的设计模式。简单来说,对输入图像做一系列卷积后输出一个尺寸为W × H × C+1(图片宽、高、分类数)的特征矩阵,然后逐像素分类。
图a是该算法的设计模式:利用神经网络输出一个w+1 × h × C的特征图,可以简单的理解为:将原图划分为h行,每行再划分为w+1个网格,然后在每一行中选择一个格子作为车道线的一个点,将所有行累积起来就可以得到一条车道线,每层C预测一条车道线。
如上图橙色部分所示:Pi,j,:是一个(w+1)维的向量,代表第i条车道线在第j行的预测结果:哪个数值最大,其索引即为车道线位置,若最后一个最大,则该车道线在此行不存在。假设Ti,j,:为one-hot编码的真值,那么分类的损失函数可以表示为:
2.1 为什么快?
如上图所示,h << H 、w << W ,自然计算量要小很多。根据作者推算,该算法和一般的语义分割相比,计算量分别为1.7 × 104、1.15 × 106.
2.2 如何处理遮挡(no-visual-clue)
遮挡的地方没有车道线信息,所以必须利用其它区域信息进行预测,作者通过全局特征和结构化的损失函数来达到目的。全局特征包括车道形状、其它车道线甚至车头朝向,但是作者并没有说是怎么提取到这些信息的,个人认为这是作者想当然(神经网络解释性差的问题)。不过作者对结构化损失函数给出了比较合理的解释,简单来说在损失函数中体现出车道线的一些特点,后面会详细介绍。
3. 结构化损失函数
除了上面讲的分类函数,作者还应用了两个结构化损失函数,这里的结构指的就是车道线的特有结构:continuous and straight。
3.1 continuous
由于车道线甚至道路是连续的,所以Pi,j,:和Pi,j+1,:应该是相似的,所以有了如下损失函数:
3.2 straight
车道线多为直线,哪怕有一定的弯曲,在一个较小的范围以内(例如1米)也可以算作是直线。
首先我们要找到车道线在每一行的位置,最简单的办法是对Pi,j,:取最大值,但是这个函数是不可导的,作者用了一个很巧妙的方式:先用sofamax函数求出(1-w)每个点的概率,然后求索引的期望,把这个期望看做车道线的位置:
注意,现在利用的是车道线的特点,没必要考虑没有车道线的情况,所以每行的索引范围在(1-w)。
这样我们就得到了车道线在每行的位置(一个1-w的值),如何将其表示为一条直线?作者的做法是使其二阶差分为0:
结构化损失如下:
最后,作者在训练阶段还加入了分割分支,所以还有分割部分的损失。这个思路也有点新奇,作为辅助分支,在预测阶段弃用,更能节省侠侣。完整的损失函数如下,α 和 β应该是作为超参数根据实际情况调整。
4. 网络结构
作者就给了一张图,几乎没有讲网络结构,从代码来看,该网络确实和上图展示的一样比较简单,没有很特殊的结构:
- Res blocks部分为torch官方的resnet模型。
- 在下方的Main branch中resnet的输出直接碾平(view),然后做两次全连接,最后再reshape(view)到预设的尺寸(代码中是201×18×4,对应w+1×h×C),最后在这张特征图上预测上文提到的P。
- 在训练阶段增加了上方的Auxiliary branch,三个尺度的Res blocks叠加,然后卷积输出原图尺寸做像素级分割
总的来说,该算法并没有很复杂的网络结构,直观上看参数确实很少,resnet-18对应的模型仅173MB,在1080 TI上能达到320FPS。之所以能够取得这样的效果,要归功于逐行检测结合结构化损失的设计。
附:符号说明CuLane和Tusimple数据集对比