Apollo自动驾驶论坛②视觉感知技术在Apollo平台的应用

Apollo自动驾驶论坛②视觉感知技术在Apollo平台的应用

 

摄像头作为无人车系统中最重要的传感器之一,因为其信息丰富、观测距离远等特点,在障碍物检测和红绿灯检测等方向发挥着不可替代的作用,是对激光雷达感知结果的重要补充。但摄像头有着容易受环境影响、缺乏深度信息等缺点,给无人驾驶系统中的视觉感知算法带来了巨大的挑战。因此,如何建立一套高精确率和高稳定性的视觉感知算法,是无人车感知模块的核心问题。本文我们将讨论:

 

  • Apollo视觉感知算法模块

  • 红绿灯检测算法

  • 车道线检测算法

  • 基于单目相机的障碍物检测

 

 

  ENJOY THE FOLLOWING  

 

 

图片

 

自动驾驶中的视觉感知技术,主要依赖于摄像头传感器,在红绿灯检测、障碍物检测等方面有着广泛的应用,可以比较有效地感知摄像头范围内的一些物体。

 

图片

 

图示为Apollo视觉感知算法模块的流程图,主要描述了Apollo平台跟视觉相关的模块和流程。

 

视觉感知算法在Apollo平台上主要有3个应用场景,分别是红绿灯检测车道线检测基于摄像头的障碍物检测

 

每个模块又可以分为3部分,分别是图像的预处理、神经网络模型以及后处理。

 

  • 预处理:对上游信息做一些处理和整合,以方便把信息直接输入到模型中做预测。

     

  • 神经网络模型:主要涉及一些深度学习算法,包括目标检测、语义分割、图像分类等。

     

  • 后处理:从神经网络模型拿到输出后,会结合模型的输出、其他传感器的信号以及经验信息,利用一些传统的算法进一步优化网络模型的预测,这样可以使我们的检测结果能够适应一些比较复杂的路况,或者针对性地应对一些特殊的情形,让我们的算法可以在实车上跑得更加流畅。

 

具体流程:

 

  • 红绿灯检测:主要作用是检测当前路况下在摄像头的视觉范围内,红绿灯的状态。这是一个典型的目标检测任务:

    ○ 输入与输出:输入是相机拍摄的图像,输出是红绿灯的属性,也就是它的颜色信息和位置信息。

    ○ 神经网络模型:分成了两个部分:一是检测,二是对检测的结果做分类识别。我们的检测模型并不会直接输出灯的颜色信息,它的输出类别是三种形状,有横着的、竖着的和方形的,我们会根据不同的形状类别,针对性的用分类模型做具体的颜色识别。

    ○ 后处理:对我们的识别结果做优化和矫正。

     

  • 车道线检测:主要检测道路中车道线,可以对后面的路径规划、相机校准等提供有效的信息。

     

  • 摄像头障碍物检测:在自动驾驶中的障碍物检测,跟常见的目标检测不太一样,因为自动驾驶中的障碍物检测不只需要得到图像中的障碍物信息,也需要得到在相机坐标系下物体的真实信息,也就是它的3D信息。所以在图像检测结束后,需要做2D->3D的转换,得到障碍物的真实位置坐标。最终,视觉检测效果会跟其他传感器的障碍物检测结果做融合,输出最终的障碍物信息。

 

 

图片

 

 

红绿灯检测算法模块的整体流程,如图所示。

 

  • 预处理:输入信号的预处理。由于有多个摄像头、定位信息、高精地图以及标定结果。我们预处理的目的是有针对性地选择摄像头,选择一个需要处理的图像。我们还需要根据高精地图的结果,预先设定一个红绿灯的大致位置。解释下我们为什么用高清地图,因为正常来讲红绿灯在我们的图像中占的比例比较小,属于小目标检测问题,在有些情况下检测的召回率很难保证,比较容易出现这种漏检的情况。高清地图会预先提供红绿灯的大致位置,我们可以依赖高清地图给出的信息,预先在图像中选取ROI作为后面检测模型的输入,很大程度上提高了红绿灯在检测模型输入中所占的比例,有效的提高了检测结果,减少误检的情况。

     

  • 检测与识别:检测模型会接收预处理得到的输出,得到交通灯具体的位置边框以及行动属性,输入到分类模型,由分类模型识别具体的交通灯颜色。

     

  • 校正:主要对异常的识别数据做处理。

 

