当前位置: 首页 > article >正文

算法类学习笔记 ———— 障碍物检测

文章目录

  • 介绍
  • 基于图像的障碍物检测
    • 基于二维图像的障碍物检测
      • YOLO系列障碍物检测
      • SSD障碍物检测
      • Faster RCNN障碍物检测
    • 基于图像的三位障碍物检测
  • 基于激光雷达的障碍物检测
    • 基于几何特征和网格
      • 边缘模板的创建
      • 非最大值抑制原理提取边缘信息
    • VoxelNet障碍物检测
  • 基于视觉和激光雷达融合的障碍物检测
    • 空间融合
    • 时间融合

介绍

 障碍物检测是无人驾驶汽车环境感知模块中的重要组成部分。准确的障碍物检测决定着无人驾驶汽车行驶的安全性。目前障碍物检测技术可以概括为如下三种方法:
   1)基于图像的障碍物检测;
   2)基于激光雷达的障碍物检测;
   3)基于视觉和激光雷达融合的障碍物检测。

基于图像的障碍物检测

 基于图像的障碍物检测算法已经发展的较为成熟,大致可以分为一阶段检测算法和二阶段检测算法。一阶段检测算法有YOLO和SSD等,二阶段检测算法主要是RCNN这一流派。当前的二阶段算法大多是在Faster RCNN基础上的改进。两种算法相比,一阶段算法的速度是快于二阶段算法的,而在准确性上,二阶段算法优于一阶段算法。

基于二维图像的障碍物检测

YOLO系列障碍物检测

  YOLO(You Only Look Once )是将物体检测作为回归问题求解的一种一阶段检测算法。它基于一个单独的端到端网络,完成从原始图像的输入到物体位置和类别的输出。从网络设计上, YOLO 与 RCNN 、 Fast RCNN 和 Faster RCNN 的区别如下:
   (1) YOLO 调练和检溯均是在一个单独网络中进行,没有显式地求取区域候选框的过程,这是它相比基于候选框方法的优势。而 RCNN / Fast RCNN 采用分离的模块求取候选框,训练过程因此也是分成多个模块进行。 Faster RCNN 使用 RPN ( Region Proposal Network )卷积网络替代RCNN / Fast RCNN 的选择性搜索模块,将 RPN 集成到 Fast RCNN 检测网络中,得到一个统一的检测网络。尽管 RPN 与 Fast RCNN 共享卷积层,但是在模型训练过程中,需要反复训练 RPN 网络和 Fast RCNN 网络。
   (2) YOLO 输入图像经过一次推理,便能得到图像中所有物体的位置和其所属类别及相应的置信概率,而 RCNN / Fast RCNN / Faster RCNN 将检测结果分为两部分求解,物体类别(分类问题)和物体位置,即标注框( boundingbox )。


 接下来介绍一下 YOLO 系列障碍物检测核心思想。
   1)网络定义。 YOLO 检测网络包括24个卷积层和2个全连接层。其中,卷积层用来提取图像特征,全连接层用来预测图像位置和类别概率值。 YOLO 网络借鉴了 GoogleNet 分类网络结构,不同的是, YOLO 未使用 Inception 模块,而是使用1×1卷积层(此处1×1卷积层的存在是为了跨通道信息整合)和3x3卷积层简单替代。 YOLO 论文中,还给出一个更轻快的检测网络 fast YOLO ,它只有9个卷积层和2个全连接层。使用 Titan X GPU, fast YOLO 可以达到155 f/ s 的检测速度,但是 mAP 值也从 YOLO 的63.4%降到了52.7%,却仍然远高于以往的实时物体检测方法( DPM )的 mAP 值。
   2)输出表达( representation )定义。本部分给出 YOLO 全连接输出层的定义。 YOLO 将输人图像分成 S×S 个格子,每个格子负责检测“落入”该格子的物体。若某个物体的中心位置的坐标落人到某个格子,那么这个格子就负责检测出这个物体。每个格子输出 B 个标注框(包含物体的矩形区域)信息,以及 C 个物体属于某种类别的概率信息。标注框信息包含5个数据值,分别是 x 、 y 、 w 、 h 和 c。其中x、 y 是指当前格子预测得到的物体的标注框的中心位置的坐标。 w 、 h 是标注框的宽度和高度。注意,实际训练过程中, w 和 h 的值使用图像的宽度和高度进行归一化到[0,1]区间内;x 、 y 是标注框中心位置相对于当前格子位置的偏移值,并且一同归化到[0,1]。c反应当前标注框是否包含物体以及物体位置的准确性,计算方式如下:

