深度学习(17):目标检测

目标定位

我们已经了解了简单的图像分类问题,即判断一个图片里有没有物体A。我们的神经网络输出往往只是1个数字,代表出现物体A的概率p。
对于目标定位问题,我们除了要判断有没有物体A,还要圈出A的位置。这时候我们的输出就不应该只有p,还应该标注A的位置。
因此对应目标定位问题,我们要同时输出:出现物体的概率、物体的位置信息、物体的种类信息。才能完成一个多目标定位。

特征点检测

有时候我们需要检测出图片的特征点,例如人脸的眼睛。这时候只需要在输出里面增加眼睛位置的坐标即可得到特征点。

滑动窗口目标检测

为了能够确定目标并表明位置,我们采用这样的方式。
首先对训练集进行裁剪使得整张图片都是目标物体,得到一个网络。这个网络能够判断整张图片是否为物体A
深度学习(17):目标检测
利用这个网络,我们构建一个小窗口,将小窗口放在大图片上逐行逐列扫描。每轮扫描窗口大小也会发生变化,最终发现某个窗口识别出物体A时,将该窗口的边界作为我们的输出边界。
深度学习(17):目标检测
这样做的问题在于:边界不够精确,扫描次数太多

卷积的滑动窗口

为了解决滑动窗口扫描次数多的问题,我们引入卷积版滑动窗口,可以1次计算出多个位置窗口的输出。

首先我们发现,卷积神经网络的FC层(全连接)其实可以被看成是卷积化:
深度学习(17):目标检测
拿第二层FC举例,本来的400个全连接神经元可以看成是1 * 1 * 400 的过滤器。
深度学习(17):目标检测

在这个基础上,我们拿一个大的图片进行识别,最终的输出不再是1 * 1,而是 8* 8。而每个位置的输出,都对应着原图片上一个小窗口的输出。
这样一来利用了许多重复计算,1次计算多个窗口

YOLO

IoU
用来比较预测的两个框是否重叠,方法是用两个框的交集面积/并集面积
深度学习(17):目标检测
YOLO的基本思想如下:
将一张图片分成19 * 19 的单元,如果一个单元判断自己这有东西(输出p比较高):代表着它判断某个物体的中心点在自己这,同时它还会给出这个物体相对于自己这个单元格的框。由这些信息对目标进行检测。

问题1:很多个单元都认为自己拥有同一个物体,怎么办?
非极大值抑制
我们知道,如果两个单元都认为拥有同一个物体,那么它们的框的IoU一定很大。所以我们的思路是:找到目前对自己最有信心的单元格(p最大),将它的框A作为我们的输出,随后把和框A IoU较大的其他框全部删除,不断循环能够得到唯一的输出
深度学习(17):目标检测

问题2:一个单元里面有两个不同物体,怎么办?
Anchor boxes
对于两个物体,它们的形状往往不同(例如人瘦高,车扁平)。因此我们可以设计一些不一样的Anchor boxes,每当一个单元认为自己这里有货并确定出框的时候,我们将它的框的形状与Anchor boxes比较,将其输出扔到与之最为相近的Anchor boxes内

这样一来我们的输出格式如下
(样例数, 19, 19, Anchor boxes数, 输出参数维度)
(m,i,j,k)代表着模型在第m个样例上,(i,j)位置的单元对于第k个Anchor boxes样式的预测