论文:《Faster R-CNN: Towards Real-Time ObjectDetection with Region Proposal Networks》

摘要:算法主要解决两个问题:

1、提出区域建议网络RPN,快速生成候选区域;

2、通过交替训练,使RPN和Fast-RCNN网络共享参数。

一、 RPN网络结构

RPN网络的作用是输入一张图像,输出一批矩形候选区域,类似于以往目标检测中的Selective Search一步。网络结构是基于卷积神经网络,但输出包含二类softmax和bbox回归的多任务模型。网络结果如下(以ZF网络为参考模型):

其中,虚线以上是ZF网络最后一层卷积层前的结构,虚线以下是RPN网络特有的结构。首先是3*3的卷积,然后通过1*1卷积输出分为两路,其中一路输出是目标和非目标的概率,另一路输出box相关的四个参数,包括box的中心坐标x和y,box宽w和长h。

(至于之前为什么要用3*3的卷积核,我觉得是和感受野大小相对应的。在原来的ZF模型中,3*3卷积核对应map比例是3/13,相当于在型如1000*600的图片中采用180左右的感受野。对于1000*600的图片中大部分目标而言,这个大小的感受野是比较合适的吧。)

从卷积运算本身而言,卷积相当于滑窗。假如输入图像是1000*600,则经过了几次stride后,map大小缩小了16倍,最后一层卷积层输出大约为60*40大小,那么相当于用3*3的窗口滑窗(注意有padding),对于左边一支路而言,输出18个通道,每个通道map大小仍为60*40,代表每个滑窗中心对应感受野内存在目标与否的概率。右支路同理。

二、 anchor机制

anchor是rpn网络的核心。刚刚说到,需要确定每个滑窗中心对应感受野内存在目标与否。由于目标大小和长宽比例不一,需要多个尺度的窗。Anchor即给出一个基准窗大小,按照倍数和长宽比例得到不同大小的窗。例如论文中基准窗大小为16,给了(8、16、32)三种倍数和(0.5、1、2)三种比例,这样能够得到一共9种尺度的anchor,如图(摘自http://blog.csdn.net/shenxiaolu1984/article/details/51152614)。

因此,在对60*40的map进行滑窗时,以中心像素为基点构造9种anchor映射到原来的1000*600图像中,映射比例为16倍。那么总共可以得到60*40*9大约2万个anchor。

三、 训练

RPN网络训练,那么就涉及ground truth和loss function的问题。对于左支路,ground truth为anchor是否为目标,用0/1表示。那么怎么判定一个anchor内是否有目标呢?论文中采用了这样的规则:1)假如某anchor与任一目标区域的IoU最大,则该anchor判定为有目标;2)假如某anchor与任一目标区域的IoU>0.7,则判定为有目标;3)假如某anchor与任一目标区域的IoU<0.3,则判定为背景。所谓IoU,就是预测box和真实box的覆盖率,其值等于两个box的交集除以两个box的并集。其它的anchor不参与训练。

于是,代价函数定义为:

代价函数分为两部分,对应着RPN两条支路,即目标与否的分类误差和bbox的回归误差,其中Leg(ti,ti*) = R(ti-ti*)采用在Fast-RCNN中提出的平滑L1函数,作者认为其比L2形式的误差更容易调节学习率。注意到回归误差中Leg与pi相乘,因此bbox回归只对包含目标的anchor计算误差。也就是说,如果anchor不包含目标,box输出位置无所谓。所以对于bbox的groundtruth,只考虑判定为有目标的anchor,并将其标注的坐标作为ground truth。此外,计算bbox误差时,不是比较四个角的坐标,而是tx,ty,tw,th,具体计算如下:

四、 联合训练

作者采用四步训练法:

1) 单独训练RPN网络,网络参数由预训练模型载入;

2) 单独训练Fast-RCNN网络,将第一步RPN的输出候选区域作为检测网络的输入。具体而言,RPN输出一个候选框,通过候选框截取原图像,并将截取后的图像通过几次conv-pool,然后再通过roi-pooling和fc再输出两条支路,一条是目标分类softmax,另一条是bbox回归。截止到现在,两个网络并没有共享参数,只是分开训练了;

3) 再次训练RPN,此时固定网络公共部分的参数,只更新RPN独有部分的参数;

4) 那RPN的结果再次微调Fast-RCNN网络,固定网络公共部分的参数,只更新Fast-RCNN独有部分的参数。

至此,网络训练结束,网络集检测-识别于一体,测试阶段流程图如下:

 

有一些实现细节,比如RPN网络得到的大约2万个anchor不是都直接给Fast-RCNN,因为有很多重叠的框。文章通过非极大值抑制的方法,设定IoU为0.7的阈值,即仅保留覆盖率不超过0.7的局部最大分数的box(粗筛)。最后留下大约2000个anchor,然后再取前N个box(比如300个)给Fast-RCNN。Fast-RCNN将输出300个判定类别及其box,对类别分数采用阈值为0.3的非极大值抑制(精筛),并仅取分数大于某个分数的目标结果(比如,只取分数60分以上的结果)。