confidence=P(object)

 其中,若标准框包含物体,则P(object)=1;否则P(object)=0。  因此,YOLO网络最终的全连接层的输出维度是S×S×(B×5+C)。YOLO论文中,训练采用的输入图像分辨率是448×448像素,S=7,B=2;采用VOC 20类标注物体作为训练数据,C=20。因此输出向量为7×7×(20+2×5)=1470维。

在这里插入图片描述
   3)损失(loss)函数定义。YOLO使用均方和误差作为loss函数来优化模型参数,即网络输出的S×S×(B×5+C)维向量与真实图像的对应S×S×(B×5+C)维向量的均方和误差。如下式所示,coordError、iouError和classError分别代表预测数据与标定数据之间的坐标误差、IOU误差和分类误差。
l o s s = ∑ i = 0 s 2 c o o r d E r r o r + i o u E r r o r + c l a s s E r r o r loss = \sum\limits_{i=0}^{s^2}coordError + iouError + classError loss=i=0s2coordError+iouError+classError
 YOLO对上式loss的计算进行了如下修正:
   1)位置相关误差(坐标、IOU)与分类误差对网络loss的贡献值是存在差异的,因此在计算loss时,使用λcoord=5修正coordError;
   2)在计算IOU误差时,包含物体的格子和不包含物体的格子,二者的IOU误差对网络loss的贡献值是不同的。若采用相同权值,不包含物体的格子的confidence值近似于0,变相放大了包含物体的格子的confidence误差在计算网络参数梯度时的影响。为此,YOLO使用λnoobj=0.5修正iouError;
   3)对于相等的误差值,大物体误差对检测的影响小于小物体误差对检测的影响。是因为相同的位置偏差占大物体的比例小于同等偏差占小物体的比例。YOLO将物体大小的信息项(w和h)进行求平方根来改进此问题。


 YOLO方法模型训练依赖于物体识别标注数据。因此,对于非常规物体形状或比例,YOLO的识别检测效果不理想。YOLO采用了多个下采样层,网络中学习到的物体特征并不精细,会影响检测效果。YOLO的loss函数中虽然对大物体IOU误差和小物体IOU误差进行了处理,但从实际的角度来看无法根本解决问题。因此,对于小物体,小的IOU误差也会对网络优化过程造成影响,从而降低物体检测的准确性。

SSD障碍物检测

 SSD ( SingleShotMultiboxDetector )也是一种单一阶段检测算法,只需要用到图像1次,不需要产生候选框再进行分类和回归,而是直接在图像中不同位置进行边界框的采样,然后使用卷积层进行特征提取后直接进行分类和回归。相比基于候选框的方法, SSD 极大地提高了的检测速度。


 接下来介绍一下 SSD 检测的主要设计理念。
   (1)使用不同尺度下的特征图进行检测。 SSD 通过提取不同尺度下的特征图来做检测,其网络结构与 YOLO 的比较如图所示。
在这里插入图片描述
   它使用了六种不同尺寸的特征图来进行检测。在卷积神经网络中,较低层级的特征图尺寸较大,在这种特征图上的候选框在原图上的覆盖范围较小;较高层级的特征图的尺寸较小,而其候选框在原图上的覆盖范围大。如图所示。
