Coursera自动驾驶课程第11讲:2D Object Detection

在上一讲《Coursera自动驾驶课程第10讲:Feedforward Neural Networks》中我们学习了神经网络的基础知识,包括损失函数梯度下降正则化卷积网络等。

本讲我们将学习深度学习的一个重要应用:图像目标检测。目前3D目标检测也是一个研究很火的领域,感兴趣的朋友可以查看相关论文。

本讲对应视频:

  • The Object Detection Problem(Video)
  • 2D Object detection with Convolutional Neural Networks(Video)
  • Training vs Inference (Video)
  • Using 2D Object Detectors for Self-Driving Cars(Video)

文章目录

      • 1. The Object Detection Problem
        • 1.1 Overview
        • 1.2 Mathematical Problem Formulation
        • 1.3 Evaluation Metrics
      • 2. 2D Object detection with Convolutional Neural Networks
        • 2.1 Overview
        • 2.2 The Feature Extractor
        • 2.3 Anchor Bounding Boxes
        • 2.4 Output Layers
      • 3. Training vs Inference
        • 3.1 Overview
        • 3.2 Minibatch Selection
        • 3.3 Non-Maximum Suppression
      • 4. Using 2D Object Detectors for Self-Driving Cars
        • 4.1 3D Object Detection
        • 4.2 2D Object Tracking
        • 4.3 Traffic sign and signal detection


1. The Object Detection Problem

1.1 Overview

本讲,我们将深入研究目标检测,在目标检测中通常需要识别车辆、行人、交通信号灯等的位置,以便我们的汽车知道它在哪里以及如何去驾驶汽车。

2D目标检测的历史可以追溯到2001年,当时Paul Viola和Michael Jones发明了一种非常有效的人脸检测算法。现在称为Viola,Jones目标检测框架,是第一个可通过简单的网络摄像头提供可靠实时2D目标检测的目标检测框架。物体检测的下一个重大突破发生在四年后,Navneet Dalal和Bill Triggs制定了有向梯度特征描述的直方图。算法应用于行人检测问题,其性能优于当时提出的所有其他方法。

Dalal Triggs算法一直保持领先地位,直到2012年,多伦多大学计算机科学系的Alex Krizhevsky,Ilya Sutskever和Geoffrey Hinton以其被称为AlexNet的卷积神经网络震撼了计算机视觉世界。这是深度学习历史上的一个里程碑事件,而当今的所有目标检测器几乎都是基于卷积神经网络。在介绍如何使用ConvNets进行目标检测之前,我们先介绍什么是目标检测?

在这里插入图片描述


1.2 Mathematical Problem Formulation

给定一张二维图像,我们需要估计目标所属边界框的位置以及目标类别。对于自动驾驶汽车,常见的类别有车辆,行人和骑自行车的人
在这里插入图片描述
2D目标检测问题并非十分容易。我们需要估计的目标在图像中并不总是能够被观察到。

  • 例如,背景目标通常被前景目标遮挡。
  • 此外,靠近图像边缘的目标通常会被截断。

二维目标检测算法面临的另一个问题是规模问题。当物体远离我们时,目标看起来很渺小。最后,我们的算法还应该能够处理图像光亮变化,这在自动驾驶汽车中尤其重要。
在这里插入图片描述
既然我们已经直观地了解了什么是目标检测,那么让我们用数学的形式对问题进行形式化。 目标检测可以定义为特征估计问题。 给定一个输入图像xxx,我们想找到一个函数fff,产生一个输出矢量,其中包括左上角的坐标(xmin,ymin)(x_{min},y_{min})(xminymin)以及框右下角的坐标 (xmax,ymax)(x_{max},y_{max})(xmaxymax),以及从Sclass1S_{class1}Sclass1SclasskS_{classk}Sclassk的类得分。总结下,函数形式为:
f(x;θ)=[xmin⁡,ymin⁡,xmax⁡,ymax⁡,Sclass 1…,Sclass k]f(x ; \theta)=\left[x_{\min }, y_{\min }, x_{\max }, y_{\max }, S_{\text {class }_{1}} \ldots, S_{\text {class }_{k}}\right]f(x;θ)=[xmin,ymin,xmax,ymax,Sclass 1,Sclass k]

在这里插入图片描述


1.3 Evaluation Metrics

现在介绍一些2D目标检测常用的评价指标。

