在我们驾驶车辆的时候,我们通过眼睛来判断车辆的速度、车道位置以及转弯的位置。在无人驾驶中,我们使用摄像头和传感器来作为眼睛感知周围的环境,这个过程中会使用大量的计算机视觉的技术,这计算机视觉中最广泛使用的方法就是CNN,即卷积神经网络,接下来我们就来了解一下无人驾驶的眼睛吧。
1.计算机视觉
1.1 简述
人类可以通过观察直接看到周围世界中的物体,我们可以轻易判断这些物体之间的关系,比如你看到两个小朋友在互相追逐,但是对于计算机而言,图像本质上其实只是红色、绿色、蓝色组成的,这就是我们了解的RGB三原色,如何将这三种颜色的集合解读成有意义的内容这就是计算机视觉需要处理的问题。对于无人驾驶而言,感知世界有四个核心的目的:
- 检测(Detection):检测的目的是找出物体在环境中的位置。
- 分类(Classification):分类的目的是明确对象是什么。
- 跟踪(Tracking):跟踪是指随着时间推移观察移动物体。
- 语义分割(Segmentation):语义分割是指将图像中的每个像素与语义类别进行匹配,例如道路、汽车、天空等。
1.2 分类(Classification)
我们这里用分类来作为例子,讲述计算机视觉的应用,以此来了解计算机视觉。了解分类先要了解图像分类器,所谓图像分类器,其实就是一种将图像作为输入,然后输出标识该图像的标签或类别的算法。例如交通标志分类器看到交通标志并识别出它是停车标志、让路标志、限速标志或是其他类型的标志。分类器除了识别静态标志,也可以识别行为,比如一个人是在走路,还是在跑步。分类器有很多种,但他们的识别步骤其实都是类似的:
Step 1:输入(Input Data) 计算机接收类似摄像头等成像设备的输入,输入内容通常是图像或一系列的图像。
Step 2:预处理(Pre-processing) 预处理对每个图像进行了标准化处理,常见的预处理步骤包括调整图像大小或旋转图像,或者将图像从一个色彩空间转换为另一个色彩空间,例如从全彩到灰度。预处理可以帮我模型更快的处理图像和学习图像。
Step 3:特征提取(Feature) 特征有助于计算机理解图像,例如将汽车与自行车区分开来的一些特征,汽车一般体积更大,有四个轮子,形状和车轮就是汽车与自行车相比最显著的特征。特征提取就是提取图片中的物体的特征。
Step 4:分类模型(Classification Model) 最后将这些特征输入到分类模型中,这个过程使用特征来选择图像类别,例如分类器可以确定图像是否包含汽车、自行车、行人或者根本不包含这些物体。
通常大部分的计算机视觉的分类都是经过这个流程来实现的,区别就在于每个环节所使用的工具和能力不同。
2.摄像头图像
摄像头图像是最常见的计算机视觉数据,对于人类而言,图片就是图片,但是对于计算机而言,其实图片只是一个二维的网格,也被称为矩阵。矩阵中每个单元格都包含一个值,这里难以理解的话可以参考《实时视频带宽的计算方式》,这篇文章中讲了图像、像素点以及像素点的构成。这些每一个像素点的数值就构成了图像矩阵。在图像矩阵中,这些数字网格是许多图像处理技术的基础。大多数颜色和形状转换都只是通过对图像进行数学运算以及逐一像素进行更改来完成的,后面我们会逐步介绍计算机如何去识别图片的内容。
3.LIDAR图像
除了摄像头之外,雷达也是非常常见的感知传感器,激光雷达可以创建周围环境的点云表征,提供了摄像头难以提供的一些信息,例如距离和高度。激光雷达传感器使用激光来测量自身与环境中的物体之间的距离,激光雷达发射激光脉冲,激光投射到物体上,然后反射回传感器,这时可以记录下所花费的时间,同样就能推算出物体距离传感器的距离,激光雷达就是这样来构建环境的视觉表征。下面这张图就是一个激光雷达感知数据的可视化展示:
中间黑色的块区是无人车本身占据的空间,蓝色的线就是激光照射的物体,这种图我们通常称为点云图,当然可以理解,点云密度越大,对于物体的描述会越清晰。点云中的每个点代表反射回传感器的激光束,这些点可以告诉我们很多关于物体的信息,比如物体的形状和表面的纹理,这些数据提供了足够的对象检测、跟踪或分类信息,可以理解,激光雷达更多的提供了周围环境的空间级别的信息,这些信息是计算机视觉非常重要的输入内容。
4.机器学习
机器学习是使用特殊的算法来训练计算机从数据中学习的计算机科学,通常,这种学习结果存放在一种被称为“模型”的数据结构中。
机器学习诞生于20世纪60年代,但随着计算机硬件的改进,直到最近20年,机器学习才变得越来越流行,机器学习有很多的应用场景,例如金融公司使用机器学习来对汇率和证券交易进行预测,零售行业使用机器学习来预测需求,医疗行业使用机器学习来辅助医疗诊断。
机器学习涉及使用数据和相关的真值标记来进行模型训练,通俗来讲就是我们先输入正确的信息告诉计算机什么是对的,例如输入一组图片,分别标记清楚哪些是车辆,哪些是行人,然后让计算机学习如何区分两类图像,这类利用了人类创造的真值标记的机器学习也称为监督式学习。
我们再设想一个类似的学习过程,但是这次使用的是没有真值标记的车辆与行人的图像,在这种方法中,我们让计算机自行决定哪些图像相似、哪些图像不同,这被称为无监督学习。
我们在这种不提供真值标记,而是通过分析输入的数据,在这种情况下为摄像头图像,计算机凭借自行学习找到区别的另一种方法被称为半监督学习。半监督学习将监督学习和无监督学习的特点结合在一起,这种方法使用少量的标记数据和大量未标记数据来训练模型,能够很大程度上提高学习的效率。
强化学习是另一种机器学习,强化学习涉及允许模型通过尝试使用不同的方法来解决问题,然后衡量哪种方法最为成功,计算机将尝试许多不同的解决方案,最终使其方法与环境相适应。例如在模拟器中,强化学习智能体可训练汽车进行右转,智能体将在初始位置发动车辆,然后进行试验性驾驶,以多种不同的方向和速度如果汽车实际完成了右转,智能体会提高奖励,这是针对导致成功结果的初始操作,起初,车辆可能无法找到执行转弯的方法,然后,就像人类那样,汽车最终会从一些成功的右转经验中学习,最后学会如何完成任务。
5.神经网络
在人体中,神经元通过相互连接,构成了神经元网络或神经网络,我们通过类似的方式可以在计算机中构建神经网络,我们将神经元层连接起来,创建出了用于机器学习的人工神经网络。
人工神经网络是通过数据来学习复杂模式的工具,神经网络由大量的神经元组成,正如人体神经系统的神经元那样,人工神经元负责传递和处理信息,也可以对这些神经元进行训练。我们思考一下,当你看到一张车辆图片的时候,是怎么判断他是一辆车的呢?作为人类,你可以将汽车图像识别为车辆,无论他们是黑是白,或大或小,甚至从人类感官来讲,有时候你都不知道你是如何知道他们到底是不是车辆的,或许是长期的经验积累,或许是某些特征触发了你的反应,例如你看到了车轮、车灯和车窗等,神经网络具有相似的运作方式,通过密集训练,计算机可以辨别汽车、行人、交通信号灯和电线杆。
在我们看到一张图片的时候,我们的大脑其实会将图片分为几个部分,然后去识别特征,如车轮、车窗、颜色等,然后大脑将使用这些特征对图像进行检测和分类,例如在确定图像是否为汽车时,大脑可不会认为颜色是关键特征,因为汽车本身可能具备很多颜色,所以大脑会把更多权重放在其他特征上,并降低颜色的重要性,同样的,神经网络也会从图像中提取很多特征,但这些特征可能是我们人类无法描述甚至无法理解的特征,但对于我们而言其实不需要理解,计算机通过调整这些特征的权重,以完成神经网络的最终任务,这其实就是深层神经网络的思维方式。
6.反向传播算法
我们已经说了神经网络如何从数据中进行学习,那么你可能想知道这种学习如何发生,学习其实也称为训练,它是由前馈、误差测定和反向传播这三步循环组成的。
首先,随机分配初始权重,即人工神经元的值,通过神经网络来馈送每个图像,产生输出值,这个过程称为前馈。第二步为误差测定,误差是真值标记与前馈过程所产生输出之间的偏差。最后一步是反向传播,通过神经网络反向发送误差,这个过程类似于前馈过程,是前馈过程反方向的进行。每个神经元都对其值进行微调,这是基于通过神经网络后向传播的误差,所有这些独立调整的结果,可以生成更准确的网络。一个训练周期包括前馈、误差测定和反向传播还是远远不够的,为了训练网络,通常需要数千个这样的周期,但最终结果应该是模型能够根据新数据做出准确预测。
7.卷积神经网络
卷积神经网络CNN是一种人工神经网络,他对感知问题特别有效,CNN接受多维输入,包括定义大多数传感器数据的二维和三维形状,如果使用标准神经网络对图像进行分类,则需要通过一种方法将图像连接到网络的第一层,这属于一维度,标准做法是通过将图像矩阵重塑为一个矢量,并在一个大行中连接所有列,将图像展开为一维像素阵列,然而这种方法打破了图像中所嵌入的空间信息,如果图像中有车轮,则车轮中的所有像素会散布在整个像素阵列中,但我们知道,这些像素是以二维方式连接形成车轮的,如果我们将其散布在一个维度上,神经网络很难从图像中提取车轮,CNN通过维持输入像素之间的空间关系来解决这个问题,具体来说CNN通过将过滤器连续滑过图像来收集信息,每次收集信息时,只对整个图像的一小部分区域进行分析,这被称为“卷积”,当我们在整个输入图像上对一个过滤器进行卷积时,我们将该信息与下一个卷积层相关联,例如CNN可以识别第一个卷积层中的基本边缘和颜色信息,然后通过在第一层上卷积新过滤器,CNN可以使用边缘和颜色信息来归纳更复杂的结构,例如车轮、车门和挡风玻璃,而另一个卷积可食用车轮、车门和挡风玻璃来识别整个车辆,最后,神经网络可以使用这一高阶信息对车辆进行分类,人们通常不太清楚CNN如何解读图像,CNN有时会侧重于图像中令人惊讶的部分,但这也是深度学习的神奇之处,CNN根据其任务查找真正需要的特征,任务可能是图像检测、分类、分割或其他类型的目标。
8.检测与分类
在无人车感知的任务中,我们首先能想到的就是障碍物检测和分类,在车辆驾驶过程中会遇到许多障碍物,静态障碍物包括墙壁、树木、杆子和建筑物,动态障碍物包括行人、自行车和各种汽车。计算机首先需要知道这些障碍物的位置,然后对他们进行分类。
在路中行驶的无人驾驶车可能会探测到许多不同的物体,汽车根据所感知的物体类型,来确定路径和速度,例如汽车前方感知到一辆自行车,汽车可能会决定减速和变道,以便安全驶过自行车,但如果感知到前方的不是自行车而是汽车,并预测到前方车辆也将以较高速度行驶,无人车可能就会保持其速度和车道。
另一个例子是交通信号灯检测分类,首先,我们将使用计算机视觉对图像中的交通信号灯进行定位,然后,我们可以根据灯光显示颜色对交通信号灯进行分类。在无人驾驶车辆中,我们使用什么算法来对障碍物进行检测和分类呢?我们通常可以先使用检测CNN来查找图像中的对象的位置,在对图像中的对象进行定位后,我们可以将图像发送给另一个CNN进行分类,我们也可以使用单一CNN体系结构对对象进行检测和分类,一种常见的做法是在单个网络体系结构的末端增加几个不同的“分支”,一个分支执行检测、另一个分支执行分类。一个经典的体系结构为R-CNN及其变体Fast R-CNN和Faster R-CNN,YOLO和SSD是具有类似形式的不同体系结构。
9.跟踪
在完成检测之后,我们需要追踪这些对象。思考一个问题,如果我们对每个帧中的每个对象进行检测并用边界框对每个对象进行标识,那么跨帧追踪对象会带来哪些好处呢?
首先追踪在检测失败时至关重要,如果在执行检测算法检测到一辆汽车的时候,车辆突然被其他对象遮挡了一部分,这时候检测结果可能发现不了这辆车,因此追踪可以解决遮挡的问题。另一个原因在于追踪可以保留身份,障碍物检测的输出为包含对象的边界框,但是对象是没有和任何身份关联的,单独使用检测算法的时候,计算机不知道两帧图像中的汽车是否为同一辆汽车,这个任务对于人类而言可能非常简单,但是对于汽车而言其实是很困难的。追踪的第一步为确认身份,通过查找特征相似度最高的对象,将之前的帧中检测到的所有对象与当前帧中检测到的对象进行匹配,对象具有各种特征,有些特征可能基于颜色、而另一些特征可能基于形状,计算机视觉算法可以计算出复杂的图像特征,如局部二值模式和方向梯度直方图,当然了,我们也需要考虑连续视频帧中,两个障碍物之间的位置和速度,由于两个帧之间的对象位置和速度没有太大的变化,该信息也可以帮助我们快速找到匹配的对象,在确定身份后,我们可以使用对象的位置,并结合预测算法,以估计在下一个时间时对象的速度和位置,这种预测可以帮助我们识别下一帧中的相应对象。
10.分割
语义分割涉及对图像的每个像素进行分类,它用于尽可能详细地了解环境,并确定车辆可驾驶区域,语义分割依赖于一种特殊类型的CNN,它被称为全卷积网络或FCN,FCN用卷积层来代替,传统的CNN体系结构末端是平坦层,现在,网络中的每一层都是卷积层,因此其名称为全卷积网络。FCN提供了可在原始输入图像之上叠加的逐像素输出,我们必须考虑的一个复杂因素是大小,在典型的CNN中,经过多次卷积之后,所产生的输出比原始输入图像小的多,然而,为了分割像素,输出尺寸必须与原始图像的尺寸相匹配,为了达到该目的,我们可以对中间输出进行上采样处理,直到最终输出的大小与原始输出图像的大小匹配,网络的前半部分通常被称为编码器,因为这部分网络对输入图像的特征进行了提取和编码,网络的后半部分通常被称为解码器,因为他对这些特征进行了解码,并将其应用于输出。
11.感知融合策略
不同的传感器具备不同的性能,在不同的场景下使用不同的传感器或多种传感器同时作用对结果进行分析这就是感知融合。无人车通常使用激光雷达和毫米波雷达检测障碍物,用于融合输出的主要算法为卡尔曼滤波。卡尔曼滤波有两个步骤,第一步时预测状态,第二步是更正测量结果。假如我们正在跟踪一个行人,我们用状态表示行人的位置和速度,从已经掌握的行人状态开始,我们使用卡尔曼滤波的第一个步骤,也就是预测行人在将来的状态,接下来使用第二个步骤去修正这个结果,卡尔曼滤波就是预测和更新步骤的无限循环。其实修正结果也有两种方式,分别是同步和异步,同步融合同时更新来自不同传感器的测量结果,而异步融合则逐个更新所收到的传感器测量结果。传感器融合可以提高感知性能,因为各传感器相辅相成,融合也可以减少跟踪误差,所以我们可以更加精准实现对道路上物体位置的预测。
原创文章,作者:王得宇AIPM,如若转载,请注明出处:https://www.pmtemple.com/silence/13461/