在这里插入图片描述
   尺寸为8x8的特征图划分了更多单元格,但是每个单元格在原图中所占范围较小。通过对多个层级上的候选框进行匹配,有利于更精确地找到与不同尺寸目标最匹配的边界框。
 (2)采用卷积层做检测。 与 YOLO 在全连接层之后做检测不同的是, SSD 直接采用卷积对不同特征图进行特征提取。如网络结构对比图所示,对于尺寸为 m×n ,维数为 p 的特征图, SSD 使用3×3×p的卷积枝来进行卷积。其输出一种为用于分类的置信度分数,另一种为用于回归的位移量。另外,卷积层还通过候选框层生成候选框坐标,每层产生的候选框个数是一定的。
 (3)采用不同尺度和纵横比的候选框。 SSD 借鉴了与 Faster RCNN 类似的候选框思想,在每个单元格设置不同尺度和纵横比的默认框,如上图所示,每个单元格设定有四种不同尺度的默认框。对于一个尺寸为 m×n的特征图。假定每个单元格有k个默认框,则该特征图共有m×n×k个默认框。如网络结构对比图中所示,该网络共产生8732(38×38×4+19×19×6+10×10×6+5×5×6+3×3×4+1×1×4)个默认框。
 对于每个默认框,SSD的预测值主要有两方面 —— 分类的置信度和边界框的回归值。在分类中,SSD会把背景单独作为一类。在VOC数据集上,SSD的每个默认框会输出21类置信度,其中20类作为VOC的目标种类。边界框的回归值与Faster RCNN类似,实际上是预测真实边界框g相对于默认框d的中心(cx,cy)和宽(w)、高(h)的转换量,预测值的真实值的计算方式为:
g ^ c x = g c x − d c x d w \hat{g}^{cx} = \frac{g^{cx} - d^{cx}}{d^w} g^cx=dwgcxdcx
g ^ c y = g c y − d c y d h \hat{g}^{cy} = \frac{g^{cy} - d^{cy}}{d^h} g^cy=dhgcydcy
g ^ w = log ⁡ ( g w d w ) \hat{g}^w = \log(\frac{g^w}{d^w}) g^w=log(dwgw)
g ^ h = log ⁡ ( g h d h ) \hat{g}^h = \log(\frac{g^h}{d^h}) g^h=log(dhgh)
   因此,假定该数据集有 c 种目标,则每个默认框需要预测 c +1个类别概率和4个坐标相关的转换量。在训练过程中, SSD 会在开始阶段将这些默认框与真实框进行匹配,如在上图中,对猫和狗分别采用适合它们形状的默认框,蓝色框匹配到了猫的真实框,红色框匹配到了狗的真实框。在匹配过程中,首先对于每个真实框,找与其 IOU 最大的默认框进行匹配;然后,对于剩余的默认框,若其与某一真实框的 IOU 大于设定阈值,SSD 也会将它们进行匹配。也就是说,一个真实框可能会与多个默认框匹配。这种匹配方法简化了网络的学习问题,使得网络可以在多个框中选择预测分数最高的,而不是只能用重合度最大的框来做预测。
   另外,与真实框匹配的默认框记为正样本,未匹配的记为负样本,显然这样产生的负样本要远远多于正样本。为了保证正负样本比例尽量平衡, SSD 将负样本按置信度误差排序,并选择排名靠前的,使得负样本与正样本的比例约为3:1。
 (4)损失( loss )函数定义。 SSD 的损失函数由位置误差( localization loss , loc )和置信度误差( confidence loss , conf )组成。令xijp表示第 i 个默认框是否与第 j 个真实框匹配, N 为匹配的默认框总数, c 为类别置信度预测值, g 为真实边界框, l 为预测框,则总的损失函数为
L ( x , c , l , g ) = 1 N ( L c o n f ( x , c ) + α L l o c ( x , l , g ) ) L(x,c,l,g)=\frac{1}{N} (L_{conf}(x,c) +\alpha L_{loc}(x,l,g)) L(x,c,l,g)=N1(Lconf(x,c)+αLloc(x,l,g))
   对于位置误差Lloc,采用Smooth L1 loss;
