读论文系列:Object Detection ICCV2015 Fast RCNN_weixin_30294295的博客-程序员宅基地

技术标签: 人工智能  数据结构与算法  

Fast RCNN是对RCNN的性能优化版本,在VGG16上,Fast R-CNN训练速度是RCNN的9倍, 测试速度是RCNN213倍;训练速度是SPP-net的3倍,测试速度是SPP-net的3倍,并且达到了更高的准确率,本文为您解读Fast RCNN。

Overview

Fast rcnn直接从单张图的feature map中提取RoI对应的feature map,用卷积神经网络做分类,做bounding box regressor,不需要额外磁盘空间,避免重复计算,速度更快,准确率也更高。

RCNN缺点

  • Multi-stage training

需要先预训练卷积层,然后做region proposal, 然后用SVM对卷积层抽取的特征做分类,最后训练bounding-box回归器。

  • 训练时间和空间代价很大
    训练过程中需要把CNN提取的特征写到磁盘,占用百G级的磁盘空间,GPU训练时间为2.5GPU*天(用的是K40,壕,友乎?)

  • 目标检测很慢
    Region proposal很慢,VGG16每张图需要花47秒的时间

总结:RCNN就是慢!最主要的原因在于不同的Region Proposal有着大量的重复区域,导致大量的feature map重复计算。

SPP-net

SPP-net中则提出只过一遍图,从最后的feature map裁剪出需要的特征,然后由Spatial pyramid pooling层将其转为固定尺寸特征,由于没有重复计算feature map,训练速度提升3倍,测试速度提升了10-100倍。

但是SPP-net也有缺点,SPP-net的fine-tune不能越过SPP层,因为pyramid BP开销太大了,只能fine-tune全连接层,tune不到卷积层,所以在一些较深的网络上准确率上不去。

Fast RCNN architecture

Fast RCNN

  • 首先将整个图片输入到一个基础卷积网络,经过max pooling得到整张图的feature map,
  • 然后用一个RoI pooling层为region proposal从feature map中提取一个固定长度的特征向量,
  • 每个特征会输入到一系列全连接层,得到一个RoI特征向量,
  • 再分叉传入两个全连接层输出,
    • 其中一个是传统softmax层进行分类,
    • 另一个是bounding box regressor,
  • 根据RoI特征向量(其中包含了原图中的空间信息)和原来的Region Proposal位置回归真实的bounding box位置(如RCNN做的那样,但是是用神经网络来实现)。

其他都是一目了然的,接下来主要讲RoI pooling

RoI pooling

我们可以根据卷积运算的规则,推算出原图的region对应feature map中的哪一部分。但是因为原图region的大小不一,这些region对应的feature map尺寸是不固定的,RoI pooling就是为了得到固定大小的feature map。

  • RoI pooling层使用max pooling将不同的RoI对应的feature map转为固定大小的feature map。
    • 首先将h * w的feature map划分为H * W个格子
    • 对每个格子中的元素做max pooling

由于多个RoI会有重复区域,所以max pooling时,feature map里同一个值可能对应pooling output的多个值。所以BP算梯度的时候,从RoI pooling层output y到input x的梯度是这样求的

RoI gradient

其中

  • i *(r, j) = argmaxi'∈R(r,j) xi',也就是在R(r, j)这个区域中做max pooling得到的结果,
  • i = i * (r, j) 是一个条件表达式,就是判断input的xi是否是max pooling的结果,如果不是,输出的梯度就不传到这个值上面
  • r是RoI数量,j是在一个region中,与x对应的输出个数
  • yrj是第j个跟x对应的输出

举例:

RoI pooling BP

也就是说,将Loss对输出的梯度,传回到max pooling对应的那个feature unit上,再往回传

