三、算法概述
在近些年的发展中,各类目标检测算法层出不穷,不过大体上可为以R-CNN为代表的两阶段算法以及以YOLO为代表的单阶段算法,下面将对这两种算法进行简单概述:
1、两阶段算法
两阶段算法主要包含区域提议和区域识别两个阶段,通过结合先进Backbone和多尺度FPN技术可以实现较为优越的检测精度,使用范围也较广。
R-CNN
R-CNN中采用Selective Search方式生成候选提议框,避免了传统方法中穷举式滑窗所带来的繁琐。在生成候选区域后,R-CNN模型采用基于AlexNet的CNN模型进行特征提取,以取代传统HOG特征或Haar特征方法。提取出的特征会被送到SVM分类模型中,每个类别对应一个SVM分类器,选取最高置信度作为结果。
在模型测试阶段,R-CNN中采用NMS非极大值抑制方法以获取无冗余的区域子集。
虽然这种方法相较于传统DPM方法在效率和精度上有所提升,但在候选区生成阶段,由于模型至少生成2000个以上候选框,每个框在CNN中传播时都要耗费大量时间,且由于重叠部分会通过相同卷积核计算两次,缩放会导致计算结果不同,从而检测出不同结果。例如对于重叠的人骑马部分,有时会检测成人,有时会检测成马。
Fast R-CNN
Fast R-CNN是为了减少R-CNN计算量而诞生的,该方法在产生提议框阶段保留了R-CNN中的Selective Search方法,仍依赖传统CV方法。但针对第二阶段区域识别任务,该模型将卷积层由之前的仅应用提议框改为应用到全图,从而一次性计算出所有位置图像特征,随后裁剪出提议框所对应区域的特征图,将其送入全连接层进行计算分类,不过需要注意的是,由于提议框大小不同,因此特征区域需要通过RoI Pooling或RoI Align方法处理为固定尺寸后,才可输入全连接层。
2、单阶段算法
与两阶段算法中对锚框进行二分类来区分是否存在目标物体不同,单阶段算法在生成全局特征图后,直接对每个锚框进行多分类来以此提高检测效率,通过这种方法提出的模型结构简单、速度快,且易于在设备上部署,在工业界很受欢迎,虽然早期因为主干网络和多尺度技术不成熟问题在性能上弱于两阶段算法,但随着算法性能的不断提升,目前逐渐成为目标检测的主流方法。
YOLO
作为最早的单阶段算法之一,YOLO将目标检测问题转化为直接从图像中提取边界框和类别概率的回归问题,直接输出目标类别和位置,其自行设计的DarkNet结构由两层全连接层作为检测头预测结果,输出预测框位置以及预测框和真实值的IoU Score。
YOLO将原图切分成 S×S 大小的格子,对应预测图上 S×S 个位置,如果原图上某个物体的中心位于某个格子内,则对应位置的预测值应给出物体类别和B组边界框位置,其余位置则预测为背景类别,不涉及边界框预测结果
在Pascal VOC数据集上,YOLO使用VGG 16作为backbone后,相较于同样backbone的Fast R-CNN,可以达到三倍的检测速度
但由于每个格子只能预测 1 个物体,因此对重叠物体、尤其是大量重叠的小物体容易产生漏检,而直接回归边界框有难度,回归误差较大,故自YOLO v2 开始使用锚框。
样本不均衡问题: 需要注意的是,在单阶段算法中,需要对每个锚框进行多分类任务,在训练时计算每个预测的分类损失。但是显然在图像中,锚框的数量常常远大于真值框,即存在大量的锚框其所预测的真值仅为背景部分,这部分数据即为目标检测时的负样本。这些负样本占据数据的主要部分,会使得训练出的分类器更倾向于预测背景,从而出现漏检现象,而两阶段检测器通过区域提议拒绝了大量负样本,区域检测头接收的正负样本比例并不悬殊,因而不会出现该问题,检测精度也高得多。