第一个是IOU。给定红色的2D目标检测器的预测边界框,我们希望能够比较它与真实边界框的匹配程度。 IOU定义为两个多边形相交的面积除以它们的并集面积
在这里插入图片描述
下面是一些分类预测的评价指标:

  • 真阳性(TP),预测分类得分超过分类阈值,且IOU超过IOU阈值。
  • 假阳性(FP),预测分类得分超过分类阈值,但IOU小于IOU阈值。
  • 假阴性(FN)。假阴性是没有被检测出的真值目标。

一旦我们确定了真阳性,假阳性和假阴性;我们可以根据以下内容确定2D目标检测器的精确率和召回率
精确率是真阳性数量除以真阳性和假阳性之和
TP/(TP+FP)\mathrm{TP} /(\mathrm{TP}+\mathrm{FP})TP/(TP+FP)

另一方面,召回率是真阳性数量除以真阳性和假阴性之和:
TP/(TP+FN)\mathrm{TP} /(\mathrm{TP}+\mathrm{FN})TP/(TP+FN)

确定精确率和召回率之后,我们可以更改目标类别得分阈值以获取精度召回曲线,最后,将平均精度确定为精度召回曲线下的面积。 曲线下的面积可以使用数值积分来计算,但通常使用·11个召回点的精确率的平均值来近似。
在这里插入图片描述
让我们通过一个示例来研究如何使用学习的指标评估2D目标检测的性能。我们对仅道路场景中的汽车感兴趣。

现在让我们使用平均精度来评估性能。第一步是获取所有估计的边界框,并根据目标类别得分对其进行排序。然后,我们继续计算每个预测框与相应的真实框之间的IOU。如果不与任何真实框相交,则将其IOU设置为零。首先,我们说明分类分数的门槛,比如说0.9。接下来,我们设置IOU阈值,IOU阈值为0.7。最终真阳性数量为2,假阳性数量为0,假阴性数量为2。精确率为1,召回率为0.5。在这种情况下,检测器是高精度低召回率检测器。这意味着检测器会错过场景中的某些目标,但是当它确实检测到目标时,在类别分类和边界框位置上几乎不会犯错误。

让我们看看将分数阈值从0.9降低到0.7时检测器的性能如何变化。所有边界框的得分均大于0.7,因此我们不会通过得分阈值消除它们中的任何一个。但是,当我们检查IOU时,可以看到其中两个的IOU小于0.7。通过消除这两个方框,我们得到了三个真实的的预测。在这种情况下,精度降低了,而召回率从0.5增加到0.75。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

如果我们继续此过程,则会得到下表。然后,我们使用yyy轴上的精度值和xxx轴上的召回值来绘制精度召回曲线。请注意,我们还将精度召回点0添加为绘图中的第一个点,找回点1作为绘图中的最后点。这使我们可以通过使用介于0和1之间的11个召回点以计算P-R曲线下方的面积来近似平均精度。计算此平均值得出检测器的AP为0.75。可以将检测器的平均精度值视为所有得分阈值上的性能平均值,从而可以客观比较检测器的性能,而不必考虑产生这些检测的确切得分阈值。
在这里插入图片描述


2. 2D Object detection with Convolutional Neural Networks

2.1 Overview

让我们首先回顾2D目标检测问题。 给定一张图像作为输入,我们希望同时定位场景中的所有目标并确定它们属于哪个类。 让我们看看如何使用ConvNet执行此任务。

下图显示了用于2D目标检测的基本流程。

  • 首先,使用特征提取器处理图像提取特征。
  • 其次,输出层将特征提取器的输出作为输入,同时提供每个2D先验boxes的位置及分类。
  • 最后,对输出执行非极大值抑制以生成最终检测结果。
    在这里插入图片描述

2.2 The Feature Extractor

下面我们先介绍特征提取器特征提取器的输出通常比输入图像的宽度和高度小得多。 但是,其深度通常比输入图像的深度大两到三个数量级。 特征提取器的设计是一个非常受欢迎的领域,每年都有很多新的论文介绍如何提取图像特征。 最常用的特征提取器有VGG,ResNet和Inception。 下面我们将介绍VGG网络。

