在前面的课程里,我们提到了感知模块内的计算机视觉和深度学习,这节课我们来讲一讲感知任务中的分类、跟踪、语义分割和Apollo感知相关的内容。
在驾驶过程中无人车会遇到许多障碍物,静态障碍物包括墙壁、树木、杆子、建筑物;动态障碍物包括行人、自行车和各种汽车,计算机首先要知道这些障碍物的位置,进而障碍物进行分类。
一、检测与分类
在行驶过程中无人车会探测到许多不同的物体,汽车根据所感知的物体类型来确定路径和速度。
如果感知到前方有一辆自行车,汽车可能会决定减速或变道,以便安全驶过自行车;但是,如果感知到前方是一辆汽车,并预测到前方车辆也将以接近限速的速度行驶,无人车可能会保持其速度与车道。当无人车前方出现交通信号灯时候,首先计算机视觉会对图像中的交通信号灯进行定位,进而根据交通信号灯显示的颜色对其进行分类。
那么,无人车是用什么算法来对障碍物进行检测和分类的?
首先,我们可以使用检测CNN来查找图像中对象的位置,在对图像中的对象进行定位后,我们将图像发送给另一个CNN进行分类;我们也可以使用单一CNN体系结构对对象进行检测和分类,此时通常的做法是在单个网络体系结构的末端附加几个不同的“头”,一个头可能执行检测,另一个则可能执行分类。
一个经典的体系结构为R-CNN及其变体FastR-CNN和FasterR-CNN,YOLO和SSD是具有类似形式的不同体系结构。
二、跟踪
在检测完对象后,我们要对检测到的对象进行追踪,进而我们需要知道:
追踪的意义是什么?如果我们对每个帧中的每个对象进行检测,并用边界框对每个对象进行标识,那么跨帧追踪对象会有什么好处?首先,追踪可以解决遮挡问题。如果在运行检测算法时,对象被其他对象遮挡了一部分,则检测算法可能会失败,所以追踪在检测失败时至关重要。
目标对象被遮挡后,检测算法可能会失败追踪可以解决目标对象被遮挡的问题
同时,追踪可以保留身份。障碍物检测的输出为包含对象的边界框,但是,对象没有与任何身份关联,单独使用对象检测时,计算机不知道一个帧中的哪些对象与下一个帧中的哪些对象相对应。该任务对人类来说很简单,但对汽车来说很困难。
没有身份关联时,计算机无法分辨每一帧通过追踪保留身份
追踪的第一步为确认身份。通过查找特征相似度最高的对象,我们将在之前的帧中检测到的所有对象,与当前的帧中检测到的对象进行匹配,对象具有各种特征,有些特征可能基于颜色,而另一些特征可能基于形状,计算机视觉算法可以计算出复杂的图像特征,如局部二值模式和方向梯度直方图。
我们也需要考虑连续视频帧中两个障碍物之间的位置和速度,由于两个帧之间的对象位置和速度没有太大变化,该信息也可以帮助我们快速找到匹配的对象,在确定身份后,我们可以使用对象的位置并结合预测算法,以估计其在下一个时间步的速度和位置,该预测可帮助我们识别下一帧中的相应对象。
根据两个帧对象的位置和速度确认身份
三、语义分割
语义分割涉及对图像每个像素进行分类,它用于尽可能详细地了解环境,并确定车辆可驾驶区域。语义分割依赖于一种特殊类型的CNN,它被称为全卷积网络或FCN,FCN用卷积层来代替传统CNN体系结构末端的平坦层。现在,网络中的每一层都是卷积层,因此其名称为“全卷积网络”。
FCN提供了可在原始输入图像之上叠加的逐像素输出,但我们必须考虑的一个复杂因素是大小。在典型的CNN中,经过多次卷积之后所产生的输出比原始输入图像小得多,然而,为了分割像素,输入尺寸必须与原始图像的尺寸相匹配。
为了达到该目的,我们可以对中间输出进行上采样处理,直到最终输出的大小与原始输出图像的大小相匹配。网络的前半部分通常被称为“编码器”,因为这部分网络对输入图像的特征进行了提取和编码。网络的后半部分通常被称为“解码器”,因为它对这些特征进行了解码,并将其应用于输出。
四、Apollo的感知算法
Apollo开放式软件栈可感知障碍物、交通信号灯和车道,对于三维对象检测,Apollo在高精度地图上使用感兴趣区域(ROI)来重点