写在前面
目前暂定方向:
- 先考虑单无人机,解决多目标检测、定位与目标移动轨迹预测问题。
- 后续,从多个无人机的视角中检测出同一个物体,多视角的目标检测问题,应该侧重的难点在于多个摄像头的数据融合,视角变化等的问题。
所以目前应该先学习一下目标检测的基本知识,考虑到之前对CV有一些基本的了解,因此直接看目标检测知识。
参考视频/书籍:
- 动手学深度学习(李沐)
- up主——霹雳吧啦Wz(深度学习-目标检测篇),其提供了大量的实战代码,很简单上手(不会目标检测的人也能拿他代码轻松跑通)
在对目标检测基础知识了解完成之后,开始去kaggle/天池参加简单的目标检测比赛(参加经典的比赛,论坛讨论人数多,可参考代码多)
然后读当前方向相关论文,总结idea,得出新idea
目标检测和边界框
在之前所做的图像分类任务中,我们只关注如何识别其类别。然而,在CV领域,我们更感兴趣的不仅是他们的类别,还有他们在图像中的具体位置。这种任务我们便将它称为目标检测(object detection)或目标识别(object recognition)。
目标检测目前在多个领域被广泛应用,在无人驾驶里,我们需要通过识别拍摄到的视频图像里的车辆、行人、道路和障碍物的位置来规划行进线路。 机器人也常通过该任务来检测感兴趣的目标。安防领域则需要检测异常目标,如歹徒或者炸弹。
边界框
在object detection中,我们经常使用边界框(bounding box)来描述对象的空间位置。
bounding box是矩形的,其表示方法一般有:
- 矩形左上角及右下角的x,y坐标决定
- 边界框重心的(x,y)轴坐标,以及框的宽度和高度
两者的转换方式可以在《动手学深度学习》中找到
1 | #@save |
锚框
在目标检测算法中,通常会在输入图像中采样大量的区域,然后判断这些区域中是否包含我们感兴趣的目标,并且调整区域边界,从而更准确地预测目标的真实边界框(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是否很好覆盖了图像中的目标位置呢?也就是说我们需要衡量anchor和ground-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操作。
- 从L中选择置信度最高的预测边界框$B_{1}$作为基准,然后将所有与$B_{1}$的IoU值超过阈值$\epsilon$的非基准预测边界框从L中移除。那些非极大值置信度的边界框被抑制了。
- 从L中选取置信度第二高的预测边界框$B_{2}$作为又一个基准,然后将所有与$B_{2}$的IoU大于$\epsilon$的非基准预测边界框从L中移除。
- 重复上述过程,知道L中所有的预测边界框都层被用过,当作基准。此时,L中任意一堆预测边界框的IoU都小于阈值$\epsilon$。所以没有一对边界框过于相似
- 输出列表L中的所有预测边界框。