其实这是SPPnet的一个特例,是Spatial pooling,没有pyramid,也因此计算量大大减少,能够实现FC到CNN的梯度反向传播,并且,实验发现其实feature pyramid对准确率提升不大。倒是原图层面的Pyramid作用大些:

  • 训练时,为每张训练图片随机选一个尺度,缩放后扔进网络学
  • 测试时,用image pyramid为每张测试图片中的region proposal做尺度归一化(将它们缩放到224x224)

但是这种Pyramid方法计算代价比较大,所以Fast RCNN中只在小模型上有这样做

Multi-task loss

  • Lcls: SoftMax多分类Loss,没啥好说的
  • LIoc:bounding box regression loss

定义真实的bounding box为(vx, vy, vw, vh),预测的bounding box位置(由第二个fc层输出,有K个类,每个类分别有4个值,分别为)txk,tyk,twk, thk

LIoc(tk, v) = ∑i∈{x,y,w,h} smoothL1(tik - vi)

即预测位置和真实位置四个值的差值求和,其中

smoothL1(x) = 0.5x2 if |x|<1 otherwise |x|-0.5

是一个软化的L1(画一下图像可以看出来,在(-1,1)的范围内是抛物线,没L1那么尖锐),如果采用L2 loss,需要仔细调节学习率防止梯度爆炸。
smooth L1

整个模型的Loss就是:

L(p, k, tk, v) = Lcls(p, k) + λ|k ≥ 1| LIoc(tu, v)

  • p代表预测类别,k代表真实类别
  • k≥1意味着不算0类(也就是背景类)的bounding box loss,因为背景的bounding box没啥意义
  • λ是超参数,在论文的实验中设为1

训练

  • ImageNet预训练
  • 最后一层换成RoI pooling层
  • FC+sofmax分类层换成两个FC,分别求softmax分类和bounding box回归loss,每个类有自己的bounding box regressor
  • 用Detection数据BP微调整个神经网络

这就比较厉害了,谁不喜欢end to end,之前RCNN是需要分开微调SVM分类层和bounding box regressor的

前面讲了RoI pooling使得梯度反向传播到卷积层成为可能,但是这种BP训练仍然很耗显存和时间,尤其是在输入的ROI属于不同图片时,因为单张图的feature map是不存到磁盘的,当一张图的几个RoI和其他图的几个RoI混在一起交替输入时,需要反复前向传播计算feature map,再pooling,实际上也就反复计算了feature map。

在Fast RCNN的训练中,每次输入两张图(这么小的batch size),每张图取64个ROI,单张图的多个ROI在前向计算和后向传播过程中是共享feature map的的,这样就加快了训练速度。

然而,这犯了训练中的一个忌讳,实际上,相当于训练数据(ROI)没有充分shuffle,但在Fast RCNN的实验中效果还行,就先这样搞了。

样本筛选

  • 正样本:与bounding box有超过50%重叠率的
  • 负样本(背景):与bounding box重叠率位于0.1到0.5之间的。

Truncated SVD加速全连接层运算

  • Truncated SVD

W ≈ U∑tVT

将u×v大小的矩阵W分解为三个矩阵相乘,其中,U是一个u×t的矩阵,包含W的前t个左奇异向量,∑t是一个t×t的对角矩阵,包含W的前t个上奇异向量,VT是一个v×t的矩阵,包含W的钱t个右奇异向量,参数数量从uv变成t(u+v),当t远小于min(u,v)时,参数数量就显著少于W。

具体实现上,将一个权重为W的全连接层拆成两个,第一层的权重矩阵为∑tVT(并且没有bias),第二层的权重矩阵为U(带上W原来的bias)。

在Fast RCNN中,Truncated SVD减少了30%的训练时间。

实验结果

PK现有方法

  • 在VOC12上取得65.7%的mAP,是当时的SOA
  • 在VGG16上,Fast R-CNN训练速度是RCNN的9倍, 测试速度是RCNN213倍;
  • 训练速度是SPP-net的3倍,测试速度是SPP-net的3倍