L l o c ( x , l , g ) = ∑ i ∈ P o s N ∑ m ∈ ( c x , c y , w , h ) N x i j k s m o o t h L 1 ( l i m − g ^ j m ) L_{loc}(x,l,g) = \sum\limits_{i \in Pos}^{N} \sum\limits_{m \in (cx,cy,w,h)}^{N} x_{ij}^{k}smooth_{L1}(l_{i}^{m} - \hat{g}_{j}^{m}) Lloc(x,l,g)=iPosNm(cx,cy,w,h)NxijksmoothL1(limg^jm)
   对于置信度Lconf,采用了softmax loss:
L c o n f ( x , c ) = − ∑ i ∈ P o s N x i j p l o g ( c ^ i p ) − ∑ i ∈ N e g l o g ( c ^ i p ) L_{conf}(x,c) = -\sum\limits_{i \in Pos}^{N} x_{ij}^{p} log(\hat{c}_{i}^{p}) - \sum\limits_{i \in Neg} log(\hat{c}_{i}^{p}) Lconf(x,c)=iPosNxijplog(c^ip)iNeglog(c^ip)
c ^ i p = e x p ( c i p ) ∑ p e x p ( c i p ) \hat{c}_{i}^{p}=\frac{exp(c_i^p)}{\sum\limits_p exp(c_i^p)} c^ip=pexp(cip)exp(cip)
   总误差函数中权重系数α通过交叉验证设置。

Faster RCNN障碍物检测

 经过RCNN和Fast RCNN的积淀,Ross B. Girshick等人在2016年提出了新目标检测框 —— Faster RCNN。Faster RCBB不同于 YOLO ,它是一种二阶段的检测算法。 RCNN 系列算法如图所示。
在这里插入图片描述
 RCNN 以及 Fast RCNN 都无法做到端到端的训练, Faster RCNN 则将体征提取模块、候选框生成模块以及边框回归和目标分类模块都整合在了一个网络中,使得综合性能有较大提高、在检测速度方面尤为明显。
   (1)特征提取模块。Faster RCNN 特征提取网络使用的VGG16是牛津大学计算机视觉组和 Deepmind 公司的研究人员一起研发的深度卷积神经网络。他们探索卷积神经网络中的深度、宽度和性能之间的关系,通过反复堆叠3X3卷积和2x2的最大值池化,成功构建一个16层的网络。输人图像大小是3x224x224,输出特征则为51x39X256。
   (2)候选框生成模块( RPN )。经典的检测方法生成检测框都非常耗时,如 Opencv 的 Adaboost 方法使用滑动窗口和图像金字塔生成检测框;或如 RCNN 使用 SS ( Selective Search )方法生成检测框。而 Faster RCNN 则抛弃了传统的滑动窗口和 SS 方法,直接使用 Region Proposal Networks ( RPN )生成检测框,这也是 Faster RCNN 的巨大优势,能极大提升检测框的生成速度。特征可以看作一个尺度51x39的256通道图像,对于该图像的每一个位置,考虑9个可能的候选窗口:三种面积(1282,2562,5122)×三种比例(1:1,1:2,2:1),这些候选框窗口称为锚点。
在这里插入图片描述
   RPN实际分为两个组件:一个组件通过softmax分类anchor获得前景和背景;另一个组件用于计算对anchor的边框偏移量,以获得精确的候选框。
   (3)边框回归和目标分类模块。在通过RPN得到候选框之后,使用ROI pooling将每个候选框所对应的特征都转换成7x7的大小。再将每个候选框的特征输入到边框回归和目标分类模块中,这样可以得到每个候选框的类别,类别数是n+1,n是n中障碍物类别,1则是背景。对于那些非背景的目标狂,则会进行边框修正。在Faster RCNN中主要有两个损失:一个是分类损失,另一个是标注框回归损失。对于分类损失来说就是一个简单的交叉熵,而标注框回归损失采用的平滑的L1损失。
