检测的本质也是分类,只不过是将图像划分成一个个图像小块,对每个小块来判断有人或者是没人,再通过非极大值抑制得到整幅图像有人还是没人,如果有人的话,人的位置在哪里。
1、RCNN——Faster-RCNN
1.1 RCNN
RCNN和传统的目标检测方法一样,分为四个步骤:提取框、对每个框提取特征、图像分类、非极大值抑制。
差别在于以下几点:
(1)采用Selective Search代替传统的穷举法来找到提取框,减少一部分计算量。
(2)采用深度卷积网络提取特征,代替传统的特征(如SIFT、HOG特征等)。这里要注意一点,CNN通常只接受一个固定大小的图像,而取出的区域大小却各有不同,所以会先将先将区域缩放到统一大小,再使用CNN提取特征。
缺点:计算量太大,计算速度慢。
1.2 SPPNet
我们希望将原始图像中的不同长宽的区域,都对应到一个固定长度的特征向量(才能统一进行分类),这样就完成了各个区域的特征提取工作。而RCNN要对每个区域计算卷积,SPPNet网络只需要计算一次,原因在于引入了ROI池化,可以把任意宽度高度的卷积特征,转化为固定长度的向量。提升效率。
1.3 Fast-RCNN
相比于SPPNet使用SVM做分类器,这里直接使用神经网络进行分类,于是使用一个网络同时完成了提取特征、判断类别、框回归三项工作,相比SPPNet网络获得了更高的准确度。
1.4 Faster-RCNN
采用RPN网络自动选取候选框,取代原来的Selective Search提取框,工作原理如下:
假设前置CNN提取的特征为w*h*c,每个位置对应K种尺寸(超参数)框的检测,将每个位置转换为一个统一的256维的特征,会得到k*(2+4)的输出,2表示是物体的概率+不是物体的概率,4用来确定提取框。
RPN网络和分类网络交替训练,速度和准确率得到进一步提升。
项目 | 传统方法 | RCNN | SPPNet | Fast-RCNN | Faster-RCNN |
提取候选框 | 滑动窗口穷举 | Selective Search | Selective Search | Selective Search | RPN |
提取特征 | SIFT、HOG特征等 | CNN | CNN+ROI |
卷积神经网络+ROI池化 | |
特征分类 | SVM | SVM | SVM |
2、非极大值抑制NMS
目标检测问题中,输出边界框往往是堆叠在一起的。因此,我们需要NMS从堆叠的边框中挑出最好的那个。算法步骤如下:
(1)将所有的框按类别划分,若所有框的都被判断为背景类,则NMS不执行。
(2)对每个物体类中的边界框(B_BOX),按照分类置信度降序排列。
(3)在某一类中,选择置信度最高的边界框B_BOX1,将B_BOX1从输入列表中去除,并加入输出列表。
(4)逐个计算B_BOX1与其余B_BOX2的交并比IoU,若IoU(B_BOX1,B_BOX2) > 阈值TH,则在输入去除B_BOX2。
(5)重复步骤3~4,直到输入列表为空,完成一个物体类的遍历。
(6)重复2~5,直到所有物体类的NMS处理完成。
(7)输出列表,算法结束
3. YOLO、SSD、一步法与两步法
3.1 YOLO和SSD的网络结构
假设前置CNN提取的特征为w*h*c,每个位置对应K种尺寸(超参数)框的检测,将每个位置转换为一个统一的256维的特征,会得到k*(B+1+4)的输出,1表示是物体的概率,4用来确定提取框,B等于具体细分类的类别。
3.2 一步法与两步法
Faster-RCNN中,RPN网络做二分类:前景和背景;接下来的CNN网络做细分类,具体是猫、狗等。
YOLO和SSD采用类似RPN的网络结构,直接做细分类。
因此,Faster-RCNN两步法,更准确;YOLO和SSD一步法,更快。
3.3 YOLO为何对小物体检测效果不好?
虽然每个格子可以预测B个bounding box,但是最终只选择IOU最高的bounding box作为物体检测输出,即每个格子最多只预测出一个物体。当物体占画面比例较小,如图像中包含畜群或鸟群时,每个格子包含多个物体,但却只能检测出其中一个。这是YOLO方法的一个缺陷。
3.4 SSD为何对小物体检测效果比YOLO好?
Yolo只在最后一层特征进行物体检测定位预测。
SSD在多层特征图上设置不同尺寸的Anchor,选取多个层特征分别进行定位回归预测结果,每一层的检测结果融合得到最终结果。由于是多尺度的,因此在感受小的特征层对小物体预测效果比较好,在感受野大的特征层对大物体预测效果比较好。