做360网站官网还是百度知道,企业小程序注册,html网页设计代码例子,青岛建设银行股份有限公司网站在上一讲《Coursera自动驾驶课程第10讲#xff1a;Feedforward Neural Networks》中我们学习了神经网络的基础知识#xff0c;包括损失函数#xff0c;梯度下降#xff0c;正则化#xff0c;卷积网络等。
本讲我们将学习深度学习的一个重要应用#xff1a;图像目标检测。…在上一讲《Coursera自动驾驶课程第10讲Feedforward Neural Networks》中我们学习了神经网络的基础知识包括损失函数梯度下降正则化卷积网络等。
本讲我们将学习深度学习的一个重要应用图像目标检测。目前3D目标检测也是一个研究很火的领域感兴趣的朋友可以查看相关论文。
本讲对应视频
The Object Detection ProblemVideo2D Object detection with Convolutional Neural NetworksVideoTraining vs Inference VideoUsing 2D Object Detectors for Self-Driving CarsVideo 文章目录1. The Object Detection Problem1.1 Overview1.2 Mathematical Problem Formulation1.3 Evaluation Metrics2. 2D Object detection with Convolutional Neural Networks2.1 Overview2.2 The Feature Extractor2.3 Anchor Bounding Boxes2.4 Output Layers3. Training vs Inference3.1 Overview3.2 Minibatch Selection3.3 Non-Maximum Suppression4. Using 2D Object Detectors for Self-Driving Cars4.1 3D Object Detection4.2 2D Object Tracking4.3 Traffic sign and signal detection1. The Object Detection Problem
1.1 Overview
本讲我们将深入研究目标检测在目标检测中通常需要识别车辆、行人、交通信号灯等的位置以便我们的汽车知道它在哪里以及如何去驾驶汽车。
2D目标检测的历史可以追溯到2001年当时Paul Viola和Michael Jones发明了一种非常有效的人脸检测算法。现在称为ViolaJones目标检测框架是第一个可通过简单的网络摄像头提供可靠实时2D目标检测的目标检测框架。物体检测的下一个重大突破发生在四年后Navneet Dalal和Bill Triggs制定了有向梯度特征描述的直方图。算法应用于行人检测问题其性能优于当时提出的所有其他方法。
Dalal Triggs算法一直保持领先地位直到2012年多伦多大学计算机科学系的Alex KrizhevskyIlya Sutskever和Geoffrey Hinton以其被称为AlexNet的卷积神经网络震撼了计算机视觉世界。这是深度学习历史上的一个里程碑事件而当今的所有目标检测器几乎都是基于卷积神经网络。在介绍如何使用ConvNets进行目标检测之前我们先介绍什么是目标检测 1.2 Mathematical Problem Formulation
给定一张二维图像我们需要估计目标所属边界框的位置以及目标类别。对于自动驾驶汽车常见的类别有车辆行人和骑自行车的人。 2D目标检测问题并非十分容易。我们需要估计的目标在图像中并不总是能够被观察到。
例如背景目标通常被前景目标遮挡。此外靠近图像边缘的目标通常会被截断。
二维目标检测算法面临的另一个问题是规模问题。当物体远离我们时目标看起来很渺小。最后我们的算法还应该能够处理图像光亮变化这在自动驾驶汽车中尤其重要。 既然我们已经直观地了解了什么是目标检测那么让我们用数学的形式对问题进行形式化。 目标检测可以定义为特征估计问题。 给定一个输入图像xxx我们想找到一个函数fff产生一个输出矢量其中包括左上角的坐标(xminymin)(x_{min}y_{min})(xminymin)以及框右下角的坐标 (xmaxymax)(x_{max}y_{max})(xmaxymax)以及从Sclass1S_{class1}Sclass1到SclasskS_{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/(TPFP)\mathrm{TP} /(\mathrm{TP}\mathrm{FP})TP/(TPFP)
另一方面召回率是真阳性数量除以真阳性和假阴性之和 TP/(TPFN)\mathrm{TP} /(\mathrm{TP}\mathrm{FN})TP/(TPFN)
确定精确率和召回率之后我们可以更改目标类别得分阈值以获取精度召回曲线最后将平均精度确定为精度召回曲线下的面积。 曲线下的面积可以使用数值积分来计算但通常使用·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
下面我们先介绍特征提取器。特征提取器的输出通常比输入图像的宽度和高度小得多。 但是其深度通常比输入图像的深度大两到三个数量级。 特征提取器的设计是一个非常受欢迎的领域每年都有很多新的论文介绍如何提取图像特征。 最常用的特征提取器有VGGResNet和Inception。 下面我们将介绍VGG网络。
VGG是英国牛津大学视觉几何小组提出的VGG 16分类网络简称VGG16。网络结构构成非常简单与大多数ConvNet一样VGG特征提取器由交替的卷积层和池化层构建而成。所有卷积层的大小为(33k)(33k)(33k)步幅为1填充为1。所有最大池化层的大小为(22)(22)(22)步幅为2无填充。这些特定的超参数是通过大量实验得出的。
对于VGG特征提取器所有卷积层的大小为(33k)(33k)(33k)步幅为1填充为1。卷积后其输出维度为 Wout Win −m2×PS1Hin −32×111Win Hout Hin −m2×Ps1Hin −32×111Hin Dout KW_{\text {out }}\frac{W_{\text {in }}-m2 \times P}{S}1\frac{H_{\text {in }}-32 \times 1}{1}1W_{\text {in }} \\\boldsymbol{H}_{\text {out }}\frac{H_{\text {in }}-m2 \times P}{s}1\frac{H_{\text {in }}-32 \times 1}{1}1H_{\text {in }} \\\boldsymbol{D}_{\text {out }}KWout SWin −m2×P11Hin −32×11Win Hout sHin −m2×P11Hin −32×11Hin Dout K
另一方面VGG最大池化层步幅为2没有填充。注意到VGG的最大池层将输入的宽度和高度减小了一半同时保持深度不变。其输出维度为 WoutWin−ms1Win−221Win2HoutHin−ms1Hin−221Hin2DoutDinW_{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}WoutsWin−m12Win−212WinHoutsHin−m12Hin−212HinDoutDin
现在让我们看看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∗是真值。
Lcls1Ntotal ∑iCrossEntropy(si∗,si)L_{c l s}\frac{1}{N_{\text {total }}} \sum_{i}CrossEntropy \left(s_{i}^{*}, s_{i}\right)LclsNtotal 1i∑CrossEntropy(si∗,si)
然后是回归损失函数。我们使用L2L2L2损失函数。但是仅当锚盒为正锚盒时我们才尝试对其进行修改。在这里如果锚盒为负锚盒则pip_ipi为0如果锚盒为正锚盒则pip_ipi为1。为了进行归一化我们除以正锚盒总数。在这里bi∗bi^*bi∗是真值边界框而bib_ibi是预测边界框。对于边界框的调整我们使用残差来进行调整。 Lreg1Np∑ipiL2(bi∗,bi)L_{r e g}\frac{1}{N_{p}} \sum_{i} p_{i} L_{2}\left(b_{i}^{*}, b_{i}\right)LregNp1i∑piL2(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个需要可靠分类的类别。另一方面交通信号灯在世界不同地区的显示方式可能有所不同并且需要检测多种状态自动驾驶汽车才能通过信号交叉口安全操作。
此外交通信号灯会随着汽车行驶而改变状态。尝试跟踪图像空间中的交通信号时这可能会导致一些问题。幸运的是到目前为止我们已经描述的标准目标检测器无需进行重大改动即可用于检测交通标志和信号。但是当前的方法依赖于多级分层模型来更稳健地执行此检测任务。
让我们考虑这里显示的两阶段模型。它们共享特征提取器的输出以执行它们各自的任务。
在此示例中第一阶段输出指向图像中所有交通标志和信号的类不可知边界框而无需指定每个框属于哪个类。然后第二阶段从第一阶段获取所有边界框并将它们分类为红色黄色或绿色信号停止标志等类别。此外某些方法还使用第二阶段来进一步细化图框中提供的边界框。