01

红绿灯检测预处理

 

图片

 

这张图可以比较直观的解释ROI区域的选取过程,从图中大家可以看到红绿灯占的比例是比较小的,想要比较准确的、完整的检测全部的红绿灯存在一定难度。图中蓝色的框是高精地图给出的红绿灯位置,在一些情况下,会有一些偏移,并不完全准确。为了避免这种偏移的情况,会对高精地图给出的位置信息做一定比例的扩展,也就是黄色的框。黄色框标识的区域就是输入到第二步检测模型的图像。

 

02

红绿灯检测模型

 

图片

 

模型检测:采用了一种常规的基于CNN的目标检测算法,模型接收的就是刚刚选取的ROI区域,它的输出是红绿灯的边框以及红绿灯的类别。这里我们用了一种two-stage的方法,因为红绿灯检测对于检测速度没有太高的要求,红绿灯一般不会在短时间内发生比较频繁的跳变,two-stage方法一般会比one-stage有比较好的检测效果。

 

整体上,检测模型可以分为三个部分:

 

Backbone:提取图像特征。

RPN head:提取区域。

ROI head:ROI分类器,得到每个区域的类别。

 

我们的优化,也主要是根据这几部分进行展开的。

 

图片

 

简单说下在做模型时,主要的优化过程和优化方法:

 

POI pooling:一般来讲网络越深(我们在网络上会加大量的卷积、池化等),它具有的平移旋转不变性会越强。这个性质在我们做分类时,可以有效地提高对分类的鲁棒性,因为在分类时,并不关心物体是否翻转、旋转等。但在检测时,由于需要对物体定位,通过模型需要得到物体具体的位置信息,所以需要模型对位置有比较好的感知能力。如果模型过深,平移旋转不变性太强,会削弱模型的感知能力。有文章指出,太深的Backbone检测框架存在一个明显的缺陷:检测器对物体的位置信息敏感度下降,检测的准确度就会降低,所以就有文章提出了这种位置敏感性的ROI pooling。

 

如 (a) 图所示,feature map是k2(C+1),k是POI得到的方框长度,C是类别数。主要思想是在特征聚集时,人工引入位置信息,每C+1个feature map可以代表输出的ROI map的位置,可以有效地改善神经网络对位置信息的敏感程度。这种改进虽然可以实现对ROI的batch提取,有效地减少运行时间。但是feature map通道数是k2(C+1),如果C比较多,会比较费显存。一个显卡需要跑多个算法,所以对显存要求比较高。因此借鉴了Light-Head R-CNN中比较简单的做法,减少位置敏感ROI pooling中的通道数,加上了一个全链接层,做分类得到类别信息和位置信息。

 

03

红绿灯识别和矫正

 

图片

 

检测完成后,需要对红绿灯的颜色做识别。训练了3个轻量级的卷积神经网络做分类,这3个网络分别对应检测结果的3个类别,竖着的、横着的和方形的。左图是检测模型输出的3个结果。我们对它做不同的缩放,输入到不同的分类网络中,得到四维向量,对应4种类别出现的概率。

 

最后会有一个矫正器,因为红绿灯可能会出现闪烁或者阴影的情况,这种分类算法并不能保证识别结果完全正确,也就是说当前检测的状态可能不能代表真实的状态。所以需要一个矫正系统对它做矫正。假如检测出来的是黑色或者置信度不高,不能确定到底是什么颜色,这时矫正器就会查找前几帧的检测状态,假如说前面的状态是一直保持稳定的,比如一直是绿色,那么当前的黑色或者不确定的状态,就可以置为绿色。另外由于时间顺序的关系,比如黄色只能在绿色之后或红色之前,为了保证行车安全,把红色之后的黄色都视为红色,直到检测出绿色。

 

