一、传统的目标检测思路
目标检测简而言之就是识别图片上的物体,标注位置,并将其分类。传统目标检测包括物体定位和物体分类,即先确定物体位置,再进行物体特征的提取,再分类。
大致分为三步:
- 选取感兴趣区域,即选取可能包含物体的区域——选取区域;
- 对可能包含物体的区域进行特征提取——特征提取;
- 对提取的特征进行检测分类——目标分类。
其中最重要的就是候选区域的生成,传统的候选区域生成大致有三种方法,分别是滑动窗口(Sliding Window),选择性搜索(Selective Search),EdgeBoxes。
1.1. 滑动窗口(Sliding Window)
传统的目标检测算法采用滑动窗口的方式,即一个固定大小的窗口在检测图片上滑动,依次选取区域进行特征提取,再对提取的特征进行分类,判断是否包含某类物体。
但物体有大有小,用同一尺寸的窗口选取区域会出现三种情况
- 理想情况,滑动窗口正好框住物体
- 滑动窗口>物体大小,会选取较多背景,物体识别效果较差,准确率低。
- 滑动窗口<物体大小,对物体局部进行特征提取。产生误分类或多个正确识别的分类
因此需要设计不同大小的窗口,进行区域选取,会产生大量的计算,影响运行速度。
1.2选择性搜索
既然一副图像中物体可能只占一小部分,那着重扫描可能含有物体的区域效率不是更高吗?这也是后续优化的主要思想和方向。
选择性搜索是一种启发式算法,通过分割和合并图像区域来生成可能包含物体的候选框。通俗地来说选择性搜索类似于拼图。
- 一个物体由一些相似的小部分构成,在颜色、纹理等方面会非常相似。
- 选择性搜索把图片切割成许多小区域,小区域如同小拼图块,再逐步把相似的拼图块合并在一起,形成更大的拼图块。
- 如此产生一些不同大小和形状的大拼图块,即是候选框,每个候选框会有一个分数,对应物体存在的可能性大小,最后根据分数确定一些候选框进入下一步处理,判断是否有物体。
1.3EdgeBoxes
EdgeBoxes利用图像中的物体的边缘信息来估计物体的位置和大小,从而生成可能包含物体的候选框。
- 图中包含的物体肯定会有边界,找到边界也就大致找到了物体。
- EdgeBoxes在图片上移动一个特殊的检测区域,检测不同的边缘变化,如果存在就可能存在物体。
- 如此产生一些可能的区域,再用固定大小的窗口去检测可能的区域,并赋一个分数,作为可能的候选框,最后根据分数去选择候选框,进入下一步处理,判断是否有问题。
传统的物体定位不管选用何种的候选区域生成方法,选取候选框花费的时间都是难以避免的,那么去除候选框选取的步骤能否大幅加快检测速度呢?
二、YOLO
2.1YOLO
上述的传统目标检测基本都是**双阶段(two-stage)检测,即先选取候选框,再进行检测,精度较高,但速度较慢,不能满足实时性需求,速度更快的单阶段(one-stage)**检测算法YOLO(YouOnlyLookOnce)应运而生。
2.2单阶段检测和双阶段检测
单阶段(one-stage)目标检测网络与双阶段(Two-stage)检测的有着显著区别,简单来说双阶段检测需要经历定位(候选框生成)和检测识别(物体分类和定位)两个阶段,而单阶段的定位和检测识别在同一阶段。
- 双阶段检测由算法计算出目标候选框,再通过神经网络对目标候选框进行分类与回归。
- 单阶段检测,不再需要候选区域,仅使用卷积神经网络直接将目标定位框转为回归问题。
传统目标检测的两个阶段二合一之后速度显著提升,能满足实时检测的要求。那么YOLO不使用目标候选框是如何定位问题的呢?
2.3YOLO检测策略
YOLO抛弃了传统的的候选区域检测策略,而是采用**“分而治之”**的策略。
YOLO将输入图像均匀划分为许许多多大小相同的网格,由每个网格单元去检测其范围内是否存在目标,在网格内部使用不同的大小锚框(Anchor boxes)进行捕捉物体,并完成对物体的定位,特征提取,物体分类等。
具体的检测策略如下:
YOLO v1将一张图片平均分成7×7个网格,如果某个object的中心落在这个网格中,则这个网格就负责预测这个object。
- 将一幅图像分成S×S个网格(grid cell),如果某个物体的中心落在这个网格中,则这个网格就负责预测这个物体。
- 每个网格要预测B个边界框(bounding box),每个边界框要预测(x,y,w,h)和confidence共5个值,还要预测C个类别信息,记为C个类。
(x,y指的是x,y坐标,w,h指宽和高,confidence为置信度即是某个类的可能性,C个类别信息为预设要检测的物体类别)注:在目标检测模型中,边界框回归用于微调模型设定或者学习到的候选框位置,使这些边界框更加接近实际的标注框,是提高目标检测精度的关键步骤之一。
- S×S个网格,每个网格要预测B个边界框,还要预测C个类。网络输出就是一个S×S×(5×B+C)的张量。
YOLO v1把一张图片划分为了7×7个网格,每个网格预测2个Box(Box1和Box2),20个类别。网络输出的shape:7×7×30。