创新点必要性验证

  • RoI pooling是否比SPP更优?(是否有fine tune卷积层的必要?)
    • 使用VGG16,在Fast RCNN中冻结卷积层,只fine tune全连接层:61.4%
    • 使用VGG16,在Fast RCNN中fine tune整个网络:66.9%
  • Multi Loss(Softmax + bb regressor)是否比Single task(只用Softmax loss)更优?stage-wise和Multi Task同时进行(end2end)哪个更优?

在VOC07上,end2end + bb regressor > stage-wise+ bb regressor > end2end

  • Image Pyramid是否必须?
    实际上,使用Pyramid在Fast RCNN上只提升了1%左右,所以这个也没被列为正式的创新点

  • 如果用SVM来分类会不会更好?

image.png

S M L是由浅到深的三个网络,可以看到,只用Softmax分类也能达到不错的效果,在网络比较深的情况下,也有超越SVM的可能。

  • 模型泛化能力
    一个模型如果能够在更多训练数据的条件下学到更好的特征分布,这个模型效果越好,RBG用VOC12去训练Fast RCNN,然后在VOC07上测试,准确率从66.9%提升到70.0%。在其他组合上也取得了提升。

注意,在训练更大的数据的时候,需要更多的iteration,更慢的learning rate decay。

  • 使用更多的Region Proposal效果会不会更好?(不是很想讲这方面,太玄学)

More Region Proposal

图中红色线表示Average Recall,通常人们用Average Recall来评价Region Proposal的效果,然而,proposals越多,AR这个指标一直往上涨,但实际上的mAP并没有上升,所以使用AR这个指标比较各种方法的时候要小心,控制proposal的数量这个变量不变。

图中蓝色线表示mAP(= AVG(AP for each object class)),可以看到,

  • 太多的Region Proposal反而会损害Fast RCNN的准确度
  • DPM使用滑动窗口+层次金字塔这种方法提供密集的候选区域,用在Fast RCNN上略有下降。

转载于:https://www.cnblogs.com/hellocwh/p/8671878.html

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

智能推荐

Tinymce - 菜单项 / 工具栏配置参考表格_tinymce 工具栏添加单选框-程序员宅基地

配置项所属插件描述newdocument核心创建新文档bold核心加粗italic核心斜体underline核心下划线strikethrough核心删除线alignleft核心居左aligncenter核心居中alignright核心居右alignjustify核心两端对齐alignnone核心清除styleselect核心格式选择下拉框(缩进、行高)formatselect核心段落选择下拉框(段落、标题)fontselect核心字体选择下拉框fontsizeselect核心字号选择下拉框cut核心剪切c._tinymce 工具栏添加单选框

第13周项目2 (3)-程序员宅基地