VGG是英国牛津大学视觉几何小组提出的VGG 16分类网络(简称VGG16)。网络结构构成非常简单,与大多数ConvNet一样,VGG特征提取器由交替的卷积层和池化层构建而成。所有卷积层的大小为(3,3,k)(3,3,k)(33k),步幅为1,填充为1。所有最大池化层的大小为(2,2)(2,2)(22),步幅为2,无填充。这些特定的超参数是通过大量实验得出的。

对于VGG特征提取器,所有卷积层的大小为(3,3,k)(3,3,k)(33k),步幅为1,填充为1。卷积后其输出维度为:
Wout =Win −m+2×PS+1=Hin −3+2×11+1=Win Hout =Hin −m+2×Ps+1=Hin −3+2×11+1=Hin Dout =KW_{\text {out }}=\frac{W_{\text {in }}-m+2 \times P}{S}+1=\frac{H_{\text {in }}-3+2 \times 1}{1}+1=W_{\text {in }} \\\boldsymbol{H}_{\text {out }}=\frac{H_{\text {in }}-m+2 \times P}{s}+1=\frac{H_{\text {in }}-3+2 \times 1}{1}+1=H_{\text {in }} \\\boldsymbol{D}_{\text {out }}=KWout =SWin m+2×P+1=1Hin 3+2×1+1=Win Hout =sHin m+2×P+1=1Hin 3+2×1+1=Hin Dout =K

另一方面,VGG最大池化层步幅为2,没有填充。注意到VGG的最大池层将输入的宽度和高度减小了一半,同时保持深度不变。其输出维度为:
Wout=Win−ms+1=Win−22+1=Win2Hout=Hin−ms+1=Hin−22+1=Hin2Dout=DinW_{o u t}=\frac{W_{i n}-m}{s}+1=\frac{W_{i n}-2}{2}+1=\frac{W_{i n}}{2}\\H_{o u t}=\frac{H_{i n}-m}{s}+1=\frac{H_{i n}-2}{2}+1=\frac{H_{i n}}{2}\\ D_{o u t}=D_{i n}Wout=sWinm+1=2Win2+1=2WinHout=sHinm+1=2Hin2+1=2HinDout=Din

现在让我们看看VGG如何处理输入图像。给定一个维度为(M,N,3)(M,N,3)(M,N,3)的图像,前两个卷积层深度为64,然后是第一个池化层。此时,输出的宽度和高度将减小一半,而深度将扩展到64,下图是经过每一个卷积层后最终输出的特征维度。

在这里插入图片描述
例如,如果我们有一个(1240,960,3)(1240,960,3)(1240,960,3)的图像作为输入,那么我们的最终输出维度为(40,30,512)(40,30,512)(40,30,512)
在这里插入图片描述


2.3 Anchor Bounding Boxes

在我们的神经网络架构中要描述的下一步是Anchor Bbox的概念,也称为锚框。为了生成2D边界框,我们通常不会从头开始,并且在没有任何先验的情况下估计边界框的大小。我们假设我们已知目标的大致尺寸,这些先验称为锚框。

在训练过程中,网络学会获取这些锚点中的每一个,并尝试将其在质心位置和尺寸上都尽可能靠近真值框。它利用了这样的概念:通过对锚盒进行微调,而不是在整个图像中搜索可能的物体位置。在实践中,事实证明,与没有任何先验直接估计边界框相比,残差学习可提供更好的结果。

关于如何使用锚框来生成最终预测,相关文献中已经提出了许多不同的方法。这里以Faster-RCNN为例。Faster R-CNN方法非常简单。 对于特征图中的每个像素,我们将kkk个锚框关联起来。 然后,在该像素邻域上执行(3,3,D)(3,3,D)(3,3,D)的卷积运算。 这将为该像素生成一个(1,1,D)(1,1,D)(1,1,D)维特征向量。 我们将此(1,1,D)(1,1,D)(1,1,D)维特征向量一一用作与该像素关联的kkk个锚点中每一个的特征向量。 然后,我们将提取的特征向量馈入神经网络的输出层。
在这里插入图片描述


2.4 Output Layers

二维物体检测器的输出层通常包括回归头和分类头

  • 回归头通常包括具有线性输出层的多个完全连接的隐藏层。回归的输出通常是残差向量[Δxcenter ,Δycenter ]\left[\Delta x_{\text {center }}, \Delta y_{\text {center }}\right][Δxcenter ,Δycenter ],需要将其添加到锚点上才能锚框的中心位置。然后这里fw,fhf_w,f_hfw,fh是锚框大小的比例。
  • 分类头还包括多个完全连接的隐藏层,但具有最终的softmax输出层。 softmax输出是每个类只有一个分数的向量。最高分数通常为锚框的所属类别。

