引言

Fast R-CNN设计思路

  1. Fast R-CNN将整张图片和选择性搜索算法提取出来的候选区域作为输入,对整张图片利用卷积+池化的组合提取特征,产生一个feature map(特征层),结合选择性搜索算法提取出来的候选区域位置,从feature map中选择对应位置的特征(红色框)送到RoI pooling层
  2. 因为后面的全连接层需要固定大小的输入,所以作者在RoI pooling层对其采用了特殊的处理。即将\(h \times w\)输入划分成固定的输出大小\(H \times W\),这样\(H \times W\)的每个单元格中包含了\(h/H \times w/W\)个元素,对其中的元素进行maxpool,就得到了固定的输出大小\(H \times W\)。
  3. 将RoI pooling后的输出送入全连接层后在两个子网络分别进行输出和回归。

一、动机

​目标检测领域一个经典的问题,难易样本不均衡。

二、现有方案hard negative mining 及其窘境

hard negative mining实现

  1. 固定模型,去寻找难样本添加到样本集中
  2. 在上一步中选出的样本集中更新模型
  3. 重复以上步骤直到满足条件如模型性能不再上升

窘境

​固定模型寻找难样本对于目标检测计算量太大,一个图片有约\(2k+\)个候选区域,其次因为难样本RoI与对应的图片关联,没有办法单独保存难RoI到样本集中去,要想学习难样本必须对对应图片再来一次候选区域提取和卷积特征提取,并对不需要再学习的简单样本来一次梯度更新,想想都很麻烦还慢。所以Fast R-CNN中没有用。不过Fast R-CNN采用了一个正负样本1:3的设计。

设计思路

​由以上分析可以看出来,这种交替执行寻找难样本的方法在Fast R-CNN中实现是不现实的,如果能在线学习的话,就可以解决掉这个问题。下面是作者的思路

OHEM步骤:

  1. 提取N张图片的特征,提取RoI
  2. 对所有的RoI计算loss, 然后选择其中表现最差(\(loss=l_{cls}+l_{reg}\)最大)的B/N个RoI。
  3. 然后利用选择出来的B/N个RoI更新网络
  4. 重复2-3步骤
    ​对于第二步,作者说因为卷积特征提取层的参数共享,前向传播计算所有loss的计算量很小。
    ​这里有个注意事项是,因为相邻的RoI很可能拥有相邻的loss,对loss进行选择的时候容易重复选择,所以采用了NMS的方法,将IoU大于0.7的loss低的RoI移除了。
    ​另一个问题是,如果只是简单的将其他没有被选择的RoI的loss置为零,但是仍然会对所有RoI分配空间存储参数并进行反向传播计算,这十分不高效。所以,作者设计了一个新的结构来优化上述结构。

    作者设计了一个只进行前向传播的结构(绿色)和一个用来进行反向更新的结构(红色)。红色和绿色的部分网络完全相同且共享权重参数。前向结构用来计算所有RoI的loss,然后从中挑出B/N个loss最大的RoI送到红色的结构中进行反向传播,这样,进行反向传播的就只有B/N个RoI了,从而减少了计算量。作者实验表明,使用这种方法与不使用相比,空间占用差不多,但是快了两倍多。

反向传播

​看不懂Fast R-CNN的反向传播,暂时先空着。

实验结果


​其中N表示一次采样几张图片,LR是学习率,B是batch_size,bg_lo是Fast R-CNN中正负样本划分的值,[bg_lo, 0,5)被认为是负样本。可以看到网络精度提升了2个百分点。

​推理时间慢了一点,但也不是特别多。

最新文章

  1. NodeJs 开发微信公众号(五)真实环境部署
  2. 一步一步开发Game服务器(四)地图线程
  3. 事务处理-回滚(转账操作)(转自http://www.cnblogs.com/void-m/p/6143540.html)
  4. Win7快速启动栏
  5. css3新增的属性选择器
  6. C# 调用VC++的DLL,VC++封装DLL
  7. excel让每个单元格的宽度随着字体自动变动的两种方式(有更好方法的大神,请忽略,求评论下)
  8. 《有限元分析基础教程》(曾攀)笔记一-二维杆单元有限元程序(基于Python)
  9. 问题-delphi 程序在某电脑中显示???问号 乱码
  10. ViewPager的用法和实现过程
  11. spoj BRCKTS - Brackets 线段树
  12. HDU 2647 Reward(图论-拓扑排序)
  13. Linux命令之初出茅庐
  14. Java多线程Master-Worker模式
  15. 发布Ext JS 5.1 beta版本
  16. LeetCode算法题-Implement Stack Using Queues
  17. Python集合及其运算
  18. 区块链教程(二):比特币、区块链、以太坊、Hyperledger的关系
  19. C# Mongo Client 2.4.2判断是否存在表
  20. 【java】for循环嵌套

热门文章

  1. Shell考题中级篇
  2. Dubbo(二):深入理解Dubbo的服务发现SPI机制
  3. jsp:useBean 不能编译成class或者没有class这个属性
  4. CSS颜色表示的几种方式
  5. Sophus库CMakeLists.txt内容详解笔记
  6. PC微信逆向--实现消息防撤回
  7. 利用idea对tomcat容器进行debug
  8. D语言-随机数游戏
  9. 安装MinGW出现 mingw-get: *** ERROR *** Get package:
  10. 使用递归函数用来输出n个元素的所有子集(数据结构、算法与应用)