s m o o t h L 1 ( x ) = { 0.5 x 2 × 1 σ 2 ∣ x ∣ < 1 σ 2 ∣ x ∣ − 0.5 其他 smooth_{L1}(x)= \begin{cases} 0.5x^2 \times \frac{1}{\sigma^2} & \text{$|x|< \frac{1}{\sigma^2}$} \\ |x| - 0.5 & \text {其他} \end{cases} smoothL1(x)={0.5x2×σ21x0.5x<σ21其他

基于图像的三位障碍物检测

 尽管Faster RCNN、YOLO、SSD等算法能够准确检测出障碍物在图像中的位置,但是对于现实世界的障碍物都是三维的。这就意味着大部分应用都需要有目标物体的三维的长宽高信息、空间信息、朝向信息偏转角等。如下图所示,在自动驾驶场景下,需要从图像中提供目标物体的长宽高、空间、朝向等信息。鸟瞰投影的信息对于后续自动驾驶场景中的路径规划和控制有着至关重要的作用。目前三维目标检测正处于高速发展时期,主要综合利用单目摄像头、双目摄像头、多线激光雷达进行三维目标检测。从成本的角度考虑,激光雷达>双目摄像头>单目摄像头;从现阶段的准确率来看,激光雷达>双目摄像头>单目摄像头。
在这里插入图片描述

基于激光雷达的障碍物检测

基于几何特征和网格

 几何特征包括直线、圆和矩形等。基于几何特征的方法首先对激光雷达的数据进行处理,采用聚类算法将数据聚类并与障碍物的几何特征进行对比,对障碍物进行检测和分类。这使得利用几何特征的方法在无人驾驶方面较为常见。为了提高对不同点云数据检测的可靠性,基于几何特征的方法也可以与光谱特征结合,将几何和影像特征综合考虑,从多个维度对障碍物进行识别,同时引入权重系数来反映不同的特征对识别的影响。对于非结构化的道路,障碍物的形状复杂,较难用几何形状去描述,此时需要用基于网格的方法来识别此类障碍物。该方法将激光雷达的数据投影到网格地图中,然后利用无向图相关方法对点云数据进行处理。网格的大小和结构可以自定义,用网格分布图像来表示障碍物,分辨率越高的网格,表示的障碍物越复杂,但同时需要较高的计算复杂度和内存。
 这里简单介绍一下基于几何特征的模板匹配原理。

边缘模板的创建

 我们首先从模板图像的边缘创建一个数据集或模板模型,该数据集或模板模型将用于目标图像中去搜索与模板图像相近或相同的图像。边缘检测的方法与canny边缘检测的方法类似。Sobel算子在横向和纵向两个方向可以与图像作平面卷积。对于模板图像某点(x,y)可以得出两个方向的梯度向量Gx,Gy。我们可以计算该像素点的复制梯度G和梯度方向θ:
G = G x 2 + G y 2 G=\sqrt{G_x^2+ G_y^2} G=Gx2+Gy2
θ = tan ⁡ − 1 ( G x G y ) \theta = \tan^{-1} (\frac{G_x}{G_y}) θ=tan1(GyGx)

非最大值抑制原理提取边缘信息

 sobel算子检测出来的边缘太粗了,我们需要抑制那些梯度不够大的像素点,只保留最大的梯度,从而达到瘦边的目的。这些梯度不够大的像素点很可能是某一条边缘的过渡点。按照高数的极大值的定义,即对点(x0,y0)的某个邻域内所有(x,y)都有f(x,y)≤(f(x0,y0),则称f在(x0,y0)具有一个极大值,极大值为f(x0,y0)。简单方案是判断一个像素点的8邻域与中心像素谁更大,但这很容易筛选出噪声,因此我们需要用梯度和梯度方向来辅助确定。
如下图所示,中心像素C的梯度方向是蓝色直线dTmp1,dTmp2是梯度直线上与邻域交点的值,那么只需比较中心点C与dTmp1和dTmp2的大小即可。由于这两个点的像素不知道,假设像素变化是连续的,就可以用g1、g2和g3、g4进行线性插值估计。设g1的幅值M(g1),g2的幅值M(g2),则M(dtmp1)=w*M(g2)+(1-w)*M(g1) ,其w=distance(dtmp1,g2)/distance(g1,g2) 。也就是利用g1和g2到dTmp1的距离作为权重,来估计dTmp1的值。经过非最大值抑制可以滤除大部分非边缘点。

VoxelNet障碍物检测

 VoxelNet障碍物检测为了方便进行障碍物检测,激光雷达数据需要一定的人力对数据进行整理,对于距离较远的物体,激雷达扫描出的物体轮廓信息在网络进行识别时效果可能并不理想,为此需要投入更多的人工流程去处理激光雷达数据。为了解决这一难点,减少人力,在 VoxelNet 的研究中,消除了对点云进行手动提取特征的过程,并提出了统一的端到端的三维检测网络。 VoxelNet 将原始点云作为输人,但由于现有激光雷达返回的点云数据包含的坐标点数量较大,多为数万到数十万,对计算量和内存的需求过大, VoxelNet 除了减少人力标注外,也着重解决了如何让网络高效处理更多的激光点云数据。如图所示, VoxelNet 主要由三个模块组成:特征学习网络、中间卷积层和区域建议网络。
在这里插入图片描述
 特征学习网络主要将点云划分为体素 Voxel 形式,通过 VFE 层提取特征,得到体素级的特征向量,包括以下几个步骤:
   (1)体素划分
   (2)分组
   (3)随机抽样
   (4)堆叠体素特征编码
   (5)稀疏张量表示

基于视觉和激光雷达融合的障碍物检测

空间融合

 建立精确的雷达坐标系、三维世界坐标系、摄像机坐标系、图像坐标系和像素坐标系之间的坐标转换关系,是实现多传感器数据的空间融合关键。

时间融合

 雷达和视觉信息除在空间上需要进行融合外,还需传感器咋时间上同步采集数据,实现时间的融合。


http://www.kler.cn/a/303208.html

相关文章:

  • 斯坦福泡茶机器人DexCap源码解析:涵盖收集数据、处理数据、模型训练三大阶段
  • 逐行加载 HTML 内容并实时显示效果:使用 wxPython 的实现
  • 【C++】string类(附题)
  • AndroidStudio-常用布局
  • 浪潮信息“源”Embedding模型登顶MTEB榜单第一名
  • 项目技术栈-解决方案-web3去中心化
  • 如何使用Visual Studio的内存诊断工具进行内存泄漏检测
  • 今年的智能手机不仅仅是AI
  • 区块链领航者孙宇晨:驾驭潮流,共绘未来新篇章
  • 基于Spark 的零售交易数据挖掘分析与可视化
  • Java | Leetcode Java题解之第403题青蛙过河
  • mysql一主2从部署
  • 记者协会评审系统-需求分析
  • 苹果CMS vs. 海洋CMS:哪个系统更易于百度收录?
  • 解决:Vue3 - defineProps 设置默认值报错问题
  • CentOS 入门基础
  • LeetCode 2398.预算内的最多机器人数目:滑动窗口+单调队列——思路清晰的一篇题解
  • 工业设备网关在智能工厂建设中发挥的作用,以某汽车制造厂为例
  • LabVIEW编程语言出于什么原因开发的?
  • 1688商品详情API返回值中的售后保障与服务信息
  • Failed building wheel for opencv-python-headless
  • k8s常用指令续:
  • Day 11-12:查找
  • day14-单例设计模式动态代理
  • Qt 学习第八天:菜单栏、工具栏、状态栏、模态和非模态对话框创建
  • RabbitMQ延迟消息——DelayExchange插件