回想一下,我们的目标是实现准确的检测,这意味着我们希望图像中每个目标只输出一个Bbox。因此,我们将需要采取一些措施来消除网络产生的冗余检测。在下一小节我们将会介绍非极大值抑制,它能很好的解决这个问题。

在这里插入图片描述


3. Training vs Inference

3.1 Overview

让我们从回顾神经网络训练开始。 已知网络模型和训练数据:图像xxx和其标签f∗(x)f^*(x)f(x),最终输出为边界框位置和目标所属分类

我们的目标是希望输出yyy近似等于标签f∗(x)f ^*(x)f(x)。 我们借助损失函数来进行优化,损失函数测量了预测边界框与真值边界框的相近程度。 然后,我们将损失函数的结果传递给优化器,该优化器输出一组新的参数θ\thetaθ,用于后面的迭代运算。 注意,在训练期间,特征提取器和输出层将会均被修改。但是在下图中我们看到,每个目标对应输出并不是一个边界框,而我们希望得到的是一个边界框,下面我们将介绍如何解决这个问题。
在这里插入图片描述


3.2 Minibatch Selection

请记住,对于特征图中的每个像素,我们会关联kkk个锚点。这些锚点在原始图像中会出现在哪里呢?正如我们先前所了解的那样,特征提取器将输入图像维度降低了32倍。这意味着,如果我们将特征图中的每个像素与一组锚点相关联,这些锚点将被转移到原始图像上通过将它们放在步幅为32的网格上。然后,我们可以可视化这些锚点旁边的真值边界框和锚盒。注意到这里锚盒会重叠,有些没有重叠。

我们用IOU量化这种重叠,并将锚点分为两类。我们首先指定两个IOU阈值,一个正阈值和一个负阈值。 IOU大于正阈值的任何锚盒称为正锚盒。同样,任何IOU小于负阈值的锚盒都称为负锚盒。 IOU在两个阈值之间的所有锚盒都将被完全丢弃。那么现在,我们如何在训练中使用这些正的和负的锚盒呢?

在这里插入图片描述在这里插入图片描述

现在让我们看看如何为正锚盒和负锚盒分配分类和回归目标。

  • 对于负锚盒:我们希望神经网络预测其类别为背景类别,对于回归,我们不进行边界框预测。
  • 对于正锚盒:我们希望神经网络预测一个正确的类别,同时,我们也会输出一个边界框。

在训练期间处理多个锚盒的方法并非容易。提出的IOU阈值机制会导致大多数锚盒被判为负锚盒。当用所有这些锚点进行训练时,模型将会产生类偏斜现象。解决这个问题的方法实际上非常简单,我们不是使用所有锚盒来计算损失函数,而是使用负锚盒与正锚盒的比例为三比一的样本对选定的小批量样本进行采样。

例如,如果我们有64个示例的小批量,则负锚盒将是分类损失最高的48个负锚盒,剩下的16个锚盒将是正锚盒。

下面我们介绍损失函数,首先介绍的分类损失函数。如之前所述,我们将使用交叉熵损失函数。其中SiS_iSi是分类输出。 Si∗Si^*Si是真值。

Lcls=1Ntotal ∑iCrossEntropy(si∗,si)L_{c l s}=\frac{1}{N_{\text {total }}} \sum_{i}CrossEntropy \left(s_{i}^{*}, s_{i}\right)Lcls=Ntotal 1iCrossEntropy(si,si)

然后是回归损失函数。我们使用L2L2L2损失函数。但是,仅当锚盒为正锚盒时,我们才尝试对其进行修改。在这里如果锚盒为负锚盒,则pip_ipi为0;如果锚盒为正锚盒,则pip_ipi为1。为了进行归一化,我们除以正锚盒总数。在这里bi∗bi^*bi是真值边界框,而bib_ibi是预测边界框。对于边界框的调整,我们使用残差来进行调整。
Lreg=1Np∑ipiL2(bi∗,bi)L_{r e g}=\frac{1}{N_{p}} \sum_{i} p_{i} L_{2}\left(b_{i}^{*}, b_{i}\right)Lreg=Np1ipiL2(bi,bi)


