本文针对自动驾驶行业的视觉感知做简要介绍,从传感器端的对比,到数据的采集标注,进而对感知算法进行分析,给出各个模块的难点和解决方案,最后介绍感知模块的主流框架设计。
视觉感知系统主要以摄像头作为传感器输入,经过一系列的计算和处理,对自车周围的环境信息做精确感知。目的在于为融合模块提供准确丰富的信息,包括被检测物体的类别、距离信息、速度信息、朝向信息,同时也能够给出抽象层面的语义信息。所以道路交通的感知功能主要包括以下三个方面:
动态目标检测(车辆、行人和非机动车)
静态物体识别(交通标志和红绿灯)
可行驶区域的分割(道路区域和车道线)
这三类任务如果通过一个深度神经网络的前向传播完成,不仅可以提高系统的检测速度,减少计算参数,而且可以通过增加主干网络的层数的方式提高检测和分割精度。如下图所示:可以将视觉感知任务分解成目标检测、图像分割、目标测量、图像分类等。
▍传感器组件
前视线性相机
视角较小,一般采用52°左右的相机模组安装于车辆前挡风玻璃中间,主要用来感知车辆前方较远的场景,感知距离一般为120米以内。
周视广角相机
视场角相对较大,一般采用6颗100°左右的相机模组安装在车辆周围一圈,主要用来感知360°的周身环境(安装方案与特斯拉大同小异)。广角相机存在一定的畸变现象,如下图所示:
环视鱼眼相机
环视鱼眼相机视角较大,可以达到180°以上,对近距离的感知较好,通常用于APA,AVP等泊车场景,安装于车辆左右后视镜下方以及前后车牌下方等4个位置做图像的拼接、车位检测、可视化等功能。
▍相机标定
相机标定的好坏直接影响目标测距的精度,主要包括内参标定和外参标定。
内参标定用于做图像的畸变校正,外参标定用于统一多个传感器的坐标系,将各自的坐标原点移动到车辆后轴中心处。
最耳熟能详的标定方法就是张正友的棋盘格方法,在实验室里一般会做一个棋盘格板子标定相机,如下图:
出厂标定
但是自动驾驶做前装量产,由于批量生产的缘故,无法一辆辆使用标定板做标定,而是构建一个场地用于车辆出厂时标定,如下图所示:
在线标定
另外考虑到车辆运行一段时间或者在颠簸的过程中摄像头位置的偏移,感知系统中也有在线标定的模型,常利用消失点或车道线等检测得到的信息实时更新俯仰角的变化。
▍数据标注
自然道路场景存在各种各样的突发状况,所以需要采集大量的实车数据用来训练。高质量的数据标注成了一件至关重要的工作,其中感知系统需要检测的全部信息均需要进行标注。标注形式包括目标级标注和像素级标注:
目标级标注如下图:
像素级标注如下图:
由于感知系统中的检测和分割任务常采用深度学习的方式实现,而深度学习是一项数据驱动的技术,所以需要大量的数据和标注信息进行迭代。为了提高标注的效率,可以采用半自动的标注方式,通过在标注工具中嵌入一个神经网络用于提供一份初始标注,然后人工修正,并且在一段时间后加载新增数据和标签进行迭代循环。
▍功能划分
视觉感知可以分为多个功能模块,如目标检测跟踪、目标测量、可通行区域、车道线检测、静态物体检测等。
目标检测跟踪
对车辆(轿车、卡车、电动车、自行车)、行人等动态物体的识别,输出被检测物的类别和3D信息并对帧间信息做匹配,确保检测框输出的稳定和预测物体的运行轨迹。神经网络直接做3D回归准确度不高,通常会对车辆拆分成车头,车身,车尾,轮胎多个部位的检测拼成3D框。
目标检测难点: 遮挡情况较多,朝向角准确性问题 行人车辆类型种类较多,容易误检 多目标追踪,ID切换的问题;
对于视觉目标检测,在恶劣天气环境下,感知性能会有一定的下降;在夜晚灯光昏暗时,容易出现漏检的问题。如果结合激光雷达的结果进行融合,对于目标的召回率会大幅提高。
目标检测方案:
多目标的检测尤其是车辆的检测,需要给出车辆的3D Bounding Box,3D的好处在于能给出车的一个朝向角信息,以及车的高度信息。通过加入多目标跟踪算法,给车辆及行人对应的ID号。
深度学习作为一种概率形式的算法,即使提取特征能力强大,也不能覆盖掉所有的动态物体特征。在工程开发中可以依据现实场景增加一些几何约束条件(如汽车的长宽比例固定,卡车的长宽比例固定,车辆的距离不可能突变,行人的高度有限等)。
增加几何约束的好处是提高检测率,降低误检率,如轿车不可能误检为卡车。可以训练一个3D检测模型(或者2.5D模型)再配合后端多目标追踪优化以及基于单目视觉几何的测距方法完成功能模块。
目标测量
目标测量包括测量目标的横纵向距离,横纵向速度等信息。根据目标检测跟踪的输出借助地面等先验知识从2D的平面图像计算车辆等动态障碍物的距离信息、速度信息等或者通过NN网络直接回归出现世界坐标系中的物体位置。如下图所示:
单目测量难点:
如何从缺乏深度信息的单目系统中计算出 方向上的物体距离。那么我们需要弄清楚以下几个问题:
有什么样的需求
有什么样的先验
有什么样的地图
需要做到什么样的精度
能够提供什么样的精力
如果大量依赖模式识别技术来弥补深度的不足。那么模式识别是否足够健壮能满足串行生产产品的严格检测精度要求?
单目测量方案:
其一,就是通过光学几何模型(即小孔成像模型)建立测试对象世界坐标与图像像素坐标间的几何关系,结合摄像头内、外参的标定结果,便可以得到与前方车辆或障碍物间的距离;
其二,就是在通过采集的图像样本,直接回归得到图像像素坐标与车距间的函数关系,这种方法缺少必要的理论支撑,是纯粹的数据拟合方法,因此受限于拟合参数的提取精度,鲁棒性相对较差。
可通行区域
对车辆行驶的可行驶区域进行划分主要是对车辆、普通路边沿、侧石边沿、没有障碍物可见的边界、未知边界进行划分,最后输出自车可以通行的安全区域。
道路分割难点:
复杂环境场景时,边界形状复杂多样,导致泛化难度较大。不同于其它的检测有明确的检测类型(如车辆、行人、交通灯),通行空间需要把本车的行驶安全区域划分出来,需要对凡是影响本车前行的障碍物边界全部划分出来,如平常不常见的水马、锥桶、坑洼路面、非水泥路面、绿化带、花砖型路面边界、十字路口、T字路口等进行划分。
标定参数校正;在车辆加减速、路面颠簸、上下坡道时,会导致相机俯仰角发生变化,原有的相机标定参数不再准确,投影到世界坐标系后会出现较大的测距误差,通行空间边界会出现收缩或开放的问题。
边界点的取点策略和后处理;通行空间考虑更多的是边缘处,所以边缘处的毛刺,抖动需要进行滤波处理,使边缘处更平滑。障碍物侧面边界点易被错误投影到世界坐标系,导致前车隔壁可通行的车道被认定为不可通行区域,
道路分割方案:
其一,相机标定(若能在线标定最好,精度可能会打折扣),若不能实现实时在线标定功能,增加读取车辆的IMU信息,利用车辆IMU信息获得的俯仰角自适应地调整标定参数;
其二,选取轻量级合适的语义分割网络,对需要分割的类别打标签,场景覆盖尽可能的广;使用极坐标的取点方式进行描点,并采用滤波算法平滑后处理边缘点。
车道线检测
车道线检测包括对各类单侧/双侧车道线、实线、虚线、双线检测,线型的颜色(白色/黄色/蓝色)和特殊的车道线(汇流线、减速线等)检测。如下图所示:
车道线检测难点:
线型种类多,不规则路面检测车道线难度大;如遇地面积水、无效标识、修补路面、阴影情况下的车道线容易误检、漏检。
上下坡、颠簸路面,车辆启停时,容易拟合出梯形、倒梯形的车道线。
弯曲的车道线、远端的车道线、环岛的车道线,车道线的拟合难度较大,检测结果易闪烁;
车道线检测方案:
其一,传统的图像处理算法需经过摄像头的畸变校正,对每帧图片做透视变换,将相机拍摄的照片转到鸟瞰图视角,再通过特征算子或颜色空间来提取车道线的特征点,使用直方图、滑动窗口来做车道线曲线的拟合,传统算法最大的弊端在于场景的适应性不好。
其二,采用神经网络的方法进行车道线的检测跟通行空间检测类似,选取合适的轻量级网络,打好标签;车道线的难点在于车道线的拟合(三次方程、四次方程),所以在后处理上可以结合车辆信息(速度、加速度、转向)和传感器信息做航位推算,尽可能的使车道线拟合结果更佳。
静态物体检测
静态物体检测包括对交通红绿灯、交通标志牌等静态目标的检测识别。
静态物体检测难点:
红绿灯、交通标识属于小物体检测,在图像中所占的像素比极少,尤其远距离的路口,识别难度更大。在强光照的情况下,人眼都难以辨别,而停在路口的斑马线前的汽车,需要对红绿灯进行正确的识别才能做下一步的判断。
交通标识种类众多,采集到的数据易出现数量不均匀的情况。
交通灯易受光照的影响,在不同光照条件下颜色难以区分(红灯与黄灯),且到夜晚时,红灯与路灯、商店的灯颜色相近,易造成误检;
静态物检测方案:
通过感知去识别红绿灯,效果一般,适应性差,条件允许的话(如固定园区限定场景),可以借助V2X/高精地图等信息。多个备份冗余,V2X > 高精度地图 > 感知识别。若碰上GPS信号弱的时候,可以根据感知识别的结果做预测,但是大部分情况下,V2X足以覆盖掉很多场景。
▍共性问题
虽然感知子任务的实现是相互独立的,但是它们之间上下游的依赖关系以及算法共性问题:
真值来源
定义,校准,分析比对,绝不是看检测结果图或帧率,需要以激光的数据或者RTK的数据作为真值来验证测距结果在不同工况(白天、雨天、遮挡等情况下)的准确性;
资源消耗
多个网络共存,多个相机共用都是要消耗cpu、gpu资源的,如何处理好这些网络的分配,多个网络的前向推理可能共用一些卷积层,能否复用;引入线程、进程的思想来处理各个模块,更高效的处理协调各个功能块;在多相机读取这一块,做到多目输入的同时不损失帧率,在相机码流的编解码上做些工作。
多目融合
一般在汽车上会配备4个(前、后、左、右)四个相机,对于同一物体从汽车的后方移动到前方,即后视相机可以看到,再移至侧视相机能看到,最后移至前视相机能看到,在这个过程中,物体的id应保持不变(同一个物体,不因相机观测的变化而改变)、距离信息跳变不宜过大(切换到不同相机,给出的距离偏差不宜太大,)
场景定义
针对不同的感知模块,需要对数据集即场景定义做明确的划分,这样在做算法验证的时候针对性更强;如对于动态物体检测,可以划分车辆静止时的检测场景和车辆运动时的场景。对于交通灯的检测,可以进一步细分为左转红绿灯场景、直行红绿灯、掉头红绿灯等特定场景。公用数据集与专有数据集的验证。
▍模块架构
目前开源的感知框架Apollo和Autoware,不少研究人员或者中小公司的感知系统开发会借鉴其中的思想,所以在这里介绍一下Apollo感知系统的模块组成。
相机输入-->图像的预处理-->神经网络-->多个分支(红绿灯识别、车道线识别、2D物体识别转3D)-->后处理-->输出结果(输出物体类型、距离、速度代表被检测物的朝向)
即输入摄像头的数据,以每帧信息为基础进行检测、分类、分割等计算,最后利用多帧信息进行多目标跟踪,输出相关结果。整个感知流程图如下:
上述核心环节仍是神经网络算法,它的精度、速度、硬件资源利用率都是需要衡量考虑的指标,哪一个环节做好都不容易,物体检测最容易误检或漏检、车道线检测拟合4次方程曲线不容易、红绿灯这类小物体检测难度大(现有路口长度动则50米以上),通行空间的边界点要求高。