YOLO, You Only Look it Once
YOLO 以其速度和这个超酷的名字而著名,在吴恩达的 Deep Learning.AI 的课程里,他特意强调说 YOLO 的论文是视觉相关论文里少有的非常难懂的论文系列,他本人也花了很长时间加上和别人讨论才终于弄明白,因此我尽管十分喜欢 YOLO 这个名字,却也一直不敢深入研究,复习的时候发现优达的计算机视觉课程里专门讲了这个网络,也结合 Andrew 的介绍做一个记录以加深理解。
输出向量的整合
在 R-CNN 系列的网络的算法中由于结果需要输出一个分类和坐标值,因此最后会在网络的末端将这两个任务通过定义不同的损失函数而分别输出,而 YOLO 通过将这两项任务合并在一个向量 y = [Pc, C1, C2, ... Cn, bx, by, bh, bw] 中,其中 Cn 代表可能的分类, bx,by 则定义相应分类物体所在的边框的中点,bh,bw 则代表边框的宽和高,向量第一个元素位置的 Pc 用来确定当前窗口的输出向量当中是否包含某个待检测目标的概率,如果 Pc 为 0 则无需进一步确定这个向量中后续几个元素的值。
Grid VS Sliding Windows
采用传统的移动窗口检测 Sliding windows detection 非常耗时,而如果将滑动窗口比作卷积操作中的卷积核就会发现通过选择恰当的卷积操作,可以使得在原始图片中的滑动窗口与网络深层的 Feature Maps 中的独立网格窗口一一对应起来。具体来说,假设我们有一个 16x16x3 的图片,如果我们采用 10x10x3 大小的移动窗口,并且步长为 2,则共需要 16 个 10x10x3 的窗口可以覆盖整张图片,这些窗口也就是我们之前提到的 Regions of interests。此后我们需要将这 16 张 10x10x3 的图片分别输入给后续的卷积神经网络进行分类,假设后续的卷积神经网络具有如下的架构:
而如果我们把原始 16x16x3 的图片直接输入到同样架构的 CNN 中就会发现我们实际上可以在网络的更深层得到一个 4x4x8 的 Feature Map 来对应之前的 16 个待检测窗口:
YOLO 通过将网格将图片分割为小的检测单元 Grid,对每一个网格单元执行检测并输出前述检测向量 y,由于相邻窗口之间没有重叠,因此可以对图片的每一个网格位置只做一次检测,大大提高检测速度,这就是 You Only Look Once 的由来。
由于在实际检测环境中能够以网格的形式准确的捕捉到待检测目标的边界窗口 Bounding Box 的可能性非常小,为了使得网络可以通过学习来定位待检测目标的位置,需要做如下的设置:
- 在训练数据中,我们需要为每一个 Grid 设置一个前述的标签向量 [Pc, C1, C2, ... Cn, bx, by, bh, bw],且只有包含被检测对象中点的单元被标记为包含这一对象,即 Pc = 1,且标签向量中 bx,by 为对象的中点相对其所在的 Grid 中的位置,而 bw,bh 则为真实的边界框的宽度和高度相对于整个图片的比例
网络的输出向量的维度需要与 Grid 的设置相匹配,即对于前述的 16x16x3 的图片,如果我们将其按照 4x4x3 的尺寸进行网格划分,且输出向量 y 的维度设置为 8,则网络的输出则需要是 4x4x8
IOU和非极大抑制:在训练过后的实际检测中,网络可能会输出多个包含同一个待检测对象的窗口,此时算法会采用非极大抑制 Non-Maximum Suppression 的方式,首先直接去除掉 Pc 小于一定阈值(NMS Threshold)的窗口,并将 Pc 最大的那个 Bounding Box 作为基准窗口,在此基础再去除和基准窗口具有超过一定 IOU 比例(IOU Threshold)的窗口,从而减少输出窗口的数量。注意此时如果图像中包含多个不同的分类,则要分别对每一个分类的边界窗口实施一次非极大抑制
Suppress overlapping bounding boxes that do not have the maximum probability for object detection.
- 当存在多个待检测目标的边界之间有重合时,尤其是这些目标的中点同时出现在同一个 Grid 中时,可以通过选择预先设定的多个形状的 Anchor box,将每一个 Grid Cell的输出 y 构造成可以同时表达多个 Anchor box 形状的向量,即 [Pc, C1, C2, ... Cn, bx, by, bh, bw, Pc, C1, C2, ... Cn, bx, by, bh, bw] 的形式,其中每一组数值代表与对应 Anchor box 相匹配的输出。在训练数据中会将目标分配到既包含目标中点、又能够使得被检测目标的形状与某个 Anchor box 形状具有最大交并比(Intesection over Union, IoU)的网格中,即训练的标签将是一个 (Grid cell, anchor box) 对。即对于 3 x 3 的网格,如果输出中有 3 个分类,其输出的标签将变成 3 x 3 x 8 变为 3 x 3 x 16。注意当预定义的 Anchor box 的数量少于被判断目标的数量时,这个算法可能无法有效的构造输出;同时当两个目标物体具有相同的 Anchor box 形状时这个方法也将失效。