3.3 Non-Maximum Suppression

到目前为止,我们已经掌握了如何在训练期间处理目标的多个输出框。 但是,当我们在推理过程中运行神经网络时,我们该怎么办? 请记住,在推理过程中,我们只希望场景中每个目标只有一个输出框。 这是非最大抑制发挥作用的时候,这是一种非常强大的方法,可以改善基于锚点的神经元网络的推理输出。

非最大抑制以预测方框列表BBB作为输入,每个预测方块列表由类输出得分回归坐标组成。它还需要输入一个预定义的IOU阈值,我们将其称为η\etaη

算法如下:

  • 首先根据列表BBB的输出分数进行排序。我们还初始化了一个空集DDD
  • 然后,我们遍历排序后的列表BBB中的所有元素。在for循环内,我们首先确定列表BBB中得分最高的框bmaxb_{max}bmax,它应该是BBB中的第一个元素。然后,我们从边界框集BBB中删除此边界框,并将其添加到输出集DDD中。
  • 接下来,我们找到剩余在集合BBB中的所有IOU大于η\etaη的框。这些框与当前的最大框bmaxb_maxbmax重叠。满足此条件的所有框将从列表BBB中删除。我们不断遍历列表BBB直到为空,然后返回列表DDD。现在DDD中每个对象包含一个边界框。
    在这里插入图片描述
    让我们通过一个直观的示例来了解非最大抑制算法在实际中是如何工作的。假设我们已经按照降序对边界框列表进行了排序,如下图所示。 bmaxb_{max}bmax是排序列表B中的第一个边界框B1B_1B1。然后,我们将每个边界框与bmaxb_{max}bmax进行比较。我们计算IOU,并将其与IOU阈值η\etaη进行比较。在这种情况下,IOU大于阈值η\etaη,最终我们从列表BBB中删除B3B_3B3。我们对列表中的下一个最高分重复此过程。最终初始列表BBB现在为空。因此,我们的非最大抑制算法将退出并返回输出框列表DDD,该列表按预期包含每个对象的唯一边界框。
在这里插入图片描述在这里插入图片描述在这里插入图片描述

4. Using 2D Object Detectors for Self-Driving Cars

4.1 3D Object Detection

在本小节,我们将讨论2D目标检测的三个重要应用。

  • 首先,我们将讨论如何将2D目标检测扩展到3D。
  • 其次,我们将讨论目标跟踪。
  • 最后,我们将讨论如何将2D目标检测应用于交通标志和信号灯的检测。

对于自动驾驶汽车来说,其运动场景是3D,有时仅检测图像平面中的目标是不够的。汽车需要知道行人,汽车,车道和路标在汽车周围的位置。这时我们需要将问题从2D扩展到3D,并在世界坐标中定位检测到的目标。3D目标检测是一个相对较新的主题,并且此领域的结果在不断变化。

3D目标检测我们需要知道目标类别,例如是汽车,行人和自行车员。另外我们要估计3D目标质心位置,3D目标的尺寸和3D目标的方向

在每种情况下,这种详细的状态信息都可以提高运动预测和避免碰撞的能力,并提高汽车在交通中行驶的能力。该目标的状态可以表示为质心位置的3D向量,质心位置表示为目标的(x,y,z)(x,y,z)(x,y,z)。3D目标i尺寸,表示为目标的长宽高(l,w,h)(l,w,h)(l,w,h)。方向角的3D向量,表示为目标的侧倾角,俯仰角和偏航角。对于道路场景,我们感兴趣的方向角通常只是偏航角。但是,如何从2D边界框到对物体位置和尺寸的精确3D估计呢?

在这里插入图片描述
在3D中扩展2D目标检测的最常见,最成功的方法是使用激光雷达点云数据。问题是应将点云以哪种表示形式输入到神经网络?

一些研究人员选择直接处理原始点云数据。其他研究人员选择相对于某个固定点对点云数据进行标准化处理。最后,还可以对这些点进行预处理,以构建固定长度的表示形式,无论我们使用哪种表示形式,都期望以有向3D边界框的形式获得结果。请记住,上面讨论的过程只是执行3D目标检测的一种方法。