/* *copyright(c) 2016,烟台大学计算机与控制工程学院 *All rights reserved *文件名称:test.cpp *作者:李硕 *版本:Code::Blocks * *问题描述:每一个Animal的派生类都有一个“名字”数据成员,这一共有的成员完全可以由基类提供改造上面的程序, 将这一数据成员作为抽象类Animal数据成员被各派生

java调用父类有参构造函数_Java有参数的父类构造函数调用过程-程序员宅基地

public abstract class Animal{private String name;public String getName(){return name;}public Animal(String theName){name = theName;}}public class Hippo extends Animal{public Hippo(String name){super(n..._java中怎么调用含参数的父类的构造方法

C#-MVC中的关于表格的导出操作_小丑的舞台的博客-程序员宅基地

C#-MVC中的关于表格的导出操作在我们处理表格数据的时候,不妨有时候会有这样一个要求:请将表格里的数据导出到工作表中;如下所示;这是我在写项目式导入的代码public ActionResult ExportExcel(string search) { List<bookVos> book = (from tbbook in mymodels.book join tbli...

Java使用Tess4J 进行图片文字识别 笔记-程序员宅基地

最近的工作中需要使用到从图片中识别文字的操作,就在网上找到到Tess4j.那么,现在来总结一下使用中遇到的问题.关于Tess4J简价:http://tess4j.sourceforge.net/ (你懂的)很简洁的项目主页.一个从Java角度使用JNA封闭的针对 Tesseract ORC 的开源项目,使用 Apache License, v2.0 协议.支持TIFF, JP...

随便推点

数字图像处理笔记二 - 图片缩放(最近邻插值(Nearest Neighbor interpolation))_最近临点法数字图像-程序员宅基地

图片缩放的两种常见算法:最近邻域内插法(Nearest Neighbor interpolation)双向性内插法(bilinear interpolation)本文主要讲述最近邻插值(Nearest Neighbor interpolation算法的原理以及python实现基本原理最简单的图像缩放算法就是最近邻插值。顾名思义,就是将目标图像各点的像素值设为源图像中与其最近的点。..._最近临点法数字图像

关于PNG导入Unity透明通道不显示为黑色的曲线救国方法-程序员宅基地

有很多PS导出的PNG图片导入Unity中时,透明通道显示总是会有一些不可预知的问题,大体原因是由于编码的问题。今日我做的图片导入Unity 中时,透明区域为白色,导致不能用于Shader,在上网查询和多次尝试后,发现一种效率极高又及其简便的方法可以解决问题。我们都知道,Windows系统自带的有一个画图工具,不过Windows10还带了一个画图3D,将PS导出的PNG图片通过画图3D打开,将...

蓝桥杯单片机第九届省赛-彩灯控制器_蓝桥杯单片机彩灯控制器每个模块原理-程序员宅基地

蓝桥杯单片机第九届省赛-彩灯控制器Notes1:动态LED亮度等级Notes2:EEPROM第一次上电读取数据的处理Notes3:LED流水灯的实现方法Notes4:暂态与稳态Notes5:数码管闪烁的问题再发现Notes6:通过设置标志位/计数单位让某段程序只执行一次基本原理依旧是PWM输出控制LED亮度,????PWM控制LED基本原理可在没有对EEPROM写入任何数据(默认为0)或者写入其他不合理的数据时,读取到的 流转间隔 时间是不合理的(不在400~1200ms范围内或者led乱闪_蓝桥杯单片机彩灯控制器每个模块原理

类型转换坑死人-程序员宅基地

做了POJ上的一道题 WA了无数次 一直找不到错误啊 人都炸了尽然是一个类型转换没注意到一般数字 变量 电脑都会默认 给一个 类型 一般是int比如 double aa=3/2;你会发现输出的是1.00000这种“自作主张”会很烦真的但是 你不先声明 3 和 2 就当 int型了 算出的答案也是 最后给了 double的a;再比如 ans是64位的

python数学公式代码导入_使用Python一键生成LaTeX数学公式-程序员宅基地

简介latexify使用教程latexify-py模块安装基本语法实例加减乘除、分数分段函数根号、幂三角函数绝对值对数Markdown的数学公式相关教程参考资料、GitHub地址简介在Markdown的笔记编辑中,公式的编辑一直是个棘手的问题,动辄大段的公式代码属实让人提不起兴趣,这里介绍一款Python第三方库latexify,助力公式编辑。latexify_py:Generates LaTeX..._latexify-py

PTA(数据结构)-带头结点的单链表就地逆置_单链表逆置pta-程序员宅基地

本题要求编写函数实现带头结点的单链线性表的就地逆置操作函数。L是一个带头结点的单链表,函数ListReverse_L(LinkList &L)要求在不新开辟节点的前提下将单链表中的元素进行逆置,如原单链表元素依次为1,2,3,4,则逆置后为4,3,2,1。 函数接口定义:void ListReverse_L(LinkList &L);其中 L 是一个带头结点的单链表。裁判测试程序样例://库函数头_单链表逆置pta