接着上篇的博客,咱们继续看一下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)的更多相关文章

  1. Faster RCNN代码理解(Python)

    转自http://www.infocool.net/kb/Python/201611/209696.html#原文地址 第一步,准备 从train_faster_rcnn_alt_opt.py入: 初 ...

  2. Faster rcnn代码理解(4)

    上一篇我们说完了AnchorTargetLayer层,然后我将Faster rcnn中的其他层看了,这里把ROIPoolingLayer层说一下: 我先说一下它的实现原理:RPN生成的roi区域大小是 ...

  3. Faster rcnn代码理解(1)

    这段时间看了不少论文,回头看看,感觉还是有必要将Faster rcnn的源码理解一下,毕竟后来很多方法都和它有相近之处,同时理解该框架也有助于以后自己修改和编写自己的框架.好的开始吧- 这里我们跟着F ...

  4. Faster rcnn代码理解(3)

    紧接着之前的博客,我们继续来看faster rcnn中的AnchorTargetLayer层: 该层定义在lib>rpn>中,见该层定义: 首先说一下这一层的目的是输出在特征图上所有点的a ...

  5. 原 CNN--卷积神经网络从R-CNN到Faster R-CNN的理解(CIFAR10分类代码)

    1. 什么是CNN 卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Netwo ...

  6. Faster R-CNN代码例子

    主要参考文章:1,从编程实现角度学习Faster R-CNN(附极简实现) 经常是做到一半发现收敛情况不理想,然后又回去看看这篇文章的细节. 另外两篇: 2,Faster R-CNN学习总结      ...

  7. 对Faster R-CNN的理解(1)

    目标检测是一种基于目标几何和统计特征的图像分割,最新的进展一般是通过R-CNN(基于区域的卷积神经网络)来实现的,其中最重要的方法之一是Faster R-CNN. 1. 总体结构 Faster R-C ...

  8. Rcnn/Faster Rcnn/Faster Rcnn的理解

    基于候选区域的目标检测器 1.  滑动窗口检测器 根据滑动窗口从图像中剪切图像块-->将剪切的图像块warp成固定大小-->cnn网络提取特征-->SVM和regressor进行分类 ...

  9. Faster RCNN代码解析

    1.faster_rcnn_end2end训练 1.1训练入口及配置 def train(): cfg.GPU_ID = 0 cfg_file = "../experiments/cfgs/ ...

随机推荐

  1. 用树莓派改装电风扇及实现Android遥控

    最近天气很热,我租的房子又没有空调,基本上风扇一开就是一晚上,结果经常起床后发现口干舌燥的.我觉得这肯定是因为整晚吹风扇搞的,不管是不是,反正我觉得就是了.不开风扇吧,热!开风扇吧,早上起来不舒服,怎 ...

  2. 自学Aruba5.3.3-Aruba安全认证-有PEFNG 许可证环境的认证配置Captive-Portal

    点击返回:自学Aruba之路 自学Aruba5.3.3-Aruba安全认证-有PEFNG 许可证环境的认证配置Captive-Portal 1. Captive-Portal认证配置前言 1.1 新建 ...

  3. 树莓派上使用KickThemOut对局域网内的设备进行ARP欺骗

    安装KickThemOut工具 $ git clone https://github.com/k4m4/kickthemout.git $ cd kickthemout/ $ sudo -H pip ...

  4. Luogu 1437 [HNOI2004]敲砖块 (动态规划)

    Luogu 1437 [HNOI2004]敲砖块 (动态规划) Description 在一个凹槽中放置了 n 层砖块.最上面的一层有n块砖,从上到下每层依次减少一块砖.每块砖都有一个分值,敲掉这块砖 ...

  5. A1001. A+B Format

    Calculate a + b and output the sum in standard format -- that is, the digits must be separated into ...

  6. 和我一起使用webpack构建react项目

    第一步:初始化项目并创建package.json文件 第二步:创建webpack.config.js文件,并写入配置. 第三步:安装webpack以及创建es6语法环境,要将html作为模板文件解析的 ...

  7. OpenCV教程(43) harris角的检测(1)

          计算机视觉中,我们经常要匹配两幅图像.匹配的的方式就是通过比较两幅图像中的公共特征,比如边,角,以及图像块(blob)等,来对两幅图像进行匹配.      相对于边,角更适合描述图像特征, ...

  8. 设置 webstorm 对 .vue 高亮

    1. 首先安装vue插件,安装方法: setting  -->  plugin  ,点击plugin,在内容部分的左侧输入框输入vue,会出现两个关于vue的插件,点击安装即可.安装完成后,就可 ...

  9. sqlserver 导入数据出现 无法创建 OLE DB 取值函数。请查看列元数据是否有效

    我用的是Sql Server 的导入导出功能来实现的,但是有些数据可以导进去,有些就不行.总是出现一些错误! 执行之前 (错误)消息错误 0xc0202005: 数据流任务: 在数据源中找不到列“Un ...

  10. Redis集群中的节点如何保证数据一致

    主从复制: 1.redis的复制功能是支持多个数据库之间的数据同步.一类是主数据库(master)一类是从数据库(slave),主数据库可以进行读写操作,当发生写操作的时候自动将数据同步到从数据库,而 ...