那么,为什么我们选择将2D检测扩展到3D而不是直接在3D中检测对象?

  • 首先,2D目标检测器比3D目标检测器更加完善。通常,我们可以从成熟的2D目标检测器中获得很高的精度和召回率。
  • 其次,我们从2D目标检测器结果中获得分类。无需使用LiDAR数据传递到网络即可确定我们检测的是汽车还是其它。这在2D图像数据中非常明显。
  • 最后,如果无法对应该在哪里找到目标做出任何假设,在3D空间中搜索可能的目标在计算上​​是相当昂贵的。将2D目标检测器扩展到3D,通常可以使我们限制目标实例的搜索区域,从而使实时性能易于管理。

但是,将2D目标检测器扩展到3D也会引起一系列独特的问题。

  • 使用这种方法进行3D目标检测所引起的一个突出问题是:我们将3D姿态估计器的性能限制在一个上限(即2D检测器的性能)上。
  • 此外,从摄像头的角度来看,当2D到3D方法面临严重的遮挡和截断时通常会失败。
  • 最后,由这种方法的串行特性引起的等待时间通常不可忽略。延迟感知这意味着我们的汽车经过一定延迟后会看到道路上的物体​​。如果此延迟很大,则系统可能不够安全,无法运行,因为车辆反应时间受感知等待时间限制。
    在这里插入图片描述

4.2 2D Object Tracking

2D到3D目标检测的另一个非常重要的应用是目标跟踪。 跟踪涉及将对同一物体的检测序列拼接在一起,以定义随时间变化的物体运动。 我们将从描述一种简单的跟踪方法开始,该方法可以在2D和3D中使用。

执行目标检测时,通常在每个帧中独立检测目标。 但是,在跟踪中,我们通常通过已知的目标动力学模型预测目标的运动。 通常我们需要做出一些假设:例如,假设我们的相机和被跟踪的目标不能在很短的时间内传送到不同的位置。 另外,我们假设场景逐渐平滑变化。 所有这些假设在道路场景中在逻辑上都是有效的。

下图显示了目标跟踪常用的处理流程, 我们将这些检测称为测量,将每个预测与相应的测量相关联,然后使用相关的测量更新目标预测。
在这里插入图片描述
现在让我们描述每个必要的步骤。

  • 首先,我们目标状态定义为其在图像空间中的位置和速度。每个目标都有一个更新其状态的运动模型。例如,此处显示的等速运动模型用于将每个边界框移动到第二帧中的新位置。注意,由于模型不是完美的,我们在运动模型中添加了高斯噪声。

  • 在预测之后,我们从2D目标检测器获得第二帧测量值。然后,我们通过计算所有预测和所有测量之间的IOU,将每个测量与一个预测相关联。如果某个测量的IOU最高,则它将与相应的预测相关

  • 最后一步包括使用卡尔曼滤波器融合测量和预测。卡尔曼滤波器更新包括位置和速度在内的整个目标状态。

在这里插入图片描述在这里插入图片描述在这里插入图片描述

还有一些复杂的问题需要解决,特别是如何启动追踪以及如何终止追踪。

  • 如果获得的检测结果与之前的任何预测都不相关,则我们将启动新的追踪。
  • 同样,如果预测与预设帧数的测量值不相关,则终止不一致的追踪。
  • 最后,我们需要注意的是,通过在3D中定义IOU,我们可以使用相同的方法进行3D目标跟踪。

4.3 Traffic sign and signal detection

现在我们可以从自动驾驶汽车上安装的摄像机中看到典型的行车记录仪样式图像。通常,汽车必须在远距离检测交通标志和交通信号,以使汽车知道如何及时做出适当反应。远距离,交通标志和信号在图像中仅占很少的像素,这使得检测问题特别具有挑战性。此外,交通标志变化很大。通常,包括多达50个需要可靠分类的类别。另一方面,交通信号灯在世界不同地区的显示方式可能有所不同,并且需要检测多种状态,自动驾驶汽车才能通过信号交叉口安全操作。

此外,交通信号灯会随着汽车行驶而改变状态。尝试跟踪图像空间中的交通信号时,这可能会导致一些问题。幸运的是,到目前为止,我们已经描述的标准目标检测器无需进行重大改动即可用于检测交通标志和信号。但是,当前的方法依赖于多级分层模型来更稳健地执行此检测任务。
在这里插入图片描述

