Faster rcnn代码理解(2)
接着上篇的博客,咱们继续看一下Faster RCNN的代码~
上次大致讲完了Faster rcnn在训练时是如何获取imdb和roidb文件的,主要都在train_rpn()的get_roidb()函数中,train_rpn()函数后面的部分基本没什么需要讲的了,那我们再回到训练流程中来:

这一步训练的网络结构见下图:

训练的第一步就这么完成了(RPN网络使用gt_roidb训练完成),还有,这里的train_rpn()函数中有涉及到train_net()函数,即用来训练得到网络模型,我会在训练fast rcnn时给出讲解;之后再进行第二步:

产生proposal的网络结构如下:

这一步是利用上一步训练好的RPN网络来生成proposals供下一步中的fast rcnn训练,这里补充一下,字典mp_kwargs中的参数solver,是使用get_solvers()函数得到的,见下:

由上图可知,四步训练时的网络结构都在相应的四个solver文件有解释。好了回到训练流程中,产生proposal的函数是rpn_generate()函数,那我们进入这个函数:

首先设置了什么预NMS(不太懂),还有就是经过NMS后产生2000个proposals,然后初始化caffe,再用get_imdb()函数得到imdb数据,方法和前面一样,再用caffe.NET()加载RPN网络,再使用imdb_proposals()得到proposal,那我们就进入这个函数:

该函数的作用就是在所有的图片上生成proposal,不过作者又嵌套了一个im_proposals()函数,即在一张图片上产生proposals(这个嵌套看似多余,但是为后面再添一些测试脚本提供了方便,我猜rgb大神可能有这个目的),进入im_proposals()函数中:

见上图,首先用_get_image_blob()函数将图片数据转换为caffe的blob格式,进入该函数:

最终得到的blob格式为(batch elem , channel , height , width),im_info格式为[M,N,im_scale],其中im_scale是缩放比例,原始图片输入faster rcnn中进行训练时都需要先缩放成统一的规格;再回到im_proposals()函数中,使用net.forward()函数进行一次前向传播,获得proposals,ok。之后再回到imdb_proposals()函数中,最后返回得到的imdb_boxes,即我们从RPN上产生的proposals。再回到rpn_generate()函数中,接着就是将生成的proposals保存并传输到多线程中去供下一步训练使用,这个函数使命就暂时完成了;
再到第三步,训练fast rcnn网络,见下:

这一步训练的网络结构如下图:

注意这时候训练fast rcnn的roi就是前面训练好的RPN网络生成的proposals了(训练RPN网络用的是gt框),相关配置都在mp_kwargs字典中,很明显,我们要进入train_fast_rcnn()中一探究竟:

这里首先设置了训练使用的rpn_roidb方法(RPN用的是gt_roidb方法),由于这时候的cfg.TRAIN.PROPOSAL_METHOD变成了rpn_roidb,所以相应的使用的get_roidb()也相应地改变,此时使用rpn_roidb()方法,进入该函数:

该方法首先先获得gt_roidb,然后再用_load_rpn_roidb()获得由RPN产生的roidb,进入该函数:

接着进入create_roidb_from_box_list()函数中:

这个函数凸显了数据结构的重要性,我们需要重点关注一下这其中'gt_overlaps'、'argmaxes'、'maxes'、'overlaps'、'I'的结构,对于理解这个函数费仲重要,最好在纸上写出来~将RPN产生的proposal制作成roidb后,再回到rpn_roidb()中,使用merge_roidbs()将gt_roidb和rpn_roidb进行组合,见该函数:

这样子就得到了最终训练fast rcnn所需要的roidb数据,ok~再回到train_fast_rcnn()中,接着我们就来看看train_net()这个函数,进入该函数:

首先是使用filter_roidb()对之前产生的用于训练fast_rcnn的roidb再进行一次筛选,具体过程参见该筛选函数:

筛选过之后,再回到train_net()函数中,创建一个solverWrapper对象,其中就是训练得到的网络模型,进入这个类中:

上图是它的类定义中的一部分,我们先来看看它的初始化函数,这里需要注意的是add_bbox_regression_targets()这个函数,它的作用是为RPN产生的proposal提供回归属性,该函数向roidb中再添加一个key:'bbox_targets',它的格式如:targets[][5]:第一个元素是label,后面四个元素就是论文中谈及的tx,ty,tw,th;好的,我们进入这个函数:

上图是改函数的前半部分,主要看_compute_targets()函数,它产生了回归属性,进入该函数:

产生了回归属性,OK,再回到add_bbox_regression_targets()函数中,看后面剩下的部分:


这部分主要得到rpn_roidb的坐标的均值和方差,可以用来进行坐标归一化;OK,再回到SolverWrapper类中,剩下的则是snapshot快照方法,和train_model方法,回到train_net()函数中,接着再调用train_model()方法,进入该函数:

上图的函数就是使用SGD得到训练模型也就是我们需要的fast_rcnn网络模型,好了,train_net()函数就介绍到这儿了~
再回到train_fast_rcnn()函数中,剩下的都是保存之类的,那我们再回到训练流程中,剩下的几步训练流程就如法炮制了,见下:

这两步训练的网络结构见下图:



这一步训练的网络结构见下图:

这样子,就通过分步训练得到了最终的网络模型,最后就是一些收尾工作了:

好了,终于全部弄完,接下来我们就来看作者在网络结构中添加的那几层了~
(转载请注明出处)
Faster rcnn代码理解(2)的更多相关文章
- Faster RCNN代码理解(Python)
转自http://www.infocool.net/kb/Python/201611/209696.html#原文地址 第一步,准备 从train_faster_rcnn_alt_opt.py入: 初 ...
- Faster rcnn代码理解(4)
上一篇我们说完了AnchorTargetLayer层,然后我将Faster rcnn中的其他层看了,这里把ROIPoolingLayer层说一下: 我先说一下它的实现原理:RPN生成的roi区域大小是 ...
- Faster rcnn代码理解(1)
这段时间看了不少论文,回头看看,感觉还是有必要将Faster rcnn的源码理解一下,毕竟后来很多方法都和它有相近之处,同时理解该框架也有助于以后自己修改和编写自己的框架.好的开始吧- 这里我们跟着F ...
- Faster rcnn代码理解(3)
紧接着之前的博客,我们继续来看faster rcnn中的AnchorTargetLayer层: 该层定义在lib>rpn>中,见该层定义: 首先说一下这一层的目的是输出在特征图上所有点的a ...
- 原 CNN--卷积神经网络从R-CNN到Faster R-CNN的理解(CIFAR10分类代码)
1. 什么是CNN 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Netwo ...
- Faster R-CNN代码例子
主要参考文章:1,从编程实现角度学习Faster R-CNN(附极简实现) 经常是做到一半发现收敛情况不理想,然后又回去看看这篇文章的细节. 另外两篇: 2,Faster R-CNN学习总结 ...
- 对Faster R-CNN的理解(1)
目标检测是一种基于目标几何和统计特征的图像分割,最新的进展一般是通过R-CNN(基于区域的卷积神经网络)来实现的,其中最重要的方法之一是Faster R-CNN. 1. 总体结构 Faster R-C ...
- Rcnn/Faster Rcnn/Faster Rcnn的理解
基于候选区域的目标检测器 1. 滑动窗口检测器 根据滑动窗口从图像中剪切图像块-->将剪切的图像块warp成固定大小-->cnn网络提取特征-->SVM和regressor进行分类 ...
- Faster RCNN代码解析
1.faster_rcnn_end2end训练 1.1训练入口及配置 def train(): cfg.GPU_ID = 0 cfg_file = "../experiments/cfgs/ ...
随机推荐
- 用树莓派改装电风扇及实现Android遥控
最近天气很热,我租的房子又没有空调,基本上风扇一开就是一晚上,结果经常起床后发现口干舌燥的.我觉得这肯定是因为整晚吹风扇搞的,不管是不是,反正我觉得就是了.不开风扇吧,热!开风扇吧,早上起来不舒服,怎 ...
- 自学Aruba5.3.3-Aruba安全认证-有PEFNG 许可证环境的认证配置Captive-Portal
点击返回:自学Aruba之路 自学Aruba5.3.3-Aruba安全认证-有PEFNG 许可证环境的认证配置Captive-Portal 1. Captive-Portal认证配置前言 1.1 新建 ...
- 树莓派上使用KickThemOut对局域网内的设备进行ARP欺骗
安装KickThemOut工具 $ git clone https://github.com/k4m4/kickthemout.git $ cd kickthemout/ $ sudo -H pip ...
- Luogu 1437 [HNOI2004]敲砖块 (动态规划)
Luogu 1437 [HNOI2004]敲砖块 (动态规划) Description 在一个凹槽中放置了 n 层砖块.最上面的一层有n块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖 ...
- A1001. A+B Format
Calculate a + b and output the sum in standard format -- that is, the digits must be separated into ...
- 和我一起使用webpack构建react项目
第一步:初始化项目并创建package.json文件 第二步:创建webpack.config.js文件,并写入配置. 第三步:安装webpack以及创建es6语法环境,要将html作为模板文件解析的 ...
- OpenCV教程(43) harris角的检测(1)
计算机视觉中,我们经常要匹配两幅图像.匹配的的方式就是通过比较两幅图像中的公共特征,比如边,角,以及图像块(blob)等,来对两幅图像进行匹配. 相对于边,角更适合描述图像特征, ...
- 设置 webstorm 对 .vue 高亮
1. 首先安装vue插件,安装方法: setting --> plugin ,点击plugin,在内容部分的左侧输入框输入vue,会出现两个关于vue的插件,点击安装即可.安装完成后,就可 ...
- sqlserver 导入数据出现 无法创建 OLE DB 取值函数。请查看列元数据是否有效
我用的是Sql Server 的导入导出功能来实现的,但是有些数据可以导进去,有些就不行.总是出现一些错误! 执行之前 (错误)消息错误 0xc0202005: 数据流任务: 在数据源中找不到列“Un ...
- Redis集群中的节点如何保证数据一致
主从复制: 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而 ...