1.3.2 深度学习算法
HOG和DPM检测器之后,再也没有出现特别突出的人工目标检测器,尤其是在2010年~2012年,目标检测算法性能的提升非常缓慢,基本上处于停滞状态。直到2012年,基于卷积神经网络(CNN)的特征在图像分类任务中取得了巨大的进展,CNN特征重新被业界重视起来。2014年R.Girshick等人将CNN特征应用到了目标检测场景中,此后,目标检测算法有了飞速的发展。
从算法处理的流程来划分,基于深度学习的目标检测算法可分为两阶段(Two-Stage)算法和一阶段(One-Stage)算法,两阶段算法需要先进行候选框的筛选,然后判断候选框是否框中了待检测目标,并对目标的位置进行修正;一阶段算法没有筛选候选框的过程,而是直接回归目标框的位置坐标和目标的分类概率。
1.两阶段算法
两阶段算法包含选择候选框和修正目标分类/位置两个阶段,对这两个阶段的不同处理方式,构成了不同的算法方案。
(1)R-CNN算法
2014年,R.Girshick等人提出了R-CNN算法。R-CNN算法的思路非常简单,首先基于Selective Search方法从原始图像中筛选出若干候选框,然后将每个候选框中的图像缩放的固定尺度送入卷积网络提取特征,最后通过支持向量机(SVM)方法对特征进行分类,判断候选框中的图像是背景还是我们关注的目标类型。在VOC2007数据集上,R-CNN算法相比之前的检测算法,在性能有了显著的提升(从33.7%提升到58.5%),是检测算法的一个里程碑式的突破。
虽然R-CNN在算法性能上取得了巨大的进展,但弊端也非常明显,因为需要分别从2000多个候选框中提取特征,所以效率非常低,后续各种算法正是为了解决这一问题而提出的一系列改进方案。
(2)SPP-Net算法
2014年,何恺明等人提出了SPP-Net(Spatial Pyramid Pooling Networks,空间金字塔池化网络)算法。R-CNN算法要求输入卷积网络用来提取特征的子图像尺寸固定,比如Alex-Net就要求输入的图像大小为固定的224像素×224像素,而SPP-Net算法则去掉了这一限制。SPP-Net算法基于一个空间金字塔池化层(SPP layer),无论输入的子图像大小如何,都会将子图像采样成固定大小的图像。在使用SPP-Net进行检测的过程中,对原始图像只需要进行一次卷积网络计算,在得到整幅图像的特征图之后,通过空间金字塔池化层将每个候选框区域(ROI)都分别采样成相同尺寸的子图像,将相同尺寸的各个子图像送入后续的网络进行特征提取,提取的特征具有相同的维数,最后送入全连接层进行分类。SPP-Net不需要进行多次卷积网络计算,与R-CNN相比,在算法精度不变的情况下,算法的速度有了20倍的大幅提升。
(3)Fast R-CNN算法
2015年,R.Girshick等人提出了Fast R-CNN算法,其本质是在R-CNN和SPP-Net的基础上进行了进一步改进。Fast R-CNN可以在网络里同时预测目标的分类概率和位置偏移。在VOC2007数据集上,Fast R-CNN将mAP(mean Average Precision,平均精度均值)从58.5%提升至70.0%,算法速度也比R-CNN有了200倍的提升。虽然Fast R-CNN的性能和速度相比R-CNN和SPP-Net有了明显的改善,但整体速度仍然受到候选框检测算法的制约,为了解决这个问题,Faster R-CNN算法诞生了。
(4)Faster R-CNN算法
2015年,S.Ren等人提出了Faster R-CNN算法,Faster R-CNN是第一个端到端算法,也是第一个接近实时深度学习的目标检测算法。使用ZF-Net网络骨架,在VOC2007数据集上,mAP达到了73.2%,算法速度达到了17fps。
Faster R-CNN最主要的贡献是使用卷积网络检测候选框。检测候选框、预测目标的类别、回归目标位置的偏移量,共享底层卷积特征,整个算法流程融合成了一个完整的端到端学习框架。Faster R-CNN突破了候选框检测的速度瓶颈,是一种十分重要的两阶段算法。
(5)FPN算法
2017年,Lin等人在Faster R-CNN的基础上提出了FPN(Feature Pyramid Net works,特征金字塔策略)算法。在FPN之前,绝大多数深度学习检测器都是基于卷积网络最顶层的特征图进行计算的。深层特征包含全局信息,却弱化了细节信息,使用深层特征在小目标检测,尤其是精准定位方面,有着较大的劣势。FPN采用top-down结构以及侧连方法,将深层特征和浅层特征进行融合,使得特征既包含全局信息又包含细节信息。另外,检测计算也基于特征金字塔的多层特征图,具有更强的多尺度适应性。基于FPN的Faster R-CNN算法在COCO数据集上取得了最优的性能。当前,FPN已经成为构建检测算法的基础策略。
2.一阶段算法
一阶段算法和两阶段算法最主要的区别,就是没有单独的候选框筛选阶段,而是直接回归目标的位置坐标和分类概率。常用的一阶段算法如下。
(1)YOLO算法
2015年,R.Joseph等人提出了YOLO(You Look Only Once)算法,这是首个深度学习领域的一阶段算法。从名字就可以看出,YOLO没有两阶段算法中提取候选框和验证分类两个步骤,图像送入一个神经网络就能完成整个预测过程。YOLO算法的实现方案是,先把原始图像划分成网格,然后基于网格的每个单元格回归目标的类别概率和位置坐标。作为一阶段算法,YOLO的一个最大优点就是速度快,在VOC2007数据集上,mAP为63.4%,检测算法速度可以达到45fps;YOLO的加速版本mAP为52.7%,速度甚至可以达到惊人的155fps。
不过,YOLO也有不尽如人意的地方,在目标位置的精度上比两阶段算法有所降低,尤其是在对一些小目标的检测方面,效果明显变差。正因为存在这些问题,后续YOLO的版本以及其他一阶段算法,都致力于更好地解决上述问题。
(2)SSD算法
2015年,W.Liu等人提出了SSD(Single Shot MultiBox Detector)算法,这是深度学习领域的第二个一阶段算法。与仅使用最顶层特征图进行预测的方法不同,SSD最主要的贡献是引入了基于多尺度特征图的检测策略,显著提升了算法的性能,尤其是在小目标检测方面,相比YOLO有了明显的改善,在VOC2007数据集上,mAP达到了76.8%。
(3)Retina-Net算法
Retina-Net算法的主要目的是解决正负样本不平衡的问题。常规的一阶段算法在提取训练样本的过程中,背景样本的比例远大于目标样本的比例。正负样本的极度不平衡会导致训练过程中模型较少关注目标样本,这也是一阶段算法的精度低于两阶段算法的主要原因。Retina-Net算法引入了损失函数,其核心思想是在训练过程中,对传统的交叉熵损失加上权重,使得错分的样本产生的损失在最终损失中占有更大的比例。引入损失函数,使得一阶段算法在保持速度优势的前提下,保证了目标检测的精度。
(4)FCOS算法
2019年,沈春华团队提出了FCOS(Fully Convolutional One-Stage)算法。和SSD等一阶段算法不同,FCOS是一种“anchor free”方法,回归目标位置不需要预先设定anchor,在待检测目标尺度和形态变化较大的场景中有重要的应用。另外,FCOS算法在具体实现的过程中也使用了FPN策略,对于多尺度的目标有更好的检测效果。