让我们考虑这里显示的两阶段模型。它们共享特征提取器的输出以执行它们各自的任务。

  • 在此示例中,第一阶段输出指向图像中所有交通标志和信号的类不可知边界框而无需指定每个框属于哪个类
  • 然后,第二阶段从第一阶段获取所有边界框,并将它们分类为红色,黄色或绿色信号停止标志等类别。此外,某些方法还使用第二阶段来进一步细化图框中提供的边界框。
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/439644.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Coursera自动驾驶课程第12讲:Semantic Segmentation

在上一讲《Coursera自动驾驶课程第11讲:2D Object Detection》我们学习了深度学习的一个重要应用:目标检测。 本讲我们将学习深度学习的另一个重要应用:语义分割。这是图片像素级的一个重要应用。 B站视频链接:https://www.bili…

多线程知识梳理(2) - 并发编程的艺术笔记

layout: post title: 《Java并发编程的艺术》笔记 categories: Java excerpt: The Art of Java Concurrency Programming. <img src"http://upload-images.jianshu.io/upload_images/658453-a94405da52987372.jpg?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240…

Coursera自动驾驶课程第13讲:Least Squares

在上一讲《Coursera自动驾驶课程第12讲&#xff1a;Semantic Segmentation》我们学习了深度学习的另一个重要应用&#xff1a;语义分割。至此&#xff0c;本课程的视觉感知模块就介绍完了。 从本讲开始&#xff0c;我们将学习一个新的模块&#xff0c;也是本课程的第三个模块&…

Coursera自动驾驶课程第14讲:Linear and Nonlinear Kalman Filters

在上一讲《Coursera自动驾驶课程第13讲&#xff1a;Least Squares》我们学习了最小二乘法相关知识。 本讲我们将学习20世纪最著名的一个算法&#xff1a;卡尔曼滤波。具体包括线性卡尔曼滤波&#xff08;KF&#xff09;&#xff0c;扩展卡尔曼滤波(EKF)&#xff0c;误差状态卡…

详解两阶段3D目标检测网络 Voxel R-CNN:Towards High Performance Voxel-based 3D Object Detection

本文介绍一篇两阶段的3D目标检测网络&#xff1a;Voxel R-CNN&#xff0c;论文已收录于AAAI 2021。 这里重点是理解本文提出的 Voxel RoI pooling。 论文链接为&#xff1a;https://arxiv.org/pdf/2012.15712.pdf 项目链接为&#xff1a;https://github.com/djiajunustc/Voxe…

java容器类1:Collection,List,ArrayList,LinkedList深入解读

1、 Iterable 与 Iterator Iterable 是个接口&#xff0c;实现此接口使集合对象可以通过迭代器遍历自身元素. public interface Iterable<T> 修饰符和返回值方法名描述Iterator<T>iterator()返回一个内部元素为T类型的迭代器default voidforEach(Consumer<?…

无限场景开放式仿真器 PGDrive:Improving the Generalization of End-to-End Driving through Procedural Generation

本文介绍一个拥有无限场景开放式驾驶仿真器&#xff1a;PGDrive&#xff0c;通过 Procedural Generation 技术可以生成无限多的驾驶场景&#xff0c;由香港中文大学周博磊团队开发。 论文地址&#xff1a;https://arxiv.org/pdf/2012.13681.pdf 项目地址&#xff1a;https://…

java容器类2:Map及HashMap深入解读

Java的编程过程中经常会和Map打交道&#xff0c;现在我们来一起了解一下Map的底层实现&#xff0c;其中的思想结构对我们平时接口设计和编程也有一定借鉴作用。(以下接口分析都是以jdk1.8源码为参考依据) 1. Map An object that maps keys to values. A map cannot contain du…

两阶段3D目标检测网络 SIENet: Spatial Information Enhancement Network for 3D Object Detection from Point Cloud

本文介绍一篇两阶段的3D目标检测网络&#xff1a;SIENet。 这里重点是理解本文提出的 Hybrid-Paradigm Region Proposal Network 和 Spatial Information Enhancement module。 论文链接为&#xff1a;https://arxiv.org/abs/2103.15396 项目链接为&#xff1a;https://githu…

java容器类3:set/HastSet/MapSet深入解读

介绍 Set&#xff1a;集合&#xff0c;是一个不包含重复数据的集合。&#xff08;A collection that contains no duplicate elements. &#xff09; set中最多包含一个null元素&#xff0c;否者包含了两个相同的元素&#xff0c;不符合定义。 上一篇学习了Java中的容器类的一…

