作者:cfzd|
本文仅做学术分享,如有侵权,请联系删除。
很高兴和大家分享一下我们刚刚被 ECCV 2020 接收的新工作:一种超快速的车道线检测算法(https://link.zhihu.com/?target=https%3A//arxiv.org/abs/2004.11757),能够达到SOTA水平的性能,同时保持超高的检测速度。轻量级的版本可以在接近SOTA的性能情况下达到300+FPS的检测速度,代码和模型已开源(https://link.zhihu.com/?target=https%3A//github.com/cfzd/Ultra-Fast-Lane-Detection)。
前言
车道线检测是自动驾驶中的一个基础模块,其实也是一个由来已久的任务,早期已有很多基于传统图像处理实现的车道线检测算法。但随着大家研究的深入,车道线检测任务所应对的场景越来越多样化,逐步已经脱离了对于“白、黄色线条”这种低阶理解。目前更多的方式是寻求对于 语义上 车道线存在位置的检测,即使它是模糊的、被光照影响的、甚至是完全被遮挡的,如下图所示。
图1 目前车道线检测的难点为寻找语义上的线,而不是局限于表观存在的线
对于上图这类问题,基于传统图像处理的方法几乎无法实现检测,因此有了一些方法开始尝试一种最直接的深度学习方案——把车道线检测视为分割任务。虽然深度分割方法效果强于传统方法,但存在两个关键问题
- 速度慢
因为分割是逐像素分类的,要对图像中每一个像素点进行分类。为了分割车道线要进行非常密集的计算,导致的结果就是速度比较慢。其实车道线像素其实只占图像很少一部分,想想也不需要进行这么舍本逐末的操作。
- 局部感受野
分割的另一个问题是感受野问题。因为分割一般是全卷积得到分割结果,而卷积基本上是比较局部的,所以每个像素的感受野有限。在其他分割问题中可能问题不大,但在车道线检测中,问题就很大了。由于我们关注的问题大多是上图这种语义线的检测,需要对全局有很好的感知才能实现良好的定位。比如在图1中,对于车道线的定位只有靠周围车流走向这种全局信息才能很好地定位。
虽然有些很好的工作,比如SCNN使用不同方向上的特征传播实现信息传递,间接完成了增大感受野,增加全局信息的目标,但是速度更慢了。
其实直观感受来说,做车道线检测没必要这么大动干戈把每个像素都进行分类。基于此,我们的方法遵循着一个非常简单的动机:有没有更简单的方式建模车道线检测?
方法介绍
为了更简单地建模车道线,也为了解决上述两个分割方法存在的问题,我们提出了一个全新的车道线检测定义:将车道线检测定义为寻找车道线在图像中某些行的位置的集合,即基于行方向上的位置选择、分类(row-based classification),如下图所示。
图2 将车道线检测定义为在某些行上位置的选择、分类
假设我们要检测一条车道线的图像大小为HxW,对于分割问题,我们需要处理HxW个分类问题。
由于我们的方案是行向选择,假设我们在h个行上做选择,我们只需要处理h个行上的分类问题,只不过每行上的分类问题是W维的。因此这样就把原来HxW个分类问题简化为了只需要h个分类问题,而且由于在哪些行上进行定位是可以人为设定的,因此h的大小可以按需设置,但一般h都是远小于图像高度H的。
这样,我们就把分类数目从HxW直接缩减到了h,并且h远小于H,更不用说h远小于HxW了。因此我们的方法将计算复杂度缩减到了一个极小的范围内,解决了分割速度慢的问题,极大地提速的了车道线检测算法的速度,这也是我们方法能够达到300+FPS的原因。下图展示了我们方法和基于分割的车道线检测方法的比较。
图3 和传统分类方法的比较。我们的方法直接做行方向上的选择,而不是逐像素分割。
除了速度快之外,我们的方法还可以解决上文提到的另一个问题:局部感受野小导致的复杂车道线检测困难问题。由于我们的方法不是分割的全卷积形式,是一般的基于全连接层的分类,它所使用的特征是全局特征。这样就直接解决了感受野的问题,对于我们的方法,在检测某一行的车道线位置时,感受野就是全图大小。因此也不需要复杂的信息传递机制就可以实现很好的效果。
除此之外,由于有了水平行方向上直接的位置信息,我们还可以使用这些信息来加入车道线的先验约束——平滑性和刚性。
我们将相邻行上分类的L1范数定义为平滑性,希望车道线位置在相邻行上是相近且平滑变化的。
将相邻行间的二阶差分定义为车道线的形状。由于车道线大多是直线,因此其二阶差分为0,所以约束其二阶差分与0的差异可以在优化过程中使得预测出的车道线更直。
具体公式符号定义请见我们的文章。
由于分割方法得到的为车道线的二值分割图,其结构是逐像素建模,因此几乎无法实现对上述高层语义(平滑、刚性)层级的约束,这也是我们方法的另一个优点。
实验结果
我们在Tusimple和CULane上都进行了测试,都验证了我们的方法可以在超快速度下达到接近或超越SOTA方法的性能。
Tusimple数据集结果
可以看到在Tusimple数据集上我们的方法比SCNN快了41.7倍,比SOTA的SAD也快了4倍。但是Tusimple数据集上大家性能也比较饱和了,没有达到SOTA的水平。
CULane数据集结果
在另一个更为挑战性的CULane数据集上,我们的方法同时达到了最快的速度和最好的精度。SOTA性能的模型能跑到175帧,轻量级的模型甚至可以跑到322帧。
这个速度是我们在GTX 1080Ti上测的,在20系或者Tesla显卡上应该速度会更快。但已经这么快了,还要啥自行车 : )
目前代码和模型都已开源,希望大家多多指教!
下载地址:https://github.com/cfzd/Ultra-Fast-Lane-Detection