YOLO模型——思想、原理以及为什么使用网格、边界框
1. 前言
\qquad 提起YOLO模型,我想大部分和我一样的初学者不理解使用网格与边界框的原因。并且很多文章也只是讲清楚了流程但没讲清楚思想。本文从YOLO的思想本质为起点,详细介绍YOLO模型的原理。
2. YOLO的思路
2.1 从滑动窗口开始
\qquad 图像检测领域的滑动窗口是一种利用图像分类来实现目标检测的方法,它的思路是在图像上按照不同的大小和比例滑动窗口,然后把每个窗口内的图像片段送入一个预训练的分类器,判断是否存在目标物体。这个方法虽然简单直观,但是也有两个主要的缺陷:
-
窗口的尺寸和形状不够灵活,难以适应多样的目标
-
计算的开销很大,需要对大量的窗口进行分类,而且对窗口的大小和步长的选择比较敏感
2.2 改进
\qquad 下述内容不代表模型作者是如此想的,但有助于理解。看不懂这部分也没关系,可以接着往下看再重新回顾。下面的内容更多是在讨论YOLO使用网格、边界框的原因。个人认为理解YOLO为什么使用网格、为什么使用边界框比理解YOLO的流程、使用YOLO更加重要。
2.2.1 R-CNN
\qquad 假如用神经网络直接预测出所有物体的位置,或者说所有物体候选区,再判断每一个候选区的类别,这样不仅能解决窗口尺寸的问题,同时计算量减少了(相对于滑动窗口来说)。也就是将图像检测分为两步:
\qquad \qquad 1. 产生候选区。
\qquad \qquad 2. 对每个候选区分类。
\qquad 最终把图像检测转换为了一个分类问题,这种方法被称为R-CNN,属于两阶段模型。
2.2.2 YOLO
\qquad 滑动窗口方法中,窗口在滑动时,因为步长和窗口大小等原因可能会出现窗口产生的区域/图像块重叠的情况,也有窗口产生的区域之间有缝隙的情况,那么我们可以不用滑动窗口,直接将图片分成 S × S S\times S S×S个区域(网格),再用神经网络来判断每个网格的分类,这样就避免了网格之间的重叠和缝隙的问题。
\qquad *需要注意的是:在滑动窗口方法中,窗口滑动后产生的区域只负责判断一个类别。分成S×S个网格之后仍是如此。
\qquad 将图片分成 S × S S\times S S×S个网格以及知道了每个网格的分类后,就差物体标识框的大小与位置了。这个时候再想想滑动窗口怎么做的?滑动窗口是窗口滑动产生了区域(你也可以当成网格,暂且不必纠结概念区别),而现在是先有了网格,那就用神经网络在网格中生成一些窗口呗!每个网格的窗口(边界框)数量为B个(如果每个网格生成的边界框数量不同就会很乱,不如生成数量相等的,之后再判断去除)。而且正因为网格已经分好了,每个网格生成的窗口可以随意了!
\qquad 滑动窗口每次滑动时,窗口大小是不能变化的。相对位置也是固定的:因为窗口产生的区域与窗口大小相同,窗口的中心位置就等于产生的区域中心位置。但是上述说的网格划分好了之后,每个网格之间生成的窗口互不干扰。就像图中(示例图!)的红色框和蓝色框大小可以不同,位置也可以随意。
\qquad 那怎么知道一个边界框在哪个网格中呢?那就看边界框中心在哪个网格。正因为这点,边界框愿意多大就多大,愿意多小就多小,反正只要边界框中心在网格中,这个边界框就还是这个网格的。
\qquad 从窗口滑动产生区域,变成了先划分区域,再从区域生成窗口。
\qquad 总的来说,上述做法的步骤就是
\qquad \qquad 1. 分成 S × S S\times S S×S个网格
\qquad \qquad 2. 生成 S ×