RCNN系列总结:RCNN -> Fast RCNN -> Faster RCNN概述_rcnn中的xy-程序员宅基地

RCNN

(参考:ref-1ref-2

传统的目标检测方法分为区域选择特征提取(SIFT、HOG等)、分类器(SVM等)三部分,其主要问题有两方面:

  • 区域选择策略没有针对性、时间复杂度高,窗口冗余;
  • 手工设计的特征鲁棒性较差;

RCNN ( Region-based Convolutional Neural Networks )

RCNN 创新点:

  • 采用CNN提取图像特征,从经验驱动的人造特征范式HOG、SIFT到数据驱动的表示学习范式,提高特征对样本的表示能力
  • 采用大样本有监督预训练(迁移学习)+小样本微调的方式解决小样本难以训练甚至过拟合等问题(迁移学习)。

训练流程:

  1. 使用 selective search 方法提取大约20k个 region proposal,再warp缩放到固定尺寸(227 x 227);
  2. 特征提取:CNN 从每个region proposal 中提取一个4096维的特征(Alexnet,5层conv,2层fc),输出为2000 x 4096;
  3. 类别分类:使用SVM对4096维的特征进行分类,得到2000 x 20的矩阵(20中类别),然后对每一列进行NMS非极大值抑制;
  4. 位置修正:回归器校正剩余的region,输入CNN网络pool5层的特征,输出为xy方向的缩放和平移;

 

方法解析:

  • selective search: 通过分割将图像分成小区域,输入10million的Region Proposal集合,计算每种6×6特征(AlexNet CNN网络中 pool5 层 的 size 是 6 x 6 x 256)的激活量,之后进行非极大值抑制,最后展示出每种特征前几个得分最高的Region Proposal,再通过颜色直方图、梯度直方图(纹理)相近、合并后总面积减小等合并规则进行合并,最后生成约2K个region proposals;
  • 将region proposal 缩放至 227 x 227:原文中采用Alexnet CNN提取特征,为了适应Alexnet的输入图像大小而做了缩放;
  • 缩放的变形方式:1. 用建议框周围像素扩充   2. 用建议框均值像素填充  3. zero padding(较好) 4. 直接缩放(resize
  • IoU: (A\cap B) / (A\cup B)
  • NMS (Non-Maximum Suppression) 非极大值抑制:
    1. 对2000 x 20 维矩阵每列按从大到小顺序排序;
    2. 从每列最大region proposal开始与后面的建议框计算IoU,若 IoU > 阈值,则剔除得分小的建议框;
    3. 遍历完整个矩阵所有列(即所有类别)
  • Bounding-Box 回归器:窗口 P = (x, y, w, h) ,(x, y) 表示窗口中心点坐标, (w, h) 表示窗口宽和高;
  • SVM训练:SVM是二分类器,所以对每个类别训练单独的SVM,由于负样本太多,采用hard negative mining的方法在负样本中选取有代表性的负样本;
  • hard negative mining:比较容易被判定是负样本(比如全是背景)的对于训练并不能起到很好的监督作用。需要找一些难划分的负样本(hard negative),来增强网络的判别性能。在训练好分类器进行会分类得到错误的正样本,这些判别错误的样本可以作为负样本继续训练网络。
  • 有监督预训练(迁移学习):使用功能相似的训练好的网络权重的前几层初始化参数,在其后添加所需的若干层网络,并对其随机初始化,再利用训练集训练整个网络;好处就是加快训练和网络收敛速度,解决了小样本数据训练深层网络易过拟合的问题;
  • 微调region proposal 和 训练SVM是正负样本阈值不同(0.3 和 0.5):微调阶段是由于CNN对小样本容易过拟合,需要大量训练数据,故对IoU限制宽松;SVM适用于小样本训练,故对样本IoU限制严格;
  • 不直接用微调后的Alexnet最后一层softmax进行分类:微调时和训练SVM时所采用的正负样本阈值不同,微调阶段正样本定义并不强调精准的位置,而SVM正样本只有Ground Truth;

RCNN存在的问题:

  • 传统的CNN输入的map是固定尺寸的,而归一化过程中对图片产生的形变会导致图片大小改变,不利于CNN的特征提取;
  • 需要事先提取多个候选区域对应的图像,占用空间大;
  • 每个region proposal都需要进入CNN网络计算,导致过多次的重复的相同的特征提取,导致计算速度、训练和预测速度都很慢;

 

Fast RCNN

(参考:ref3

Fast-RCNN 提升点(相对RCNN):

  • 训练速度提升9倍;
  • 测试速度提升200多倍;
  • 无需SVM分类器分类;

创新之处:

  • 全连接后使用softmax替代了RCNN中的SVM进行分类;
  • 引入多任务函数边框回归(bbox regressor ),除Selective Search region proposal 阶段外实现了端到端训练;
  • 引入ROI Pooling层(含有一层SPP),对图像输入没有尺寸限制;

训练流程:

  1. selective search 在原图中获取2K左右region proposals;

  2. CNN提取图片特征得到最后一层的feature map;

  3. 在得到的feature map之上对每个ROI求映射关系(同SPP-NET),并用一个ROI Pooling 层来将其统一到相同的大小(替代最后一个Pooling层,实际就是单层的SPP-NET,实现时将ROI对应的feature map区域下采样到7 x 7);

  4. 经过两个全连接层得到特征向量,分别输入至 softmax 和 bounding box 回归;利用 softmax loss 和 smooth L1 loss 联合训练

 

方法解析:

  • 预训练:用了3种预训练的ImageNet网络(VGG16等)初始化Fast RCNN,最后一个max pooling层替换为 ROI pooling 层,设置为与第一个全连接层兼容;最后一个全连接层和softmax(原本为1000类)替换为 K + 1(类别+背景)类的分类层和 bounding box 回归层;
  • 微调:采用 image-centric sampling,每个 mini-batch 由N张图片(N=2)的R个proposal组成(R=28),同一图像的ROI共享计算和内存,可以同时微调卷积层和全连接层(实验证明太浅的卷积层没有必要微调,可减少训练时间);
  • 计算全连接层:在分类中比计算卷积层快,而在检测中由于一个图中要提取2000个ROI,所以大量时间都用在计算全连接层了,采用Truncated SVD奇异值分解(去掉最末尾的几个singular value来近似原矩阵的方法来减少计算全连接层的时间
  • ROI Pooling:
    • ROI(region of interest)指的是SS后的候选框在卷积后得到的特征图上的映射;
    • ROI Pooling层将每个候选区域划分为大小相同的sections(数量和输出维度相同),对每一个section执行max pooling,使得特征映射上不同大小的候选区域变为均匀大小的特征图(feature map),然后将其送入下一层;
    • 论文中对于每一个RoIRoI Pooling Layer将其对应的特征从共享卷积层上拿出来,并转化成一样的大小(6×6)
    • 作用:
      • 该层有效提高了training和testing的处理速度准确度
      • 可以从不同大小的候选框对应的特征映射上,为每个ROI区域提取固定大小的feature map
      • 允许end-to-end的形式训练目标检测系统;
  • bounding box 回归:先平移,再尺度缩放;当输入的proposal与ground truth相差较小时(原文为 IoU>0.6),可以认为这种变换是一种线性变换,就可以用线性回归来对窗口微调;
  • Image-centric 采样: mini-batch 分层采样,先对图像采样,再对ROI采样,将采样的ROI限定在个别图像内,这样使得同一图像的ROI共享计算和内存,实现了端到端的反向传播,可以fine-tuning整个网络;
  • 多尺度图像训练Fast R-CNN只提升微小的mAP,但是时间成本却增加了很多不推荐;过多region proposal不能提升性能
  • Fast RCNN 的损失函数(ref)-- 多任务损失:
    • Fast RCNN 网络有两个同级输出层(cls score 和 bbox predict),都是全连接层,称为 multi-task
      • cls_score 层:用于分类,输出为 k+1 维数组 p (k 个类别 和背景),对每个 ROI 输出离散型概率分布:\large p=(p_0, p_1, ..., p_k),p 由 k+1 类的全连接层利用softmax计算得出;
      • bbox_predict 层:用于调整候选区域位置,输出 bounding box 回归的位移,输出 4*k 维数组 t 表示应该平移缩放的量:\large t^k=(t^k_x, t^k_y, t^k_w, t^k_h),其中 \large t^k_x, t^k_y 是相对于proposal的尺度不变的平移;
      • loss_cls 分类损失函数,由真实分类 u 对应的概率决定:\large L_{cls}(p,u)=-log\,p_u
      • loss_reg 检测框定位的损失函数,比较真实分类对应的预测平移缩放参数 t^u=(t^u_x, t^u_y, t^u_w, t^u_w) 和真实平移缩放参数 v = (v_x, v_y, v_w, v_h) 的差别: \large L_{loc}(t^u, v)=\sum^4_{i=1}smooth_{L_1}(t^u_i-v_i)
      • smooth L1 损失函数:  \large smooth_{L_1}(x) = \left\{\begin{matrix} 0.5x^2\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,if |x|<1\\ |x| -0.5\,\,\,\,\,\,\,\,\,\,\,\, otherwise \end{matrix}\right.
        • 这样设置的目的是想让loss对于离群点更加鲁棒,相比于L2损失函数,其对离群点、异常值(outlier)不敏感,可控制梯度的量级使训练时不容易跑飞。
      • 最后总损失为两者加权和(如果分类为背景则不考虑定位损失):\large L(p,u,t^u,v)=\left\{\begin{matrix} L_{cls}(p,u)+\lambda L_{loc}(t^u,v)\,\,\,\,\,\,\,\,\,\,\,\, if\,u\,is\,foreground\\ L_{cls}(p,u)\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,if\,u\,is\,background \end{matrix}\right.
      • 规定u=0为背景类(也就是负标签),那么艾弗森括号指数函数[u≥1]表示背景候选区域即负样本不参与回归损失,不需要对候选区域进行回归操作。λ控制分类损失和回归损失的平衡。Fast R-CNN论文中,所有实验λ=1。

        \large [u\geq1]=\left\{\begin{matrix} 1\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\,\, u\geq1\\ 0\,\,\,\,\,\,\,\,\,otherwise \end{matrix}\right.

      • 源码中bbox_loss_weights用于标记每一个bbox是否属于某一个类;

Fast RCNN 的不足之处:

  • selective search十分耗时,无法满足实时应用需求,并且没有实现真正意义上的端到端训练模式;

 

Faster RCNN

(参考:ref4ref5ref6

特点:

  • 目标检测的四个步骤:候选区域生成 + 特征提取 + 分类器分类 + 回归器回归 全部由神经网络完成,并且可以全部在GPU上运行,实现了端到端(end-to-end)操作,大大提高了训练和检测效率

  • 由两个模块组成的----RPN候选框提取模块+Fast RCNN检测模块,两个模块共享特征;

训练流程:

  1. 输入图像经过CNN特征提取,通过RPN生成约300个 region proposals 送入ROI Pooling 层;
  2. Fast RCNN模块通过共享上述卷积层,特征提取后获得feature maps;
  3. softmax分类器分类;
  4. bounding box 回归器回归,进行位置调整;

方法解析:

  • RPN (Region Proposal Network) 是一个全卷积网络(即将CNN最后的全连接层换为全卷积层),在最后一层卷积的feature map上生成约 300 个 region proposals;
    • RPN 操作流程(参考:ref):
      • 使用小型网络在最后卷积得到的 feature map 上执行滑动扫描,这个网络每次与特征图上的 n x n (论文中 n=3)的窗口全连接(图像的有效感受野很大,ZF是171像素,VGG是228像素),每个滑动位置通过卷积层映射到一个低维向量(256d for ZF / 512d for VGG)
      • 为每个滑窗位置考虑 k = 9 (3种尺度,3种比例) 中可能的参考窗口(anchor,在原图上,不在特征图上)。对于 W \times H 的特征图,就会产生 W \times H \times k 个anchors。
      • 低维特征向量输入到两个并行的全连接层(bbox回归层( reg)和 box分类层( cls)
        • reg层:预测anchor对应的proposal的(x,y,w,h);
        • cls层:判断该proposal是前景(object)还是背景(non-object),并为其打分(输出每一个位置上,9个anchor属于前景和背景的概率);
    • 训练RPN:通过BP和SGD进行端到端训练
      • 采样:同 Fast RCNN 一样采用 image-centric 采样策略,每一个mini-batch 包含从一张图像中随机提取的256个anchor (不是所有的anchor都用来训练),前景和背景样本各取128个,正负比 1 : 1,若图像中正样本少于128个,则多取一些负样本以满足256个proposal用于训练;
      • 初始化:新增的两层用均值为0,标准差为0.01的高斯分布初始化,其余层(共享的卷积层)参数用ImageNet分类预训练模型来初始化;

  • Faster RCNN 的损失函数(ref):
    • Faster RCNN 的loss分为训练RPN的loss和训练Fast RCNN的loss(都各自包含一个softmax loss和一个smooth L1 loss)
    • \large L(\left \{ p_i \right \},\, \left \{ u_i \right \})=\frac{1}{N_{cls}}\sum _i L_{cls}(p_i, p^*_i)+ \lambda \frac{1}{N_{reg}} \sum _i p^*_i L_{reg}(t_i, t^*_i)

其中参数定义如下:

  • \large p_i 为 anchor 预测为目标的概率;
  • \large p^*_i 为 ground truth 标签, \large p^*_i =\left\{\begin{matrix} 0 \,\,\,\, negative \,label\\ 1 \,\,\,\, positive \,label \end{matrix}\right.
  • \large t_i=(t_x, t_y,t_w, t_h) ,\large t^*_i 是positive anchor对应的ground truth 的坐标向量;
  • \large L_{cls}(p_i, p^*_i) 是两个类别(目标和非目标)的对数损失:\large L_{cls}(p_i, p^*_i) = -log[p^*_i\, p_i + (1-p^*_i)(1-p_i)]
  • \large L_{reg}(t_i, t^*_i) 是回归损失:\large L_{reg}(t_i, t^*_i)=R(t_i-t^*_i),其中 R 是smooth L1函数;
  • \large p^*_iL_{reg} 意味着只有前景 anchor (p^*_i = 1)才有回归损失;
  • cls 层 和 reg 层的输出分别由 { p_i} 和 { u_i} 组成,分别由 N_{cls} (cls项的归一化值,为mini-batch 大小,默认为256)和 N_{reg}(reg 项的归一化值为 anchor 位置的数量,即 2400 (40*60))以及一个平衡权重 \lambda 归一化;

Faster RCNN 分类器和RoI边框修正流程:

  1. 通过RPN生成约20000个(40*60*9)anchor
  2. 对20000个anchor进行第一次边框修正,得到修正后的proposal;
  3. 超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围;
  4. 忽略长或者宽太小的proposal;
  5. 将所有proposal按照前景分数从高到低排序,选取前12000个proposal;
  6. 使用0.7的阈值做NMS,排除掉重叠的proposal;
  7. 对上一步剩下的proposal,选取前2000个进行分类和第二次边框修正

Faster RCNN 训练流程:

  1. 使用在ImageNet上预训练的模型初始化共享卷积层训练RPN
  2. 使用RPN参数生成 RoI proposals,再使用ImageNet上预训练的模型初始化共享卷积层,训练分类器和RoI边框修订(同Fast RCNN部分);
  3. 将训练后的共享卷积层参数固定,同时将Fast RCNN的参数固定,训练RPN;
  4. 将共享卷积层和RPN参数都固定,训练Fast RCNN部分;

Faster RCNN 测试流程:

  1. 通过RPN生成约20000个(40*60*9)anchor
  2. 对20000个anchor进行第一次边框修正,得到修正后的proposal;
  3. 超过图像边界的proposal的边进行clip,使得该proposal不超过图像范围;
  4. 忽略长或者宽太小的proposal;
  5. 将所有proposal按照前景分数从高到低排序,选取前6000个proposal;
  6. 使用0.7的阈值做NMS,排除掉重叠的proposal;
  7. 对上一步剩下的proposal,选取前300个进行分类和第二次边框修正

总结:三者对比

参考(ref

  流程 缺点 改进
RCNN
  1. SS提取RP;
  2. CNN提取特征;
  3. SVM分类;
  4. bbox回归;
  1. 训练步骤繁琐(fine-tune,SVM,bbox)
  2. 训练、测试速度慢
  3. 训练占用空间大
  1. mAP较之传统方法提升巨大
  2. 引入RP+CNN
Fast RCNN
  1. SS提取RP;
  2. CNN提取特征;
  3. softmax分类;
  4. multi-task损失函数边框回归;
  1. SS提取RP耗时大
  2. 无法满足实时需求,没有真正做到端对端
  3. SS在CPU上实现(其他在GPU)
  1. mAP 有提升
  2. 检测耗时缩短
Faster RCNN
  1. RPN提取RP;
  2. CNN提取特征;
  3. softmax分类;
  4. multi-task损失函数边框回归;
  1. 依旧不能实时检测
  2. 获取RP再对每个proposal分类计算量大
  1. 精度和速度均有提高
  2. 实现了端到端检测
  3. 生成RP仅需10ms

下图来自:ref2

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/francislucien2017/article/details/86766594

智能推荐

c# 调用c++ lib静态库_c#调用lib-程序员宅基地

文章浏览阅读2w次,点赞7次,收藏51次。四个步骤1.创建C++ Win32项目动态库dll 2.在Win32项目动态库中添加 外部依赖项 lib头文件和lib库3.导出C接口4.c#调用c++动态库开始你的表演...①创建一个空白的解决方案,在解决方案中添加 Visual C++ , Win32 项目空白解决方案的创建:添加Visual C++ , Win32 项目这......_c#调用lib

deepin/ubuntu安装苹方字体-程序员宅基地

文章浏览阅读4.6k次。苹方字体是苹果系统上的黑体,挺好看的。注重颜值的网站都会使用,例如知乎:font-family: -apple-system, BlinkMacSystemFont, Helvetica Neue, PingFang SC, Microsoft YaHei, Source Han Sans SC, Noto Sans CJK SC, W..._ubuntu pingfang

html表单常见操作汇总_html表单的处理程序有那些-程序员宅基地

文章浏览阅读159次。表单表单概述表单标签表单域按钮控件demo表单标签表单标签基本语法结构<form action="处理数据程序的url地址“ method=”get|post“ name="表单名称”></form><!--action,当提交表单时,向何处发送表单中的数据,地址可以是相对地址也可以是绝对地址--><!--method将表单中的数据传送给服务器处理,get方式直接显示在url地址中,数据可以被缓存,且长度有限制;而post方式数据隐藏传输,_html表单的处理程序有那些

PHP设置谷歌验证器(Google Authenticator)实现操作二步验证_php otp 验证器-程序员宅基地

文章浏览阅读1.2k次。使用说明:开启Google的登陆二步验证(即Google Authenticator服务)后用户登陆时需要输入额外由手机客户端生成的一次性密码。实现Google Authenticator功能需要服务器端和客户端的支持。服务器端负责密钥的生成、验证一次性密码是否正确。客户端记录密钥后生成一次性密码。下载谷歌验证类库文件放到项目合适位置(我这边放在项目Vender下面)https://github.com/PHPGangsta/GoogleAuthenticatorPHP代码示例://引入谷_php otp 验证器

【Python】matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距-程序员宅基地

文章浏览阅读4.3k次,点赞5次,收藏11次。matplotlib.plot画图横坐标混乱及间隔处理_matplotlib更改横轴间距

docker — 容器存储_docker 保存容器-程序员宅基地

文章浏览阅读2.2k次。①Storage driver 处理各镜像层及容器层的处理细节,实现了多层数据的堆叠,为用户 提供了多层数据合并后的统一视图②所有 Storage driver 都使用可堆叠图像层和写时复制(CoW)策略③docker info 命令可查看当系统上的 storage driver主要用于测试目的,不建议用于生成环境。_docker 保存容器

随便推点

网络拓扑结构_网络拓扑csdn-程序员宅基地

文章浏览阅读834次,点赞27次,收藏13次。网络拓扑结构是指计算机网络中各组件(如计算机、服务器、打印机、路由器、交换机等设备)及其连接线路在物理布局或逻辑构型上的排列形式。这种布局不仅描述了设备间的实际物理连接方式,也决定了数据在网络中流动的路径和方式。不同的网络拓扑结构影响着网络的性能、可靠性、可扩展性及管理维护的难易程度。_网络拓扑csdn

JS重写Date函数,兼容IOS系统_date.prototype 将所有 ios-程序员宅基地

文章浏览阅读1.8k次,点赞5次,收藏8次。IOS系统Date的坑要创建一个指定时间的new Date对象时,通常的做法是:new Date("2020-09-21 11:11:00")这行代码在 PC 端和安卓端都是正常的,而在 iOS 端则会提示 Invalid Date 无效日期。在IOS年月日中间的横岗许换成斜杠,也就是new Date("2020/09/21 11:11:00")通常为了兼容IOS的这个坑,需要做一些额外的特殊处理,笔者在开发的时候经常会忘了兼容IOS系统。所以就想试着重写Date函数,一劳永逸,避免每次ne_date.prototype 将所有 ios

如何将EXCEL表导入plsql数据库中-程序员宅基地

文章浏览阅读5.3k次。方法一:用PLSQL Developer工具。 1 在PLSQL Developer的sql window里输入select * from test for update; 2 按F8执行 3 打开锁, 再按一下加号. 鼠标点到第一列的列头,使全列成选中状态,然后粘贴,最后commit提交即可。(前提..._excel导入pl/sql

Git常用命令速查手册-程序员宅基地

文章浏览阅读83次。Git常用命令速查手册1、初始化仓库git init2、将文件添加到仓库git add 文件名 # 将工作区的某个文件添加到暂存区 git add -u # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,不处理untracked的文件git add -A # 添加所有被tracked文件中被修改或删除的文件信息到暂存区,包括untracked的文件...

分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120-程序员宅基地

文章浏览阅读202次。分享119个ASP.NET源码总有一个是你想要的_千博二手车源码v2023 build 1120

【C++缺省函数】 空类默认产生的6个类成员函数_空类默认产生哪些类成员函数-程序员宅基地

文章浏览阅读1.8k次。版权声明:转载请注明出处 http://blog.csdn.net/irean_lau。目录(?)[+]1、缺省构造函数。2、缺省拷贝构造函数。3、 缺省析构函数。4、缺省赋值运算符。5、缺省取址运算符。6、 缺省取址运算符 const。[cpp] view plain copy_空类默认产生哪些类成员函数

推荐文章

热门文章

相关标签