Faster-RCNN 算法解读(转)的更多相关文章

  1. 第三十一节,目标检测算法之 Faster R-CNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

  2. 【目标检测】Faster RCNN算法详解

    Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...

  3. 目标检测算法之Faster R-CNN算法详解

    Fast R-CNN存在的问题:选择性搜索,非常耗时. 解决:加入一个提取边缘的神经网络,将候选框的选取交给神经网络. 在Fast R-CNN中引入Region Proposal Network(RP ...

  4. faster rcnn算法及源码及论文解析相关博客

    1. 通过代码理解faster-RCNN中的RPN http://blog.csdn.net/happyflyy/article/details/54917514 2. faster rcnn详解 R ...

  5. Faster RCNN算法训练代码解析(3)

    四个层的forward函数分析: RoIDataLayer:读数据,随机打乱等 AnchorTargetLayer:输出所有anchors(这里分析这个) ProposalLayer:用产生的anch ...

  6. Faster RCNN算法训练代码解析(1)

    这周看完faster-rcnn后,应该对其源码进行一个解析,以便后面的使用. 那首先直接先主函数出发py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py ...

  7. Faster RCNN算法demo代码解析

    一. Faster-RCNN代码解释 先看看代码结构: Data: This directory holds (after you download them): Caffe models pre-t ...

  8. Faster RCNN算法训练代码解析(2)

    接着上篇的博客,我们获取imdb和roidb的数据后,就可以搭建网络进行训练了. 我们回到trian_rpn()函数里面,此时运行完了roidb, imdb = get_roidb(imdb_name ...

  9. 论文阅读笔记二十七:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(CVPR 2016)

    论文源址:https://arxiv.org/abs/1506.01497 tensorflow代码:https://github.com/endernewton/tf-faster-rcnn 室友对 ...

  10. 目标检测-Faster R-CNN

    [目标检测]Faster RCNN算法详解 Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with r ...

随机推荐

  1. 志愿者招募 [NOI2008] [鬼畜网络流]

    Description 申奥成功后,布布经过不懈努力,终于成为奥组委下属公司人力资源部门的主管.布布刚上任就遇到了一个难题:为即将启动的奥运新项目招募一批短期志愿者.经过估算,这个项目需要N 天才能完 ...

  2. 2017.08.06【NOIP提高组】模拟赛B组

    Summary 今天的比赛60+100+100=260分,没有想到第一题正解是搜索,我与AK差一段距离,这段距离,叫倒着搜.总的来说不是很难. Problem T1 天平 题目大意 给你N个排序好的砝 ...

  3. oracle 连接

    1.简述  1) 两个表的连接,是通过将一个表中的一列或者多列同另一个表中的列链接而建立起来的.用来连接两张表的表达式组成了连接条件.当连接成功后,第二张表中的数据就同第一张表连接起来了,并形成了复合 ...

  4. angular学习笔记(2)- 前端开发环境

    angular1学习笔记(2)- 前端开发环境 1.代码编辑工具 2.断点调试工具 3.版本管理工具 4.代码合并和混淆工具 5.依赖管理工具 6.单元测试工具 7.集成测试工具 常见的前端开发工具 ...

  5. django之模型层(model)--添加、单表查询、修改基础

    上篇带大家简单做了一下图书表的创建.简单的查看和删除,今天会先简单介绍添加和修改,因为添加和修改与删除一样都很简单,本篇会相对多介绍一点单表查询,大家都知道数据库中查询是最重要的一部分,毕竟无论是修改 ...

  6. win32下使用相对exe文件的绝对路径资源

    在使用VC++进行开发时,如果按F5进行Debug时,当前相对资源是相对工程的vcxproj的文件夹目录,而直接双击运行exe时,资源是相对exe的文件夹目录.为了兼容这二者,最好使用绝对路径,这样无 ...

  7. ABAP语言实现 左移 <<、无符号右移 >>> 位移操作

    这几天要在ABAP中实现 3DES 标准对称加密算法,与其他外部系统进行加密/解密操作.由于ABAP语言中没有 左移 <<.无符号右移 >>>  操作,只能自己实现 思路 ...

  8. Java8 stream 中利用 groupingBy 进行多字段分组求和

    Java8的groupingBy实现集合的分组,类似Mysql的group by分组功能,注意得到的是一个map 对集合按照单个属性分组 case1: List<String> items ...

  9. SpringBoot 2.x 集成QQ邮箱、网易系邮箱、Gmail邮箱发送邮件

    在Spring中提供了非常好用的 JavaMailSender接口实现邮件发送,在SpringBoot的Starter模块中也为此提供了自动化配置. 项目源码已托管在Gitee-SpringBoot_ ...

  10. mysql函数之SUBSTRING_INDEX(str,"/",-1)

    SUBSTRING_INDEX的用法: •SUBSTRING_INDEX(str,delim,count) 在定界符 delim 以及count 出现前,从字符串str返回自字符串.若count为正值 ...