开山之作:RCNN
RCNN算法由Ross Girshick等人发表在CVPR 2014,将卷积神经网络应用于特征提取,并借助于CNN良好的特征提取性能,一举将PASCAL VOC数据集的检测率从35.1%提升到了53.7%
RCNN算法流程图如下图所示,RCNN仍然延续传统物体检测思想,将物体检测当做分类任务处理,即先提取一系列的候选区域,然后对候选区域进行分类
具体过程主要包含四步:
- 候选区域生成。采用Region Proposal提取候选区域,例如Selective Search算法,先将图像分割成小区域,然后合并包含同一物体可能性最高的区域,并输出,在这一步提取约2000个候选区域。在提取完后,还需要将每一个区域进行归一化处理,得到固定大小的图像
- CNN特征提取。将上述固定大小的图像,利用CNN网络得到固定维度的特征输出
- SVM分类器。使用线性二分类器对输出的特征进行分类,得到是否属于此类的结果,并采用难样本挖掘来平衡正负样本的不平衡
- 位置精修。通过一个回归器,对特征进行边界回归以得到更为精确的目标区域
RCNN虽然显著提升了物体检测效果,但仍然存在3个角度问题 - RCNN需要多步训练,步骤繁琐且训练速度较慢
- 由于实际分类中的全连接网络,因此输入尺寸是固定的,造成了精度的降低
- 候选区域是需要提前提取并保存,占用空间较大
端到端:Fast RCNN
在RCNN之后,SPPNet算法解决了重复卷积计算与固定输出尺度两个问题,但仍然存在RCNN的其他弊端。在2015年,Ross Girshick独自提出了更快、更强的Fast RCNN算法,不仅训练的步骤可以实现端到端,而且算法基于VGG16网络,在训练速度上比RCNN快了近9倍多,在测试速度上快了213倍,并在VOC 2012数据集上达到了68.4%的检测率
Fast RCNN算法框架如下图所示,相比RCNN,主要有3点改进
- 共享卷积:将整幅图送到卷积网络中进行区域生成,而不是像RCNN那样一个个的候选区域,虽然仍采用Selective Search方法,但共享卷积的优点使得计算量大大减少
- RoI Pooling:利用特征池化(RoI Pooling)的方法进行特征尺度变换,这种方法可以有任意大小图片的输入,使得训练过程更加灵活、准确
- 多任务损失:将分类与回归网络放到一起训练,并且为了避免SVM分类器带来的单独训练与速度慢的缺点,使用了softmax函数进行分类
Fast RCNN算法虽然取得了显著的成果,但在该算法中,Selective Search需要消耗2~3秒,而特征提取仅需要0.2秒,因此这种区域生成发方限制了Fast RCNN算法的发挥空间,这也为后来的Faster RCNN算法提供了改进方向
走向实时:Faster RCNN
Faster RCNN算法发表于NIPS 2015,该算法最大的创新点在于提出了RPN(Region Proposal Network)网络,利用Anchor机制将区域生成与卷积网络联系到一起,将检测速度一举提升到了14 FPS(Frames Per Second),并在VOC 2012测试集上实现了70.4%的检测结果
Anchor可以看做是图像上很多固定大小与宽高的方框,由于需要检测的物体本身也是一个个大小宽高不同的方框,因此Faster RCNN将Anchor当做强先验的知识,接下来只需要将Anchor与真实物体进行匹配,进行分类与位置的微调即可。相比起没有Anchor的物体检测算法,这样的先验无疑降低了网络的收敛速度,再加上一系列的工程优化,使得Faster RCNN达到了物体检测侧中的一个高峰