这就是整个红绿灯检测的流程,从预处理到检测网络再到分类网络以及最后的矫正,输出的就是当前视觉下,检测出来的红绿灯以及红绿灯的具体颜色。

 

 

图片

 

将车道线检测看作分割问题,然后在图像中去找在语义上车道线存在位置的检测。语义上是指:照片可能是模糊的,很多被光照影响的,或者说被遮挡的,或者说这种断断续续的不连续的消失的,都需要把它车道线给检测出来。

 

图片

 

车道线检测的网络结构,如图所示。它的主干是一个编码、解码的分割网络,用来输出分割网络的结果。在红线指的encoder编码器的末端,加了一个小的分支网络,用来检测消失点,如左上角表示的,有一部分虽然没有车道钱、不连续,但这是一整条的车道线。这里的分支网络是由卷积层和全连接层组成的,卷积层为消失点任务转换操作特征,全连接层对整个图像进行全局汇总,输出消失点的位置dx, dy。dx, dy指的是消失点,对图像中心点的偏差距离。并没有直接预测x, y,而是预测偏移项,这样网络学起来会比较容易。

 

在训练时,预先训练整个大的Encoder、Decoder分割网络,然后固定Encoder网络,再单独训小的分支网络,最终Encoder是共享的,整个数据是端到端的,输出的是feature map和消失点的dx, dy,就可以得到最终的车道线检测结果。

 

图片

 

这是检测网络的检测结果示意图。从图中可以看到,在正常情况下、车道线不连续的情况下以及转弯情况下,都可以对车道线做出比较有效的检测。

 

 

图片

 

障碍物检测是无人车感知的一个核心问题,要求针对相机传感器准确的检测出障碍物。物体检测要求实时、准确,而且要求是单帧检测。因为不会拿到3D信息,所以要求单帧检测,并且最后需要借助传感器内外参数,把检测结果统一映射到车身坐标系或者实际坐标系,这是障碍物检测的基本要求。

 

图片

 

目标检测的算法有很多,这里列举了一些比较经典的:DPM、Mask-RCNN、YOLO、Centernet等。

 

图片

 

前面提到的算法都是基于2D的目标检算法,那么检测结果如何映射到3D坐标系中?

 

首先简单说下3D相机坐标和2D图像坐标的关系,也就是真实场景下的位置如何映射到图像中。可以以相机成像的原理来简单解释下,种针孔相机通过投影变换,可以把三维相机坐标系下的坐标转换到二维图像坐标。相机内参:

 

图片

 

可以通过公式

 

图片

 

表示相机内在的转换关系,x, y, z是在相机三维坐标系下的坐标,, 是对应图像上的坐标。有了这个公式,可以把任意物体投影到图像中。

 

右图就是采用这个方法画的,知道当前车辆在3D坐标系下的边框,也就是8个点坐标,就可以通过相机内参,把它映射回图像坐标系,画出2D坐标系下的伪3D框。

 

图片

 

刚刚说的是3D到2D的方法,比较简单,只需要知道K和每个点的坐标就可以了。但是怎么从2D转换到3D呢?理论上,可以对刚刚的公式,左右同乘,得到新的公式:

 

图片

 

如果知道, 在图像坐标系下8个点的坐标,8个点分别对应的深度z,我们就可以通过公式得到目标在相机坐标系下的真实坐标x, y, z。所以这个问题可以简化成:如果能在图像中预测这8个点,还能得到这8个点的深度,就可以得到目标在真实情况下3D的位置。但是需要用24个约束(点)表示3D边框是比较冗余的,有很多关系是线性的。比如2D边框,一般不会用左图中的4个点的坐标表示2D边框,只需要用两个点或者用中心点和长宽就可以了。

 

