目标检测问题
分为两个子问题:
- 找到图片中哪些位置、哪些区域含有目标对象
- 识别这些区域中的目标对象是什么
基于CNN的目标检测算法能够很好的解决第二个问题,在一张图片仅含一个对象,且该对象占据了整张图片绝大部分面积时,基于CNN的对象识别算法具有很高的准确率。
一种定位目标对象的朴素思路是首先对图片进行地毯式搜索,遍历图片中所有可能出现目标对象的区域,并对每个区域进行目标对象的检测操作;然后从所有区域的目标检测结果中挑选一个概率最大的作为最终结果并输出。显然,这种方法效率很低。
为了提高解决目标检测问题的效率,R-CNN(Region-CNN)开创性地提出了基于候选区(Region Proposals)进行目标检测的选择性搜索(Selective Search)方法——先从图片中搜索出约1000至2000个可能存在目标对象的候选区,然后对每个候选区进行目标对象识别操作。这种方法大幅提升了目标检测的效率。
不过R-CNN的效率依然不高——处理一张图片大概需要49秒。开发者针对神经网络结构和候选区算法进行不断改进,推出了速度更快的Fast R-CNN和Faster R-CNN。Faster R-CNN可以达到约0.2秒/张图片的速度。
但是!!!因为该类检测算法始终需要分为两个阶段,先选出候选去,再识别候选区中的对象。这在根本上限制了R-CNN算法性能的进一步提升。
YOLO算法简介
YOLO(You Only Look Once)是一种基于深度神经网络的目标对象识别和定位算法,其特点是运行速度快、实时性高。在本实验中,我们将使用Tiny YOLOv2版本的YOLO算法。
YOLO算法创造性地将R-CNN目标检测中的选择候选区和识别候选区对象两个阶段合二为一,这也是YOLO名字的来由(只需看一眼就知道图片的哪些位置有什么对象)。
在检测目标时,YOLO首先将图片划分为7×7=49的网格,并允许在每个网格中预测出2个可能包含目标对象的候选边框(Bounding Box)。可将YOLO算法产生的98个Bounding Box理解成98个候选区,它们粗糙地覆盖了整张输入图片。
不管是R-CNN还是YOLO,都需要对选出的候选区进行目标对象的识别操作。识别出某个候选区中的对象后,往往需要对该候选区进行微调,使之包含整个对象,这个微调的过程称为候选区的边框回归。边框回归行之有效的原理是对象识别结果的分类信息中已经包含了对象的位置信息。比如当我们看到猫的脸和身体,我们就能推测出猫耳朵和屁股所在的位置。
2.1 YOLOv1算法和网络模型
R-CNN系列算法的基本思路是候选+识别/分类,因此被称作是两级级联(Two-Stage Cascade)的算法。而YOLOv1算法则更为直接——直接在输出层对Bounding Box的位置和其中的对象所属的类别进行回归,从而将目标检测问题转换为回归问题(Regression)。
YOLOv1的主要流程包括图片分割、CNN和非极大值抑制。
Step 1: 图片分割
讲输入图片的大小缩放到448x448,并进行分割,得到一个7x7的网格。每个网格允许预测出两个可能包含目标对象的Bounding Box,因此共有98个Bounding Box。
每个Bounding Box可以定义为5元组 B B o x = ( X c , Y c , W , H . C o n f ) BBox=(X_c,Y_c,W,H.Conf) BBox=