在上一讲
《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
本讲,我们将深入研究
目标检测
,在目标检测中通常需要识别
车辆、行人、交通信号灯等
的位置,以便我们的汽车知道它在哪里以及如何去驾驶汽车。
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目标检测问题并非十分容易。我们需要估计的目标在图像中并不总是能够被观察到。
- 例如,背景目标通常被前景目标遮挡。
- 此外,靠近图像边缘的目标通常会被截断。
二维目标检测算法面临的另一个问题是规模问题。当物体远离我们时,目标看起来很渺小。最后,我们的算法还应该能够处理图像光亮变化,这在自动驾驶汽车中尤其重要。
既然我们已经直观地了解了什么是目标检测,那么让我们用数学的形式对问题进行形式化。 目标检测可以定义为特征估计问题。 给定一个输入图像
x
x
x
,我们想找到一个函数
f
f
f
,产生一个输出矢量,其中包括左上角的坐标
(
x
m
i
n
,
y
m
i
n
)
(x_{min},y_{min})
(
x
m
i
n
,
y
m
i
n
)
以及框右下角的坐标
(
x
m
a
x
,
y
m
a
x
)
(x_{max},y_{max})
(
x
m
a
x
,
y
m
a
x
)
,以及从
S
c
l
a
s
s
1
S_{class1}
S
c
l
a
s
s
1
到
S
c
l
a
s
s
k
S_{classk}
S
c
l
a
s
s
k
的类得分。总结下,函数形式为:
f
(
x
;
θ
)
=
[
x
min
,
y
min
,
x
max
,
y
max
,
S
class
1
…
,
S
class
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
;
θ
)
=
[
x
min
,
y
min
,
x
max
,
y
max
,
S
class
1
…
,
S
class
k
]
1.3 Evaluation Metrics
现在介绍一些2D目标检测常用的评价指标。
第一个是
IOU
。给定红色的2D目标检测器的预测边界框,我们希望能够比较它与真实边界框的匹配程度。 IOU定义为
两个多边形相交的面积除以它们的并集面积
。
下面是一些分类预测的评价指标:
-
真阳性(TP)
,预测分类得分超过分类阈值,且IOU超过IOU阈值。 -
假阳性(FP)
,预测分类得分超过分类阈值,但IOU小于IOU阈值。 -
假阴性(FN)
。假阴性是没有被检测出的真值目标。
一旦我们确定了真阳性,假阳性和假阴性;我们可以根据以下内容确定2D目标检测器的
精确率和召回率
。
精确率是
真阳性
数量除以
真阳性和假阳性之和
:
T
P
/
(
T
P
+
F
P
)
\mathrm{TP} /(\mathrm{TP}+\mathrm{FP})
T
P
/
(
T
P
+
F
P
)
另一方面,召回率是
真阳性
数量除以
真阳性和假阴性
之和:
T
P
/
(
T
P
+
F
N
)
\mathrm{TP} /(\mathrm{TP}+\mathrm{FN})
T
P
/
(
T
P
+
F
N
)
确定精确率和召回率之后,我们可以更改目标类别得分阈值以获取
精度召回曲线
,最后,将
平均精度
确定为精度召回曲线下的面积。 曲线下的面积可以使用数值积分来计算,但通常使用·
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。
![]() |
![]() |
![]() |
如果我们继续此过程,则会得到下表。然后,我们使用
y
y
y
轴上的精度值和
x
x
x
轴上的召回值来绘制精度召回曲线。请注意,我们还将精度召回点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)
(
3
,
3
,
k
)
,步幅为1,填充为1。所有最大池化层的大小为
(
2
,
2
)
(2,2)
(
2
,
2
)
,步幅为2,无填充。这些特定的超参数是通过大量实验得出的。
对于VGG特征提取器,所有卷积层的大小为
(
3
,
3
,
k
)
(3,3,k)
(
3
,
3
,
k
)
,步幅为1,填充为1。卷积后其输出维度为:
W
out
=
W
in
−
m
+
2
×
P
S
+
1
=
H
in
−
3
+
2
×
1
1
+
1
=
W
in
H
out
=
H
in
−
m
+
2
×
P
s
+
1
=
H
in
−
3
+
2
×
1
1
+
1
=
H
in
D
out
=
K
W_{\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 }}=K
W
out
=
S
W
in
−
m
+
2
×
P
+
1
=
1
H
in
−
3
+
2
×
1
+
1
=
W
in
H
out
=
s
H
in
−
m
+
2
×
P
+
1
=
1
H
in
−
3
+
2
×
1
+
1
=
H
in
D
out
=
K
另一方面,VGG最大池化层步幅为2,没有填充。注意到VGG的最大池层将
输入的宽度和高度减小了一半,同时保持深度不变
。其输出维度为:
W
o
u
t
=
W
i
n
−
m
s
+
1
=
W
i
n
−
2
2
+
1
=
W
i
n
2
H
o
u
t
=
H
i
n
−
m
s
+
1
=
H
i
n
−
2
2
+
1
=
H
i
n
2
D
o
u
t
=
D
i
n
W_{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}
W
o
u
t
=
s
W
i
n
−
m
+
1
=
2
W
i
n
−
2
+
1
=
2
W
i
n
H
o
u
t
=
s
H
i
n
−
m
+
1
=
2
H
i
n
−
2
+
1
=
2
H
i
n
D
o
u
t
=
D
i
n
现在让我们看看VGG如何处理输入图像。给定一个维度为
(
M
,
N
,
3
)
(M,N,3)
(
M
,
N
,
3
)
的图像,前两个卷积层深度为64,然后是第一个池化层。此时,输出的宽度和高度将减小一半,而深度将扩展到64,下图是经过每一个卷积层后最终输出的特征维度。
例如,如果我们有一个
(
1240
,
960
,
3
)
(1240,960,3)
(
1
2
4
0
,
9
6
0
,
3
)
的图像作为输入,那么我们的最终输出维度为
(
40
,
30
,
512
)
(40,30,512)
(
4
0
,
3
0
,
5
1
2
)
。
2.3 Anchor Bounding Boxes
在我们的神经网络架构中要描述的下一步是Anchor Bbox的概念,也称为
锚框
。为了生成2D边界框,我们通常不会从头开始,并且在没有任何先验的情况下估计边界框的大小。我们假设我们已知目标的大致尺寸,这些先验称为锚框。
在训练过程中,网络学会获取这些锚点中的每一个,并尝试将其在质心位置和尺寸上都尽可能靠近真值框。它利用了这样的概念:
通过对锚盒进行微调,而不是在整个图像中搜索可能的物体位置
。在实践中,事实证明,与没有任何先验直接估计边界框相比,残差学习可提供更好的结果。
关于如何使用锚框来生成最终预测,相关文献中已经提出了许多不同的方法。这里以
Faster-RCNN
为例。Faster R-CNN方法非常简单。 对于特征图中的每个像素,我们将
k
k
k
个锚框关联起来。 然后,在该像素邻域上执行
(
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
)
维特征向量一一用作与该像素关联的
k
k
k
个锚点中每一个的特征向量。 然后,我们将提取的特征向量馈入神经网络的输出层。
2.4 Output Layers
二维物体检测器的输出层通常包括
回归头和分类头
。
-
回归头通常包括具有线性输出层的多个完全连接的隐藏层。
回归的输出通常是残差向量
[Δ
x
center
,
Δ
y
center
]
\left[\Delta x_{\text {center }}, \Delta y_{\text {center }}\right]
[
Δ
x
center
,
Δ
y
center
]
,需要将其添加到锚点上才能锚框的中心位置。然后这里
fw
,
f
h
f_w,f_h
f
w
,
f
h
是锚框大小的比例。 - 分类头还包括多个完全连接的隐藏层,但具有最终的softmax输出层。 softmax输出是每个类只有一个分数的向量。最高分数通常为锚框的所属类别。
回想一下,我们的目标是实现准确的检测,这意味着我们希望图像中每个目标只输出一个Bbox。因此,我们将需要采取一些措施来消除网络产生的冗余检测。在下一小节我们将会介绍
非极大值抑制
,它能很好的解决这个问题。
3. Training vs Inference
3.1 Overview
让我们从回顾神经网络训练开始。 已知网络模型和训练数据:图像
x
x
x
和其标签
f
∗
(
x
)
f^*(x)
f
∗
(
x
)
,最终输出为
边界框位置和目标所属分类
。
我们的目标是希望输出
y
y
y
近似等于标签
f
∗
(
x
)
f ^*(x)
f
∗
(
x
)
。 我们借助损失函数来进行优化,损失函数测量了预测边界框与真值边界框的相近程度。 然后,我们将损失函数的结果传递给优化器,该优化器输出一组新的参数
θ
\theta
θ
,用于后面的迭代运算。 注意,在训练期间,特征提取器和输出层将会均被修改。但是在下图中我们看到,每个目标对应输出并不是一个边界框,而我们希望得到的是一个边界框,下面我们将介绍如何解决这个问题。
3.2 Minibatch Selection
请记住,对于特征图中的每个像素,我们会关联
k
k
k
个锚点。这些锚点在原始图像中会出现在哪里呢?正如我们先前所了解的那样,特征提取器将输入图像维度降低了32倍。这意味着,如果我们将特征图中的每个像素与一组锚点相关联,这些锚点将被转移到原始图像上通过将它们放在步幅为32的网格上。然后,我们可以可视化这些锚点旁边的真值边界框和锚盒。注意到这里锚盒会重叠,有些没有重叠。
我们用IOU量化这种重叠,并将锚点分为两类。我们首先指定两个IOU阈值,一个
正阈值
和一个
负阈值
。 IOU大于正阈值的任何锚盒称为正锚盒。同样,任何IOU小于负阈值的锚盒都称为负锚盒。 IOU在两个阈值之间的所有锚盒都将被完全丢弃。那么现在,我们如何在训练中使用这些正的和负的锚盒呢?
![]() |
![]() |
现在让我们看看如何为正锚盒和负锚盒分配分类和回归目标。
-
对于负锚盒:我们希望神经网络预测其类别为
背景类别
,对于回归,我们不进行边界框预测。 - 对于正锚盒:我们希望神经网络预测一个正确的类别,同时,我们也会输出一个边界框。
在训练期间处理多个锚盒的方法并非容易。提出的IOU阈值机制会导致大多数锚盒被判为负锚盒。当用所有这些锚点进行训练时,模型将会产生
类偏斜
现象。解决这个问题的方法实际上非常简单,我们
不是使用所有锚盒来计算损失函数
,而是使用负锚盒与正锚盒的比例为三比一的样本对选定的小批量样本进行采样。
例如,如果我们有64个示例的小批量,则负锚盒将是分类损失最高的48个负锚盒,剩下的16个锚盒将是正锚盒。
下面我们介绍损失函数,首先介绍的
分类损失函数
。如之前所述,我们将使用交叉熵损失函数。其中
S
i
S_i
S
i
是分类输出。
S
i
∗
Si^*
S
i
∗
是真值。
L
c
l
s
=
1
N
total
∑
i
C
r
o
s
s
E
n
t
r
o
p
y
(
s
i
∗
,
s
i
)
L_{c l s}=\frac{1}{N_{\text {total }}} \sum_{i}CrossEntropy \left(s_{i}^{*}, s_{i}\right)
L
c
l
s
=
N
total
1
i
∑
C
r
o
s
s
E
n
t
r
o
p
y
(
s
i
∗
,
s
i
)
然后是
回归损失函数
。我们使用
L
2
L2
L
2
损失函数。
但是,仅当锚盒为正锚盒时,我们才尝试对其进行修改
。在这里如果锚盒为负锚盒,则
p
i
p_i
p
i
为0;如果锚盒为正锚盒,则
p
i
p_i
p
i
为1。为了进行归一化,我们除以正锚盒总数。在这里
b
i
∗
bi^*
b
i
∗
是真值边界框,而
b
i
b_i
b
i
是预测边界框。对于边界框的调整,我们使用残差来进行调整。
L
r
e
g
=
1
N
p
∑
i
p
i
L
2
(
b
i
∗
,
b
i
)
L_{r e g}=\frac{1}{N_{p}} \sum_{i} p_{i} L_{2}\left(b_{i}^{*}, b_{i}\right)
L
r
e
g
=
N
p
1
i
∑
p
i
L
2
(
b
i
∗
,
b
i
)
3.3 Non-Maximum Suppression
到目前为止,我们已经掌握了如何在训练期间处理目标的多个输出框。 但是,当我们在推理过程中运行神经网络时,我们该怎么办? 请记住,在推理过程中,我们只希望场景中每个目标只有一个输出框。 这是
非最大抑制
发挥作用的时候,这是一种非常强大的方法,可以改善基于锚点的神经元网络的推理输出。
非最大抑制以
预测方框列表
B
B
B
作为输入,每个预测方块列表由
类输出得分
和
回归坐标
组成。它还需要输入一个预定义的IOU阈值,我们将其称为
η
\eta
η
。
算法如下:
-
首先根据列表
BB
B
的输出分数进行排序。我们还初始化了一个空集
DD
D
。 -
然后,我们遍历排序后的列表
BB
B
中的所有元素。在for循环内,我们首先确定列表
BB
B
中得分最高的框
bm
a
x
b_{max}
b
m
a
x
,它应该是
BB
B
中的第一个元素。然后,我们从边界框集
BB
B
中删除此边界框,并将其添加到输出集
DD
D
中。 -
接下来,我们找到剩余在集合
BB
B
中的所有IOU大于
η\eta
η
的框。这些框与当前的最大框
bm
a
x
b_max
b
m
a
x
重叠。满足此条件的所有框将从列表
BB
B
中删除。我们不断遍历列表
BB
B
直到为空,然后返回列表
DD
D
。现在
DD
D
中每个对象包含一个边界框。
让我们通过一个直观的示例来了解非最大抑制算法在实际中是如何工作的。假设我们已经按照降序对边界框列表进行了排序,如下图所示。
bm
a
x
b_{max}
b
m
a
x
是排序列表B中的第一个边界框
B1
B_1
B
1
。然后,我们将每个边界框与
bm
a
x
b_{max}
b
m
a
x
进行比较。我们计算IOU,并将其与IOU阈值
η\eta
η
进行比较。在这种情况下,IOU大于阈值
η\eta
η
,最终我们从列表
BB
B
中删除
B3
B_3
B
3
。我们对列表中的下一个最高分重复此过程。最终初始列表
BB
B
现在为空。因此,我们的非最大抑制算法将退出并返回输出框列表
DD
D
,该列表按预期包含每个对象的唯一边界框。
![]() |
![]() |
![]() |
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个需要可靠分类的类别。另一方面,交通信号灯在世界不同地区的显示方式可能有所不同,并且需要检测多种状态,自动驾驶汽车才能通过信号交叉口安全操作。
此外,交通信号灯会随着汽车行驶而改变状态。尝试跟踪图像空间中的交通信号时,这可能会导致一些问题。幸运的是,到目前为止,我们已经描述的标准目标检测器无需进行重大改动即可用于检测交通标志和信号。但是,当前的方法依赖于多级分层模型来更稳健地执行此检测任务。
让我们考虑这里显示的
两阶段模型
。它们共享特征提取器的输出以执行它们各自的任务。
-
在此示例中,第一阶段输出指向图像中所有交通标志和信号的
类不可知边界框
,
而无需指定每个框属于哪个类
。 -
然后,第二阶段从第一阶段获取所有边界框,并将它们分类为红色,黄色或绿色信号停止标志等类别。此外,某些方法还使用第二阶段来进一步细化图框中提供的边界框。