对于3D信息也一样,可以选择这几个信息:比如说物体的大小,物体的位置,以及物体的角度。为了简化这个问题,可以假设3D障碍物只沿着垂直地面的坐标系有这种旋转关系,另外两个方向都没有旋转,最终的3D边框可以用7个变量来表示,也就是物体的长宽高,物体的位置x, y, z以及物体的旋转角度θ。

 

这样看,2D检测跟3D检测有什么关系?2D检测输出的是类别、目标的中心点和边框大小。3D检测输出的是类别、物体的真实大小长宽高、物体的位置x, y, z以及物体角度θ。这样就可以建立2D检测跟3D检测的关系。

 

图片

 

有了前面的解释说明,可以对障碍物检测做简单的描述:

 

首先需要确定它的输入输出,它的输入跟2D一样,是RGB图像。因为单目相机只能拿到2D图像。这里假设内参K是已知的,不考虑怎么求内参,它的输出是物体的类别和3D边框,3D边框可以通过下面的7个点来进行编码,也就是物体的长宽高,物体的中心点坐标以及物体的偏航角。

 

图片

 

明确了网络的输入输出,就可以设计网络的结构,如图所示。首先接收到一张普通的图像作为输入,没有其他的输入。然后用Backbone提取图像的特征,后面可以接上检测模块,用哪种检测模型可以根据需要选择,可以选择YOLO、Centernet等。共同点是为了输出需要的3D信息,需要在最后多加上一些detector head,因为标准的yolo输出有只有2D的中心点和边框,需要加上一些3D的形状信息,站内的中心点,还有角度,需要多加一些head对这些信息进行预测,同时针对不同的head,也需要专门设计loss,对它进行约束和优化。比如分类,可以用交叉熵损失函数,或者用focal loss都可以。对于形状、角度等信息,可以用L1或者L2损失都可以。最终,拿到模型的输出之后,可以做一些转换,把它映射到3D空间中。

 

图片

 

前面通过模型可以得到障碍物的3D信息,长宽高、角度等。然后可以根据这些信息求3D边框,因为最终目的是得到它在相机坐标系下的立方体边框。

 

图片

 

首先可以根据目标的中心点,还有它的深度z,可以求出x, y, z,也就是说图像中红色的点就是在真实相机坐标线下的中心点。然后需要根据它的偏转θ,求出矩阵。最后可以根据它的长宽高,还有它的中心点,包括θ矩阵,计算出真正的在相机坐标系下的位置信息,也就是8个红色的点。这样我们整个的检测,所有需要的信息都可以进行集合汇总,然后得到真正的3D障碍物的类别和边框。

 

做障碍物检测时需要注意的点和能进行优化的地方:在之前的障碍物检测算法中,可能很多人习惯用2D的边框中心点当做3D中心点用。也就是说,在做第一步时,很多人习惯直接拿2D边框的,但这样是不太合理的,或者不太准确的。从图中可以看到橘色的点和红色的点,一个是2D的边框的中心点,一个是3D中心点映射到图像中的点,是有一定偏移的。所以,即使其他的一些信息,比如角度、距离比较准,但如果中心点不准,它的边框还是会有一些偏移的。

 

这里,建议在预测时,直接预测3D中心点,比如用一些检测的方法,直接用这3D的中心点作为标准,而不是用2D中心点。在预测长宽高时,因为长宽高,有着很强的先验信息,不同类别物体的长宽高,他们中间的方差是很小的,比如车跟车之间、人跟人之间。所以我们在训练时,可以不直接预测长宽高的真实值,可以预设一组长宽高H、W和L。在做3D重建时,根据的类别,根据网络预测的偏差向再去求真实的长宽高。这样做有两个好处:一是刚刚提到相同类别之间的方差比较小,模型学起来会比较简单,它不用去关注物体是人还是车,只需要学习网络偏差量就可以了,学起来比较简单。二是在类别预测正确的前提下,物理的尺寸不会偏差太大,也就是说只要物体类别预测对了,结果也不会太差,因为存在基本的先验约束,可以比较好地提高网络的最终预测结果。

 