Bandit算法原理及Python实战

目录 1&#xff09;什么是Bandit算法 为选择而生。 Bandit算法与推荐系统 怎么选择Bandit算法&#xff1f; 2)常用Bandit算法 Thompson sampling算法 UCB算法 Epsilon-Greedy算法 Greedy算法 3&#xff09;Bandit算法Python实战 参考资料&#xff1a; 推荐系统里面有…

ava容器类4:Queue深入解读

Collection的其它两大分支&#xff1a;List和Set在前面已近分析过&#xff0c;这篇来分析一下Queue的底层实现。 前三篇关于Java容器类的文章&#xff1a; java容器类1&#xff1a;Collection,List,ArrayList,LinkedList深入解读 java容器类2&#xff1a;Map及HashMap深入解…

Waymo离线点云序列3D物体检测网络 (3D Auto Labeling): Offboard 3D Object Detection from Point Cloud Sequences

本文介绍一篇Waymo基于点云序列的3D物体检测网络&#xff1a;3D Auto Labeling&#xff0c;论文已收录于CVPR 2021。 这里重点是理解本文提出的 Object-centric Auto Labeling。 论文链接为&#xff1a;https://arxiv.org/abs/2103.05073 2021-09-02补充&#xff1a;本文作者…

Waymo自动驾驶数据集介绍与使用教程

本文将对Waymo自动驾驶数据集&#xff08;Waymo Open Dataset&#xff09;进行介绍。 论文链接为&#xff1a;https://arxiv.org/abs/1912.04838v7 项目链接为&#xff1a;https://github.com/waymo-research/waymo-open-dataset 数据集链接为&#xff1a;https://waymo.com…

Java 并发基础——线程安全性

线程安全&#xff1a;多个线程访问某个类时&#xff0c;不管运行时环境采用何种调度方式或者这些线程将如何交替执行&#xff0c;并且在主调代码中不需要任何额外的同步或协调&#xff0c;这个类都能表现出正确的行为&#xff0c;那么久称这个类是线程安全的。 在线程安全类中封…

详解一阶段3D物体检测网络 SE-SSD: Self-Ensembling Single-Stage Object Detector From Point Cloud

本文介绍一篇一阶段的3D物体检测网络&#xff1a;SE-SSD&#xff0c;论文已收录于 CVPR 2021。 这里重点是理解本文提出的 Consistency Loss 、Orientation-Aware Distance-IoU Loss、Shape-Aware Data Augmentation。 论文链接为&#xff1a;https://arxiv.org/pdf/2104.0980…

详解3D点云分割网络 Cylindrical and Asymmetrical 3D Convolution Networksfor LiDAR Segmentation

本文介绍一篇3D点云分割网络&#xff1a;Cylinder3D&#xff0c;论文已收录于 CVPR 2021。 这里重点是理解本文提出的 Cylindrical Partition 和 Asymmetrical 3D Convolution Network。 论文链接为&#xff1a;https://arxiv.org/pdf/2011.10033.pdf 项目链接为&#xff1a;…

自动驾驶3D物体检测研究综述 3D Object Detection for Autonomous Driving: A Survey

本文介绍一篇最新的自动驾驶3D物体检测研究综述&#xff08;2021年6月份发布&#xff09;&#xff0c;来源于中国人民大学&#xff0c;论文共26页&#xff0c;99篇参考文献。 论文链接为&#xff1a;https://arxiv.org/pdf/2106.10823.pdf 0. Abstract 自动驾驶被看作是避免人…

Java中接口的多继承

我们知道Java的类只能继承一个类&#xff0c;但可以实现多个接口。但是你知道么&#xff1f;Java中的接口却可以继承多个接口。本文就来说一说Java中接口的多继承。 进入主题之前&#xff0c;先扩展一下。Java为什么只支持单继承呢&#xff1f; 我们不妨假设Java支持多继承&a…

详解基于IMU/GPS的行人定位: IMU/GPS Based Pedestrian Localization

本文介绍一篇使用 IMU/GPS 数据融合的行人定位论文&#xff0c;这里重点是理解本文提出的 Stop Detection 和 GPS Correction。 论文地址为&#xff1a;https://www.researchgate.net/publication/261452498_IMUGPS_based_pedestrian_localization 1. Introduction 低成本的 …