基于深度学习的目标检测算法分为2类:Two Stage和One Stage。
Two Stage:先预设一个区域,改区域称为region proposal,即一个可能包含待检测物体的预选框(简称RP),再通过卷积神经网络进行样本分类计算。流程是:特征提取 -> 生成RP -> 分类/回归定位。常见的Two Stage算法有:R-CNN、SPP-Net、Fast R-CNN、Faster R-CNN、R-FCN等。
One Stage:不用生成RP,直接在网络中提取特征值来分类目标和定位
。流程是:特征提取 -> 分类/回归定位。常见的One Stage算法有:OverFeat、YOLOv1、YOLOv2、YOLOv3、YOLOv5、SSD、RetinaNet等。
利用滑动窗口生成RP
对于Two Stage的算法,RP的产生是一个很耗时的过程:通过一个窗口从左到右,从上到下的在整张图片上以一定的步长进行滑动扫描,每次滑动的时候对当前窗口执行分类计算,如果当前窗口得到较高的概率,则认为检测到了物体。过程如下图所示,这个方法也叫滑动窗口。
滑动窗口其实就是个穷举的过程,由于事先不知道要检测的目标大小,所以要设置不同大小比例的窗口去滑动,而且要选取合适的步长。这样做就会非常耗时。R-CNN就是针对此的一个改进策略,利用一种启发式的方法只扫描可能包含目标的子区域。
利用非极大值抑制算法来挑出最优解
不管是哪个目标检测的算法,一个目标都会被多次检测到,我们会有很多结果,但是大多数的结果置信度都不高,我们利用非极大值抑制算法(NMS)就能挑出那个置信度最好的结果。
算法选择
那么我们该选择哪个算法来完成我们的任务呢?
我们需要根据前文确定的性能衡量指标,对所有的算法做横向对比,这样才能挑出来最好的那个方法。这个过程会比较耗时,对于我们完成任务将会是一个障碍,庆幸的是这个比较已经有牛人帮我们做了,我们此时先使用结果,然后在将来有时间自己再尝试做这个横向的性能比较。
根据mAP和识别时间对各种目标检测算法做的结果统计图,如果单从mAP的角度看,最好的选择是FPN FRCN,但是交互时间却能达到172ms;如果看YOLOv3,mAP是57.9,交互时间只有51ms。所以我们的识别算法选用YOLOv3。
YOLO网络设计
YOLO采用卷积网络来提取特征,使用全连接层来得到预测值。网络结构参考GooLeNet模型,包含24个卷积层和2个全连接层。对于卷积层,主要使用1x1卷积来做channle reduction,然后紧跟3x3卷积。对于卷积层和全连接层,采用Leaky ReLU激活函数,但是最后一层却采用线性激活函数。如图所示: