文章《Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks》是为了改进Fast R-CNN而提出来的。因为在Fast R-CNN文章中的测试时间是不包括search selective时间的,而在测试时很大的一部分时间要耗费在候选区域的提取上。(对于Fast R-CNN的详细知识,请查看Fast R-CNN文章详细解读。)Faster R-CNN正是为解决这个问题而提出来的。

为了更好的理解Faster R-CNN的内容,先来看一下Faster R-CNN的整体结构,如下图所示

更为详细的图,如下

通过上面两张图可以看出Faster R-CNN由四个部分组成:
1)卷积层(conv layers),用于提取图片的特征,输入为整张图片,输出为提取出的特征称为feature maps
2)RPN网络(Region Proposal Network),用于推荐候选区域,这个网络是用来代替之前的search selective的。输入为图片(因为这里RPN网络和Fast R-CNN共用同一个CNN,所以这里输入也可以认为是featrue maps),输出为多个候选区域,这里的细节会在后面详细介绍。
3)RoI pooling,和Fast R-CNN一样,将不同大小的输入转换为固定长度的输出,输入输出和Faste R-CNN中RoI pooling一样。
4)分类和回归,这一层的输出是最终目的,输出候选区域所属的类,和候选区域在图像中的精确位置。

1.RPN
通过上述介绍可以知道,Faster R-CNN与Fast R-CNN最大的区别就是提出了一个叫RPN(Region Proposal Networks)的网络,专门用来推荐候选区域的,RPN可以理解为一种全卷积网络,该网络可以进行end-to-end的训练,最终目的是为了推荐候选区域,如下图所示。

原文中RPN网络为CNN后面接一个33的卷积层,再接两个11的卷积层(原文称这两个卷积层的关系为sibling),其中一个是用来给softmax层进行分类,另一个用于给候选区域精确定位。

到这里其实有个疑问没有说清楚,也算是理解这篇文章的重点,通过CNN得到的feature map怎么可以通过RPN得到与原图对应的候选区域的,换句话说,RPN输出的候选区域和softmax的结构怎么与原图中的区域进行对应的。要解决这个疑问就得先理解anchors的概念。

2.anchors
anchors可以理解为一些预设大小的框,anchors的种类用k表示,在原文中k=9,由3种面积(1282128^21282,2562256^22562,5122512^25122)和3种长宽比(1:1,1:2,2:1)组成,这里anchors的大小选取是根据检测时的图像定义,在检测时会将最小边缩放到600,最大边不超过1000(我看的是tf版本的代码)。生成anchors如下

[[ -84.  -40.   99.   55.][-176.  -88.  191.  103.][-360. -184.  375.  199.][ -56.  -56.   71.   71.][-120. -120.  135.  135.][-248. -248.  263.  263.][ -36.  -80.   51.   95.][ -80. -168.   95.  183.][-168. -344.  183.  359.]]

因为提出的候选区域是在原图上的区域,所以要清楚anchors在原图中的位置。假设CNN得到的feature map大小为w∗hw*hw∗h,那总的anchors个数为9∗w∗h9*w*h9∗w∗h,9为上述的9种anchors。假设原图大小为W∗HW*HW∗H,由SPP-net文章详细解读知W=S⋅w,H=S⋅hW=S \cdot w,H=S\cdot hW=S⋅w,H=S⋅h,S为之前所有层的stride size相乘,所以feature map上的点乘以S即为anchors的原点位置,得到所有框的原点位置以及大小就可以得到原图上的anchors区域了。

那RPN的输出跟anchors是什么关系呢,通过下图进行讨论

解释一下上面这张图:

1)在原文中使用的是ZF model中,其Conv Layers中最后的conv5层num_output=256,对应生成256张特征图(feature maps),所以相当于feature map每个点都是256-dimensions
2)在conv5之后,做了rpn_conv/3x3卷积且num_output=256,相当于每个点又融合了周围3x3的空间信息),同时256-d不变
3)假设在conv5 feature map中每个点上有k个anchor(原文如上k=9),而每个anhcor要分foreground和background,所以每个点由256d feature转化为cls=2k scores;而每个anchor都有[x, y, w, h]对应4个偏移量,所以reg=4k coordinates(scores和coordinates为RPN的最终输出)
4)补充一点,全部anchors拿去训练太多了,训练程序会在合适的anchors中随机选取128个postive anchors+128个negative anchors进行训练(至于什么是合适的anchors接下来RPN的训练会讲)

注意,在tf版本的代码中使用的VGG conv5 num_output=512g,所以是512d,其他类似。

3.RPN训练
RPN训练中对于正样本文章中给出两种定义。第一,与ground truth box有最大的IoU的anchors作为正样本;第二,与ground truth box的IoU大于0.7的作为正样本。文中采取的是第一种方式。文中定义的负样本为与ground truth box的IoU小于0.3的样本。
训练RPN的loss函数定义如下:
L({pi},{ti})=1Ncls∑iLcls(pi,pi∗)+λ1Nreg∑ipi∗Lreg(ti,ti∗)L(\{p_{i}\},\{t_{i}\})=\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})L({pi​},{ti​})=Ncls​1​∑i​Lcls​(pi​,pi∗​)+λNreg​1​∑i​pi∗​Lreg​(ti​,ti∗​)
其中,i表示mini-batch中第i个anchor,pip_{i}pi​表示第i个anchor是前景的概率,当第i个anchor是前景时pi∗p^{*}_{i}pi∗​为1反之为0,tit_{i}ti​表示预测的bounding box的坐标,ti∗t^{*}_{i}ti∗​为ground truth的坐标。
看过Fast R-CNN文章详细解读文章的会发现,这部分的loss函数和Fast R-CNN一样,除了正负样本的定义不一样,其他表示时一样的。

4.RPN网络与Fast R-CNN网络的权值共享
RPN最终目的是得到候选区域,但在目标检测的最终目的是为了得到最终的物体的位置和相应的概率,这部分功能由Fast R-CNN做的。因为RPN和Fast R-CNN都会要求利用CNN网络提取特征,所以文章的做法是使RPN和Fast R-CNN共享同一个CNN部分。
Faster R-CNN的训练方法主要分为两个,目的都是使得RPN和Fast R-CNN共享CNN部分,如下图所示

一个是迭代的,先训练RPN,然后使用得到的候选区域训练Fast R-CNN,之后再使用得到的Fast R-CNN中的CNN去初始化RPN的CNN再次训练RPN(这里不更新CNN,仅更新RPN特有的层),最后再次训练Fast R-CNN(这里不更新CNN,仅更新Fast R-CNN特有的层)。
还有一个更为简单的方法,就是end-to-end的训练方法,将RPN和Fast R-CNN结合起来一起训练,tf版本的代码有这种方式的实现。

参考
1.https://github.com/endernewton/tf-faster-rcnn
2.https://web.cs.hacettepe.edu.tr/~aykut/classes/spring2016/bil722/slides/w05-FasterR-CNN.pdf
3.https://zhuanlan.zhihu.com/p/31426458

