前言:
RCNN全称是Regions with CNN Features,是将深度学习应用到物体检测领域的经典之作,并凭借卷积网络出色的特征提取能力,大幅度提高了物体检测的效果。虽然RCNN显著地提高了物体检测的效果,但仍存在一下三大问题:1、RCNN需要多步训练,训练步骤繁琐且训练速度较慢;2、在涉及分类的全连接网络的输入尺寸是固定的,无法输入任意尺寸大小图片,这降低了算法的精度;3候选区域需要提前进行特征提取并保存,繁琐且占用空间。
随后基于RCNN的Fast-RCNN和Faster-RCNN将以上存在的问题进一步优化,在实现方式、速度、精度上均有较大的提升。因此,要想学习物体检测,RCNN、Fast-RCNN和Faster-RCNN等RCNN系列算法是需要全面掌握的算法。本文将从以下几个方面进行探讨:
- RCNN系列算法的流程总览;
- 准备工作
- Faster RCNN
- RPN的理解
- ROI Polling层
- RCNN的全连接网络
- Faster RCNN后续的改进算法
一、RCNN系列算法的流程总览
- 开山之作:RCNN
RCNN的算法流程如图1所示,其仍然延续了传统物体检测的思想,将物体检测当做分类问题处理,即先提取一系列的候选区域,然后对候选区域进行分类。在PASCAL VOC数据集的准确率从35.1%提升到53.7%。
具体流程包括以下四步:
(1)候选区域生成。采用Region Proposal提取候选区域,如Selective Search算法,先将图像划分成多个小区域,合并包含同一物体可能性高的区域并输出。在这一笔需要提取约2000个候选区域,且提取完后需要将每一个区域进行归一化处理,得到固定大小尺寸的图像。
(2)CNN特征提取。使用CNN来提取出每个候选区域的Feature map,得到固定维数的特征图。
(3)SVM分类。使用线性二分类器对输出的特征进行分类(每一个类别对应于一个SVM分类器),得到是否属于此类的结果,并采用难样本挖掘(Hard example mining)来平衡正负样本比例。
(4)位置修正。通过一个回归器,对特征边界回归以得到更为精确的目标区域(对于每一个类,需要训练一个回归模型去进行位置修正)。
缺点: (1)训练过程太慢,需要对每一个候选区域都输入到cnn中再进行提取特征,极大的浪费了时间和精力。(2)步骤相对较多,需要fine-tune预训练模型、训练SVM分类器、回归器进行精细的调整。(3)占用空间大,提取出的特征以及分类器都需要占用额外的空间(4)没有对资源进行重复利用,在使用SVM分类和对框进行回归操作的时候cnn模型的参数并没有同步修改。
2、端到端(End-to-ENd):Fast RCNN
在RCNN后,SPPNets算法解决了固定输入尺寸和重复卷积计算两个问题,但仍没解决RCNN算法的其它问题。2015年Ross Girshick在RCNN基础上提出了Fast RCNN算法,该算法不仅在训练上实现了端到端,而且在训练速度上比RCNN快了9倍,测试速度快了213倍,并在VOC2012数据集上达到了68.4%。
Fast RCNN 具体流程如下:
(1)输入图像;
(2)通过深度网络中的卷积层(VGG、Alexnet、Resnet等中的卷积层)对图像进行特征提取,得到图片的特征图;
(3)通过选择性搜索算法得到图像的感兴趣区域(通常取2000个);
(4)对得到的感兴趣区域进行ROI pooling(感兴趣区域池化):即通过坐标投影的方法,在特征图上得到输入图像中的感兴趣区域对应的特征区域,并对该区域进行最大值池化,这样就得到了感兴趣区域的特征,并且统一了特征大小,如图2所示;对ROI pooling层的输出(及感兴趣区域对应的特征图最大值池化后的特征)作为每个感兴趣区域的特征向量;
(5)将感兴趣区域的特征向量与全连接层相连,并定义了多任务损失函数,分别与softmax分类器和box bounding回归器相连,分别得到当前感兴趣区域的类别及坐标包围框;
(6)对所有得到的包围框进行非极大值抑制(NMS),得到最终的检测结果。
与RCNN算法相比,Fast RCNN主要进行了三点的改进:
(1)共享卷积:将整幅图片一起放到卷积网络中进行Region Proposal,而不像RCNN那样需要对每个候选区域都各自输入到卷积网络(相对于RCNN最大的改进的地方),虽然Fast-RCNN仍采用Selective Search方法,但是共享卷积的使得计算量大大减少。
(2)ROI Pooling:利用特征池化进行特征尺度变换,使得算法可以输入任意大小的图片,使得模型训练更加灵活且精度更高。
(3)多任务损失:将分类和回归任务一起训练,避免对SVM分类器进行单独训练和训练速度慢的缺点,使用Softmax函数进行分类。
3、走向实时:Faster RCNN
Faster RCNN算法的最大的创新点是提出了RPN(Region Proposal Network)网络,利用了Anchor机制将区域生成与卷积网络联系在一起,相对RCNN和Fast RCNN的速度更快、精度更高。在VOC 2012测试上达到70.4%的精度。
如图3所示,Faster RCNN算法主要分为四部分:特征提取网络(VGG,ResNet等)、RPN模块、ROI Polling模块和RCNN模块。
(1)对于特征提取网络,输入图片经过该网络后得到输出的特征图,以VGGNet为例,假设输入图片的维度是3*600*800,由于VGGNet包含4个pooling层,下采样率2^4=16,因此输出的特征图的维度为512*37*50.
(2)对于RPN模块,其包含了5个子模块:Anchor生成、RPN卷积、计算RPN loss、生成Proposal、筛选Propoal得到ROI、ROI Pooling模块以及RCNN模块。
Anchor生成:RPN对特征图上的每一个点都对应9个Anchors,这9个Anchor分别有1:2、1:1、2:1三种宽高比,以及三种放大倍率,对于原图基本可以覆盖所有可能出现的物体。有了数量庞大的Anchor,RPN接下来需要从这些Anchor中筛选,并调整Anchor的位置,得到Proposal。
RPN卷积网络:与上面的Anchor对于,由于特征图上每个点对应9个Anchors,因此可以利用1*1的卷积在特征图上得到每一个Anchor的预测得分和预测偏移值。
计算RPN loss:这一步值在训练中,将所有的Anchors与标签进行匹配,匹配程度较好的Anchor赋予正样本,较差的为负样本,得到分类与偏置的真值,与上面的预测得到和预测偏移值进行loss计算。
生成Proposal:利用RPN卷积网络中的每一个Anchor的预测得分和预测偏移值,可以进一步筛选较好的Proposal,然后送达候后续网络。
筛选Proposal得到ROI:在训练上,由于Proposal数量太多(默认2000),需要进一步筛选,后续有空再聊(NMS等)。
RoI Polling模块:该模块接受网络提取的特征图和RNP的RoI,输入到RCNN网络中。由于RCNN模块使用了全连接,要求特征的维度是固定的,而每个RoI对应的特征大小各不相同,无法直接送达全连接网络。因此通过RoI Pooling将PoI的特征池化到固定的维度,才能输入到全连接网络。
RCNN模块:将经过RoI Polling的特征送到全连接网络,预测每一个RoI的分类,并预测偏移量以修正边框位置,并计算损失,完成了整个Faster RCNN的流程。
注:内容较多,难于一章讲完所有内容,本文讲解RCNN系列算法的流程总览,后面再不定期讲解其它部分内容。
参考:
[1] 董洪义. 深度学习之PyTorch物体检测实战,机械工程出版社,pp:112-133,2019
本文暂时没有评论,来添加一个吧(●'◡'●)