从RCNN、Fast-RCNN到Faster-RCNN

一、RCNN

1. 概述

RCNN由Ross等人于2014年提出,首次将深度学习应用于目标检测任务。RCNN将VOC数据集中目标检测mAP值提升了30%,另外还提出了迁移学习的观点,成为后来深度学习训练的基本策略。

2. 测试流程

在这里插入图片描述

  1. 输入一张416*416的图片
  2. selective search算法提取约2k个候选区域,这些区域也是图片形式
  3. 暴力resize到227*227,因为Alex Net的输入是这个尺寸
  4. 输入到Alex Net,对于每个候选区域输出4096维的特征
  5. 将上述特征输入各类的svm分类器,对每个类别判断yes or no
  6. bbox精修,使用回归器对候选框位置精修

3. 训练CNN网络

  1. 网络结构
    在RCNN之前目标检测算法都是采用手工设计特征的方式(HaarHOG)提取图像特征,RCNN开创性的使用了卷积神经网络。Alex NetVgg都是当时比较好的CNN网络,Vgg采用更细腻的卷积和池化获得了更好的评分,但是Alex Net的速度是Vgg的7倍,所以作者选择了Alex Net
    在这里插入图片描述
  2. 预训练
    RCNN提出了迁移学习的观点,而预训练使用的数据集是ImageNet ILSVC 2012。该数据集图片数量约1000万,只有类别标注,共1000个类别,而Alex Net输出层正好是1000,所以可以直接训练
  3. 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. 测试流程

在这里插入图片描述

  1. 输入一张任意尺寸的图片
  2. 利用vgg16提取整张图的特征,形成特征图
  3. selective search算法提取约2k个候选区域,映射到特征图
  4. 特征图经过ROI pooling,统一尺寸
  5. 候选区域的特征输入到softmax和回归器得到类别和定位
  6. NMS,输出结果

3.训练

Fast-RCNN用softmax替换svm,使得该网络能够进行多任务训练,也就是将softmax的分类损失和线性回归的损失合在一起进行反向传播。这样做有如下优点:

  1. 不需要像svm那样将特征图保存在硬盘里然后再读出来训练,提高了训练速度,且省去了硬盘资源
  2. 多任务训练,将分类和定位的损失函数加在一起,并和之前的vgg统一成一个网络,离端到端更进一步。

4.相对于RCNN的改进

  1. 训练速度提高9倍,测试速度提高200倍,mAP也有些提高,这归功于全特征图、POI Pooling及softmax。
  2. 训练步骤更少,网络更加统一。RCNN先训练Alex Net,然后分别训练svm和回归器,Fast-RCNN统一搞定。
  3. 据说可以提高mAP(58-66?,之前看到RCNN如果使用vgg也可以达到60多)

二、Faster-RCNN

1. 概述

同年(2015),Ross的团队又提出了RCNN系列的最终版Faster-RCNN,且在此之后Faster-RCNN也紧随潮流一直在更新,比如使用resnet等性能更好的网络进行特征提取等。

2. 测试流程

Faster-RCNN最主要的区别是引入了RPN层替代了SS算法进行候选区推荐,而RPN又引入了一个对后面算法影响深远的概念——anchor。先来看论文给出的预测流程:
在这里插入图片描述

  1. 输入图片,resize到M*N
  2. 经过一个CNN网络得到特征图
  3. 该特征图再经过RPN层得到一系列候选区域(即对应输入图片的矩形框)
  4. 候选区映射到特征图,并进行ROI Pooling
  5. 接着经过全连接层分别进入softmax和回归器进行分类和回归
  6. 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

  1. 在已经训练好的model上,训练RPN网络,对应stage1_rpn_train.pt
  2. 利用步骤1中训练好的RPN网络,收集proposals,对应rpn_test.pt
  3. 第一次训练Fast RCNN网络,对应stage1_fast_rcnn_train.pt
  4. 第二训练RPN网络,对应stage2_rpn_train.pt
  5. 再次利用步骤4中训练好的RPN网络,收集proposals,对应rpn_test.pt
  6. 第二次训练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个步骤讲解训练过程。

下面是一张训练过程流程图,应该更加清晰:
在这里插入图片描述

参考

  1. 【目标检测】RCNN算法详解
  2. 【深度学习】R-CNN 论文解读及个人理解
  3. RCNN- 将CNN引入目标检测的开山之作
  4. Fast RCNN算法详解
  5. Fast R-CNN文章详细解读
  6. Faster R-CNN文章详细解读
  7. 一文读懂Faster RCNN
  8. 【Faster RCNN】损失函数理解
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值