Faster R-CNN文章详细解读相关推荐

  1. Faster R CNN

    Faster R CNN 3 FASTER R-CNN 我们的Faster R CNN 由两个模块组成,第一个模块是 proposes regions 的全卷积网络,第二个是使用 proposed r ...

  2. 结绳法:文章详细解读(异步时钟设计的同步策略)(五)

    一.典型方法(双锁存器法)

  3. R回归模型输出结果详细解读:summary、call、residuals、Coefficients、Assessing Model Fit

    R回归模型输出结果详细解读:summary.call.residuals.Coefficients.Assessing Model Fit 目录 R回归模型输出结果详细解读:summary.call. ...

  4. CNN网络详细讲解,可视化图例解读

    写在前面 想了解CNN详细网络工作过程的,可以直接找到第二部分,如果大家觉得有什么不对的地方,非常感谢留言指教~感激不尽 1. CNN网络应用场景 对二维图像进行特征提取.可以和多种网络进行拼接,比如 ...

  5. 经典神经网络论文超详细解读(八)——ResNeXt学习笔记(翻译+精读+代码复现)

    前言 今天我们一起来学习何恺明大神的又一经典之作: ResNeXt(<Aggregated Residual Transformations for Deep Neural Networks&g ...

  6. 【YOLO系列】YOLOv1论文超详细解读(翻译 +学习笔记)

    前言 从这篇开始,我们将进入YOLO的学习.YOLO是目前比较流行的目标检测算法,速度快且结构简单,其他的目标检测算法如RCNN系列,以后有时间的话再介绍. 本文主要介绍的是YOLOV1,这是由以Jo ...

  7. 【YOLO系列】--YOLOv1超详细解读/总结

    文章目录 前言 摘要 一.Introduction-介绍 二. Unified Detection-统一检测 三.Comparison to Other Detection Systems-与其他目标 ...

  8. 个性化联邦学习PFedMe详细解读(NeurIPS 2020)

    关注公众号,发现CV技术之美 本文介绍一篇 NeurIPS 2020 的论文『Personalized Federated Learning with Moreau Envelopes』,对个性化联邦 ...

  9. android蓝牙设置特征属性,Android BLE蓝牙详细解读(二)

    上篇文章主要介绍了关于BLE的一些基础操作,我们能够大概了解到蓝牙操作的一些流程,上文末介绍了本人的一个BLE开源库,支持蓝牙一对多的连接方式,该库封装了蓝牙的开启.扫描.连接.断开.连接超时...一 ...

最新文章

  1. 面试官:群聊消息的已读未读功能,你来设计一个?
  2. VC++中从txt文本中读取数据并且存到二维数组中
  3. python【蓝桥杯vip练习题库】ADV-351比大小
  4. LeNet试验(四)使用shuffle label观察网络的记忆能力
  5. NeurIPS 2021 | 港中文周博磊组:基于实例判别的数据高效生成模型
  6. Android UI selector 例子 (drawable/color)
  7. java表数据去重_java8实现列表去重,java8的stream 和lambda的使用实例
  8. oracle11g中用asmlib配置磁盘组,ASM学习笔记_配置ASMLIB磁盘组
  9. Python趣味编程3则:李白买酒、猴子吃桃、宝塔上的琉璃灯
  10. DB2 多表空间 重定向 还原
  11. vba 正则表达式_VBA中正则表达式与数组结合的应用案例
  12. 如何修复win7蓝牙服务器,高手亲自解决win7卸载蓝牙驱动的修复操作
  13. 研发项目wbs分解简单案例_wbs分解案例
  14. jbb是什么梗_太阳星座是什么意思
  15. Neural Tangent Kernel 理解(一)原论文解读
  16. visio studio code安装之后的两个错误的解决办法
  17. 菜单栏点击显示二级菜单_显示完整菜单
  18. clo6|clo standalone 6(3D服装设计软件) v6.0.328.32100
  19. 构建施耐德楼控系统数据库后台服务器示例工程二(数据库查询编写)
  20. 十大密码攻击及缓解措施

热门文章

  1. Python—期末考试模拟训练题
  2. 使用matplotlib.pyplot绘制论文图片
  3. MapStruct Unknown property “xx“ in result type XXX. Did you mean “null“?
  4. EPICS记录参考--计算输出记录(calcout)
  5. 在线支付支付宝(一)之开发者账号申请
  6. 【第4期-智能驾驶汽车系列术语概念解析】第1节:基于车道线方程的曲率计算
  7. matlab 编程小球经历路程(s)以及第几次反弹高度(L)
  8. 《华为区块链白皮书》重磅发布(4大类应用场景/5分钟上链/)
  9. mysql创建储存过程 输入学生名子_创建一个存储过程,给定某学生学号,要求查询出该学生的姓名,所选课程名和成绩.(SQL SERVER)...
  10. 改善代码设计 —— 优化函数的构成(Composing Methods)