写在前面

目前暂定方向:

  1. 先考虑单无人机,解决多目标检测定位目标移动轨迹预测问题。
  2. 后续,从多个无人机的视角中检测出同一个物体,多视角的目标检测问题,应该侧重的难点在于多个摄像头的数据融合视角变化等的问题。

所以目前应该先学习一下目标检测的基本知识,考虑到之前对CV有一些基本的了解,因此直接看目标检测知识。

参考视频/书籍:

  1. 动手学深度学习(李沐)
  2. up主——霹雳吧啦Wz(深度学习-目标检测篇),其提供了大量的实战代码,很简单上手(不会目标检测的人也能拿他代码轻松跑通)

在对目标检测基础知识了解完成之后,开始去kaggle/天池参加简单的目标检测比赛(参加经典的比赛,论坛讨论人数多,可参考代码多)

然后读当前方向相关论文,总结idea,得出新idea

目标检测和边界框

在之前所做的图像分类任务中,我们只关注如何识别其类别。然而,在CV领域,我们更感兴趣的不仅是他们的类别,还有他们在图像中的具体位置。这种任务我们便将它称为目标检测(object detection)或目标识别(object recognition)。

目标检测目前在多个领域被广泛应用,在无人驾驶里,我们需要通过识别拍摄到的视频图像里的车辆、行人、道路和障碍物的位置来规划行进线路。 机器人也常通过该任务来检测感兴趣的目标。安防领域则需要检测异常目标,如歹徒或者炸弹。

边界框

object detection中,我们经常使用边界框(bounding box)来描述对象的空间位置。

bounding box是矩形的,其表示方法一般有:

  1. 矩形左上角及右下角的x,y坐标决定
  2. 边界框重心的(x,y)轴坐标,以及框的宽度和高度

两者的转换方式可以在《动手学深度学习》中找到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#@save
def box_corner_to_center(boxes):
"""从(左上,右下)转换到(中间,宽度,高度)"""
x1, y1, x2, y2 = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
cx = (x1 + x2) / 2
cy = (y1 + y2) / 2
w = x2 - x1
h = y2 - y1
boxes = torch.stack((cx, cy, w, h), axis=-1)
return boxes

#@save
def box_center_to_corner(boxes):
"""从(中间,宽度,高度)转换到(左上,右下)"""
cx, cy, w, h = boxes[:, 0], boxes[:, 1], boxes[:, 2], boxes[:, 3]
x1 = cx - 0.5 * w
y1 = cy - 0.5 * h
x2 = cx + 0.5 * w
y2 = cy + 0.5 * h
boxes = torch.stack((x1, y1, x2, y2), axis=-1)
return boxes

锚框

在目标检测算法中,通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并且调整区域边界,从而更准确地预测目标的真实边界框(ground-truth bounding box)。

在后续,介绍的不同模型中,使用的区域采样方法可能不同,现在先介绍其中一种方法:以每一个像素为中心,生成多个缩放比(scale)和宽高比(aspect ratio)不同的边界框。这些边界框称为锚框(anchor box)。

生成多个锚框

对于锚框的生成方法,我目前不打算具体的深入了解。只需了解大致方法。

在《动手学深度学习》一书中,李沐老师所述方法为:以图像的每个像素为重心,生成不同形状的锚框:缩放比为$s∈(0,1]$,宽高比为$r>0$。 那么锚框的宽度和高度分别是$ℎs\sqrt r$和$ℎs/\sqrt r$。 请注意,当中心位置给定时,已知宽和高的锚框是确定的。

要生成多个不同形状的锚框,让我们设置许多缩放比(scale)取值$s_{1},…,s_{n}$和许多宽高比(aspect ratio)取值$r_{1},…,r_{m}$。

当使用这些比例和长宽比的所有组合以每个像素为中心时,输入图像将总共有$wℎnm$个锚框。 尽管这些锚框可能会覆盖所有真实边界框,但计算复杂性很容易过高。

在实践中,我们只考虑包含$s_{1}$或$r_{1}$的组合:

$(s_{1},r_{1}),(s_{1},r_{2}),…,(s_{1},r_{m}),(s_{2},r_{1}),(s_{3},r_{1}),…,(s_{n},r_{1})$

也就是说,以同一像素为中心的锚框的数量是$n+m−1$。 对于整个输入图像,将共生成$wℎ(n+m−1)$个锚框。(其实感觉还是很多)

交并比

我们要如何衡量,某一个anchor是否很好覆盖了图像中的目标位置呢?也就是说我们需要衡量anchorground-truth bounding box之间的相似性,杰卡德系数(Jaccard)可以衡量两组之间的相似性。

给定集合A,B他们的杰卡德系数为他们交集的大小除以他们并集的大小。
$$
J(A,B)=\frac{A\cap B}{A\cup B}
$$
于两个边界框,它们的杰卡德系数通常称为交并比(intersection over union, IoU),即两个边界框相交面积与相并面积之比。

使用非极大值抑制预测边界框

在预测时,我们先为图像生成多个锚框,再为这些锚框一一预测类别和偏移量。 一个预测好的边界框则根据其中某个带有预测偏移量的锚框而生成

当有许多锚框时,可能会输出许多相似的具有明显重叠的预测边界框,都围绕着同一目标。 为了简化输出,我们可以使用非极大值抑制(non-maximum suppression,NMS)合并属于同一目标的类似的预测边界框。

其主要工作原理如下:

对于每一个预测边界框B,目标检测模型会计算每个类别的预测概率。假设最大的预测概率为p,则该概率所对应的类别b即为其预测的类别。p称为预测边界框B的置信度。

在同一张图像中,所有预测的非背景边界框都会按照置信度降序排序,生成列表L。然后对L操作。

  1. 从L中选择置信度最高的预测边界框$B_{1}$作为基准,然后将所有与$B_{1}$的IoU值超过阈值$\epsilon$的非基准预测边界框从L中移除。那些非极大值置信度的边界框被抑制了。
  2. 从L中选取置信度第二高的预测边界框$B_{2}$作为又一个基准,然后将所有与$B_{2}$的IoU大于$\epsilon$的非基准预测边界框从L中移除。
  3. 重复上述过程,知道L中所有的预测边界框都层被用过,当作基准。此时,L中任意一堆预测边界框的IoU都小于阈值$\epsilon$。所以没有一对边界框过于相似
  4. 输出列表L中的所有预测边界框。