最后是优化:因为直接在2D的图像中预测这种3D信息,特别是这种具体深度信息,这是比较困难的。但是通常在这种图像坐标系下的检测是比较准的,比如说检测的边框,检测的关键点,所以可以把模型输出的图像视觉作为观测值,然后障碍物空间的位置朝向还有尺寸作为一个未知的参数,比如这个公式中表示的RTD就是网络预测的位置、角度信息,KP就是图像视觉特征。在这儿可以选关键点,比如说我在图像中去检测它的8个关键点,预测的3D信息RTD可以作为公式的初值。根据通用关系,就可以建立一个目标函数,然后用函数求目标函数的最小值,优化模型预测的3D结果。通过LM和高斯牛顿方法都可以对公式进行优化。因为我们预先提供了一个RTD初值,所以最终的优化结果也会比较好,速度也会比较快。

 

图片

 

上图是在Apollo平台上视觉障碍物检测的结果,这辆车上有两个摄像头,是6mm和12mm的,右边是根据检测结果做出来的俯视图,从图中可以看到一些近处/远处的障碍物,可以在不同的光照情况下,对障碍物做出比较理想的检测结果。

 

以上就是分享的全部内容啦,如果大家对Apollo或者开发套件感兴趣,可以关注添加Apollo小哥哥(微信号:apollo_xzs)为好友,进入技术交流群,跟开发者们一起讨论哦。

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Apollo感知算法是一个高精度的自动驾驶系统,它可以在不同的场景下感知和理解道路、车辆和行人等对象。该算法使用深度学习和计算机视觉技术来提供准确而实时的感知能力。在道路场景,该算法可以通过多种传感设备,如毫米波雷达、激光雷达和摄像头来捕捉周围环境的信息。然后,它将使用感知数据生成高精度地图,以便自动驾驶车辆能够在路上行驶。 此外,Apollo感知算法还可以分辨不同的道路标识和交通信号,以便自动驾驶车辆能够对不同的现场情况做出相应的反应。在一些复杂的场景下,例如路口、交通拥堵、晚上和恶劣天气等,该算法仍能准确地感知周围环境的物体和情况。它可以根据各种数据,如光照、车辆速度、行人动作等,对场景进行分析,并做出相应的决策,以确保车辆的安全行驶。 总之,Apollo感知算法是自动驾驶技术不可或缺的一部分。它具有高精度、实时性和适应性等特点,可以适应不同的路况和天气条件,从而提高自动驾驶车辆的安全性和舒适性。未来,该算法还将不断发展和完善,成为更加智能和可靠的自动驾驶系统的重要组成部分。 ### 回答2: Apollo感知算法是一种基于激光雷达、摄像头和雷达等传感器的云端智能驾驶平台,是为自动驾驶汽车开发的一种感知算法。其目的是在高速公路和城市道路等不同道路环境实现精确的环境感知和目标识别,为无人驾驶汽车提供可靠的决策和控制支持。 Apollo感知算法采用了多种算法技术,如点云处理、物体跟踪、深度学习等方法,从而实现了高精度和高可靠性的目标检测和识别。其包括了对行人、车辆、路标、交通信号灯等的感知识别,并对其进行精准跟踪和预测,为车辆提供足够的决策时间和空间,以确保行车安全。 此外,Apollo还采用了实时定位和地图构建技术,采用高精度地图数据实现了实时车辆定位,提高了车辆运行的精度和安全性。同时,Apollo感知算法还具有可拓展性和灵活性,可以在不同的地理环境和道路条件下进行不断的优化和升级。 总之,Apollo感知算法是一种极具创新性和前瞻性的自动驾驶技术,可以有效解决因交通堵塞、疲劳驾驶等导致的交通事故问题,同时也具有重要的商业应用前景。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值