一、RCNN
1. 概述
RCNN由Ross等人于2014年提出,首次将深度学习应用于目标检测任务。RCNN将VOC数据集中目标检测mAP值提升了30%,另外还提出了迁移学习的观点,成为后来深度学习训练的基本策略。
2. 测试流程
- 输入一张
416*416
的图片 selective search
算法提取约2k
个候选区域,这些区域也是图片形式- 暴力resize到
227*227
,因为Alex Net
的输入是这个尺寸 - 输入到
Alex Net
,对于每个候选区域输出4096
维的特征 - 将上述特征输入各类的
svm
分类器,对每个类别判断yes or no - bbox精修,使用回归器对候选框位置精修
3. 训练CNN网络
- 网络结构
在RCNN之前目标检测算法都是采用手工设计特征的方式(Haar
,HOG
)提取图像特征,RCNN开创性的使用了卷积神经网络。Alex Net
和Vgg
都是当时比较好的CNN网络,Vgg
采用更细腻的卷积和池化获得了更好的评分,但是Alex Net
的速度是Vgg的7倍,所以作者选择了Alex Net
- 预训练
RCNN提出了迁移学习
的观点,而预训练使用的数据集是ImageNet ILSVC 2012
。该数据集图片数量约1000万
,只有类别标注,共1000
个类别,而Alex Net
输出层正好是1000
,所以可以直接训练 - fine-tuning阶段
fine-tuning阶段采用的数据集是PASCAL VOC 2007
,该数据集有10000
张图片,20
个分类,还标注了定位框,测试阶段也使用了该数据集。
为了在预训练的基础上进行迁移学习,首先要将Alex Net
的输出层由1000
改为21(20+1)
。
我们并不是将VOC 2007
的图片直接输入网络,而是经过SS
算法提取2k
个候选框,然后将其标注为正负样本。其中IoU>0.5
为正样本,其余为负样本。最后,在训练时取batch_size=128
,包括32
个正样本和96
个负样本。
4.训练SVM
首先是正负样本的标注,作者通过试验发现取IoU<0.3
为负样本是最好的,而正样本则是真实标注。显然负样本的数量会远多余正样本,所以作者采用了Hard Negetive Mining的策略,简单的说就是选择网络难以判断的负样本进行训练,比如IoU=0.25
的就比IoU=0
的更难判断,就叫Hard Negetive
为什么要多此一举训练一个SVM呢?Alex Net不是能分类吗?
因为SVM
对正负样本的要求更严格,这在上面已经进行了充分的说明,因为这个原因导致SVM
分类的效果比softmax
要好。
5.位置精修
bbox
回归器利用pool5
层的4096
维特征和候选框的坐标(x,y,w,h
)进行训练,即预测4
个值,与坐标计算损失,然后反向传播。
RCNN详细过程也可以参考下图,注意有错误之处
二、Fast-RCNN
1. 概述
2015年Ross又提出了Fast-RCNN,借鉴了SSPNet中的特征映射和金字塔池化层的思想,并用softmax替代了svm进行分类。
2. 测试流程
- 输入一张任意尺寸的图片
- 利用vgg16提取整张图的特征,形成特征图
selective search
算法提取约2k
个候选区域,映射到特征图- 特征图经过ROI pooling,统一尺寸
- 候选区域的特征输入到softmax和回归器得到类别和定位
- NMS,输出结果
3.训练
Fast-RCNN用softmax替换svm,使得该网络能够进行多任务训练,也就是将softmax的分类损失和线性回归的损失合在一起进行反向传播。这样做有如下优点:
- 不需要像svm那样将特征图保存在硬盘里然后再读出来训练,提高了训练速度,且省去了硬盘资源
- 多任务训练,将分类和定位的损失函数加在一起,并和之前的vgg统一成一个网络,离端到端更进一步。
4.相对于RCNN的改进
- 训练速度提高9倍,测试速度提高200倍,mAP也有些提高,这归功于全特征图、POI Pooling及softmax。
- 训练步骤更少,网络更加统一。RCNN先训练Alex Net,然后分别训练svm和回归器,Fast-RCNN统一搞定。
- 据说可以提高mAP(58-66?,之前看到RCNN如果使用vgg也可以达到60多)
二、Faster-RCNN
1. 概述
同年(2015),Ross的团队又提出了RCNN系列的最终版Faster-RCNN,且在此之后Faster-RCNN也紧随潮流一直在更新,比如使用resnet等性能更好的网络进行特征提取等。
2. 测试流程
Faster-RCNN最主要的区别是引入了RPN层替代了SS算法进行候选区推荐,而RPN又引入了一个对后面算法影响深远的概念——anchor。先来看论文给出的预测流程:
- 输入图片,resize到M*N
- 经过一个CNN网络得到特征图
- 该特征图再经过RPN层得到一系列候选区域(即对应输入图片的矩形框)
- 候选区映射到特征图,并进行ROI Pooling
- 接着经过全连接层分别进入softmax和回归器进行分类和回归
- NMS,输出结果
3.更详细的分析
我们再来看看更详细的流程图,并配以更细致的解释:
1. Conv layers
最初版本的卷积层(特指用于生成feature map的这块CNN网络)用的是vgg16,包含13个卷积层(same padding,kernel_size=3,激活函数relu)以及4个池化层(kernel_size=3,padding=2),这样一来输出的feature map尺寸为(M/16)*(N/16),feature map中的每个点坐标扩大16倍就是其在原图对应的位置,另外网络深度为256d或512d,这里取256d分析。
不过后来随着越来越多高性能的特征提取网络被提出来,现在Conv layers也有了很多选择,在pytorch内置的Faster-RCNN中甚至可以任意选择resnet等网络进行特征提取。事实上目前很多目标检测算法都可以分为backbone和head两部分,backbone就是各种特征提取网络,一般都是经典的分类网络如resnet、darknet等,在Faster-RCNN中,Conv layers也相当于是一个backbone了。
2. Region Proposal Networks(RPN)
之前提到feature map的尺寸为((M/16),(N/16),256),进入RPN层,首先会进行一次卷积操作,不改变尺寸,其作用不清楚,扩大感受野?然后会有两条线。
上面一条用于分类,feature 经过(1,1,18)的卷积,将深度从256变为18,为什么是18?因为每个点9个anchor,每个anchor有前景和背景2个类别。经过softmax计算这18个值,就知道哪些属于前景哪些属于背景。
下面一条用于检测(定位),同样的操作,36=4*9,对应每个anchor坐标。值得注意的是这里已经完成了一次检测,而后面的回归器将进一步优化,这也就是说Faster-RCNN其实有两次定位优化。
这样我们就知道每个anchor对应的区域以及其是否为前景了。
2.1 anchors
anchors是RPN中非常重要的概念,也是后面yolo等anchor-based算法至关重要的一个点。事实上anchors就是一系列的矩形框,每一个feature map上的“点”都对应k(这里k=9)个anchor,每个anchor由4个坐标值确定,注意这里的坐标是在M*N那幅图片上的。
所以RPN的本质是在原图上先框一万多个anchor,然后利用RPN输出合格的anchor(最有可能包含物体的)。我们可以看到上图的proposal层有三个输入:18d的分类信息记录了这9个anchor的分类(前景、背景);36d的检测信息记录了这9个anchor的定位坐标;而im_info来自(M,N)的图片,除了图像信息还有从原图到其的resize。而proposal的输出就可以开始后面的旅程了。
3. 分类和定位
这块相对单纯一点,proposal经过RoI Pooling变成固定尺寸(7,7),然后送入全连接层,分别进行分类和回归。
4. 损失函数
看起来整个网络对定位和分类都有两次预测。在RPN阶段,网络对anchor二分类为背景和前景,并预测一组(x,y,w,h);RPN生成的proposal经过全连接层、softmax和回归层再次进行真正的分类并优化定位。
两阶段的分类损失都采用了交叉熵损失,不同的是二分类和多分类而已;而回归损失采用了L1-smooth loss,要注意的是并不是直接把预测坐标和实际坐标输入函数,而是分别和anchor做一个变换,然后再输入损失函数。具体实现可以参考【Faster RCNN】损失函数理解
5. 训练
Faster R-CNN的训练比较复杂,不知道现在有没有具体实现的时候会不会怎么复杂,这里大概列一下流程,细节具体可以参考:一文读懂Faster RCNN
- 在已经训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
- 利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
- 第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
- 第二训练RPN网络,对应stage2_rpn_train.pt
- 再次利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt
- 第二次训练Fast RCNN网络,对应stage2_fast_rcnn_train.pt
可以看到训练过程类似于一种“迭代”的过程,不过只循环了2次。至于只循环了2次的原因是应为作者提到:“A similar alternating training can be run for more iterations, but we have observed negligible improvements”,即循环更多次没有提升了。接下来本章以上述6个步骤讲解训练过程。
下面是一张训练过程流程图,应该更加清晰:
参考