接着上篇的博客,咱们继续看一下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. 修改 wordpress 后台管理员登录地址

    拷贝根目录下的 wp-login.php文件命名为wp-login.php.backup,把原文件重命名为managewp.phpsed -i "s/wp-login.php/managew ...

  2. 【Luogu4921】情侣?给我烧了!(组合计数)

    [Luogu4921]情侣?给我烧了!(组合计数) 题面 洛谷 题解 很有意思的一道题目. 直接容斥?怎么样都要一个平方复杂度了. 既然是恰好\(k\)对,那么我们直接来做: 首先枚举\(k\)对人出 ...

  3. 洛谷 P2341 [HAOI2006]受欢迎的牛 解题报告

    P2341 [HAOI2006]受欢迎的牛 题目描述 每头奶牛都梦想成为牛棚里的明星.被所有奶牛喜欢的奶牛就是一头明星奶牛.所有奶 牛都是自恋狂,每头奶牛总是喜欢自己的.奶牛之间的"喜欢&q ...

  4. SwitchButton 开关按钮 的多种实现方式 (附源码DEMO)

    http://blog.csdn.net/vipzjyno1/article/details/23707149 Switch开关android源码SwitchButton 刚开始接触开关样式的按钮是在 ...

  5. Luogu 2540 斗地主增强版(搜索,动态规划)

    Luogu 2540 斗地主增强版(搜索,动态规划) Description 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共54张牌来进行的扑克牌游 ...

  6. Luogu 1351 NOIP 2014 联合权值(贪心,计数原理)

    Luogu 1351 NOIP 2014 联合权值(贪心,计数原理) Description 无向连通图 G 有 n 个点,n-1 条边.点从 1 到 n 依次编号,编号为 i 的点的权值为 Wi, ...

  7. CF986C AND Graph

    半年前做的一道题现在还是不会 x&y=0 意味着,x的补集的子集都是和x直接相连的 不妨令图中的点数就是2^n 那么可以直接从x^((1<<n)-1)开始记忆化爆搜,路上遇到的都是 ...

  8. [luogu4462][异或序列]

    传送门 突然发现自己没整理过异或的知识,正好借这个题整理一下. 关于异或 (1)异或就是在二进制下,两数各个位置上的数,相同为0,不同为1,所得到的数,比如说4^7,4的二进制是100,7的二进制是1 ...

  9. centos7使用kubeadm配置高可用k8s集群

    CountingStars_ 关注 2018.08.12 09:06* 字数 464 阅读 88评论 0喜欢 0 简介 使用kubeadm配置多master节点,实现高可用. 安装 实验环境说明 实验 ...

  10. Scala进阶之路-并发编程模型Akka入门篇

    Scala进阶之路-并发编程模型Akka入门篇 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.Akka Actor介绍 1>.Akka介绍 写并发程序很难.程序员不得不处 ...