faster rcnn流程

1、执行流程

数据准备

train_net.py中combined_roidb函数会调用get_imdb得到datasets中factory.py生成的imdb
然后调用fast_rcnn下的train.py中get_training_roidb,
进而调用roi_data_layer下roidb.py中的prepare_roidb会为roidb添加image等信息。

数据输入

roi_data_layer下layer.py中的forword函数会调用minibatch.py中的get_minibatch得到输入信息。
‘data’是数据信息
‘gt_boxes’包含roidb[‘boxes‘]*imscale(缩放尺寸)和roidb[‘gt_classes‘]为n*5的数组
‘im_info’是[图片行,图片列,imscale]
conv1-conv5 dcnn层
conv1/pool1/conv2/poll2缩小了16倍,后面的三个卷积stride:1

RPN模块

rpn_conv/3x3层,3*3卷积卷积层,featuremap为256。每个像素点用256的向量表示。
rpn_cls_score层,生成2(bg/fg) * (anchors)的output。
rpn_bbox_pred层,生成4 * (anchors)的output。
这里的4暗示的是(x-xa)/wa;(y-ya)/ha; log(w/wa); log(h/ha);
rpn_cls_score_reshape层将rpn_cls_score转化为rpn_cls_score_reshape
shape { dim: 0 dim: 2 dim: -1 dim: 0 }
batch不变,channel为2,行变成了原来的anchors倍,列数不变。
口->日
AnchorTargetLayer层
输入:
bottom: ‘rpn_cls_score‘#只是为了确定大小height、width
bottom: ‘gt_boxes‘框的ground truth
bottom: ‘im_info‘过滤不在图片内部的
bottom: ‘data‘
输出:
top: ‘rpn_labels‘大小是1,1,A*height,width,A是anchar的数目
top: ‘rpn_bbox_targets‘大小是1,A*4,height,width
top: ‘rpn_bbox_inside_weights‘大小是1,A*4,height,width
top: ‘rpn_bbox_outside_weights‘大小是1,A*4,height,width
shifts是每个点*_feat_stride的(x,y),这里feat_stride=16,可以理解为rpn_cls_score映射到原图的坐标点。K是点数应该基本等于height*width。
all_anchors是这些坐标点处安放anchor后的信息,大小是(K*A),4。total_anchors = int(K * A)
过滤不在图片内部的得到anchors。
计算anchors和gt_boxes的overlap,判断K*A个那些为正,那些为负。
最后labels中存在的是抽样的,抽128个fg,正样本不够128,负样本多取点,凑够256个。不用的赋值为-1。
bbox_targets存储的是anchors和最高重叠的gt的(x*-xa)/wa,(y*-ya)/ha,log(w*/wa),log(h*/hg),*为gt。
bbox_inside_weights被抽中的正类为1,其他为0;
bbox_outside_weights外部权重,目前负例的外部权重=正例的外部权重=np.ones((1, 4)) * 1.0 / np.sum(labels >= 0)
ps:可以全是负样本,但是也没什么用,回归框没什么用,但是label还是有用的。
rpn_loss_cls层
计算rpn_cls_score_reshape和rpn_labels的loss。知道reshape的作用了吧。ignore_label: -1
rpn_loss_bbox层
计算smoothL1的loss。
bottom: "rpn_bbox_pred"
bottom: "rpn_bbox_targets"
bottom: ‘rpn_bbox_inside_weights‘
bottom: ‘rpn_bbox_outside_weights‘

RoI Proposal模块

rpn_cls_prob层基于rpn_cls_score_reshape生成概率,大小为1,2,A*height,width
rpn_cls_prob_reshape层将rpn_cls_prob进行Reshape为1,2*A,height,width。
ProposalLayer层
将RPN的输出转变为object proposals。
bottom: ‘rpn_cls_prob_reshape‘#用于nms
bottom: ‘rpn_bbox_pred‘#生成候选框
bottom: ‘im_info‘#生成的框别出图像外了
输出:rpn_rois
bbox_deltas(rpn_bbox_pred)和anchors得到所有的proposals,proposals的大小和bbox_deltas一样。1,A*4,height,width
# bbox deltas will be (1, 4 * A, H, W) format
# transpose to (1, H, W, 4 * A)
# reshape to (1 * H * W * A, 4) where rows are ordered by (h, w, a)
# in slowest to fastest order
bbox_deltas = bbox_deltas.transpose((0, 2, 3, 1)).reshape((-1, 4))
图片外的重算下不能小于0大于图片宽高(im_info)
宽度和高度要大于等于RPN_MIN_SIZE(16)
按照scores(bottom[0].data[:, self._num_anchors:, :, :]为fg)概率自高到低取RPN_PRE_NMS_TOP_N个候选,进行nms,nms后选择RPN_POST_NMS_TOP_N个。
最后添加第一列为0,rpn_roisde的每行为[0,x,y,w,h]
ProposalTargetLayer层(也是为了后面的loss服务的)
计算回归差参考rcnn的论文附录C. Bounding-box regression。
bottom: ‘rpn_rois‘#rpn得到的所有区域
bottom: ‘gt_boxes‘#包括boxes、gt_classes

top: ‘rois‘#区域块(0,x1,y1,x2,y2)
top: ‘labels‘#标签
top: ‘bbox_targets‘#4N(计算的rois和最新gt的target)
top: ‘bbox_inside_weights‘#1
top: ‘bbox_outside_weights‘#1
setup输出的大小为:(1, 5)(1, 1)和(1, self._num_classes * 4)(1, self._num_classes * 4)(1, self._num_classes * 4),第一个维度大小根据下面的运算再reshape。
按照FG_THRESH、BG_THRESH_HI、BG_THRESH_LO抽取背景前景。
按照gt_boxes给labels赋标签,bg为0。rois为最后留下的。
bbox_targets为4N,只有labels(N个类别)的那个4是有值的。bbox_inside_weights类似。bbox_outside_weights=inside。

RCNN模块

ROIPooling层,进行POIpooling。得到roi_pool_conv5大小为rois的多少*256(conv5的output)*6*6。
fc6-fc7得到rois的多少*4096。
cls_score得到:rois的多少*N(类别),即cls_score
bbox_pred得到: rois的多少*4N,即bbox_pred

loss_cls计算cls_score和labels的loss。
loss_bbox计算bbox_pred和bbox_targets的loss。

附录

A=9的示例
# anchors =
\#
# \-83   \-39   100    56
# \-175   \-87   192   104
# \-359  \-183   376   200
# \-55   \-55    72    72
# \-119  \-119   136   136
# \-247  \-247   264   264
# \-35   \-79    52    96
# \-79  \-167    96   184
# \-167  \-343   184   360

2、训练过程

设$FRCN_ROOT=/data/houkai/faster-rcnn/py-faster-rcnn/,在该目录下:
data/icdar为数据文件夹,Annotations是标注,hs是图片,ImageList.txt是文件名列表

必须要在data/cache/目录下把数据库的缓存文件.pkl给删除掉,否则其不会重新读取相应的数据库

./tools/train_net.py
--gpu 0
--solver models/pascal_voc/ZF/faster_rcnn_end2end/solver.prototxt
--weights data/imagenet_models/ZF.v2.caffemodel
--imdb hs
--iters 90000
--cfg experiments/cfgs/faster_rcnn_end2end.yml
output/faster_rcnn_end2end/hs中有生成的模型文件。
训练采用的参数:

‘TEST‘: {‘BBOX_REG‘: True,
          ‘HAS_RPN‘: True,
          ‘MAX_SIZE‘: 1000,
          ‘NMS‘: 0.3,
          ‘PROPOSAL_METHOD‘: ‘selective_search‘,
          ‘RPN_MIN_SIZE‘: 16,
          ‘RPN_NMS_THRESH‘: 0.7,
          ‘RPN_POST_NMS_TOP_N‘: 300,
          ‘RPN_PRE_NMS_TOP_N‘: 6000,
          ‘SCALES‘: [600],
          ‘SVM‘: False},
‘TRAIN‘: {‘ASPECT_GROUPING‘: True,//按宽高比shuffle
           ‘BATCH_SIZE‘: 128,//fastrcnn训练的样本数,每张图片抽取128张
           ‘BBOX_INSIDE_WEIGHTS‘: [1.0, 1.0, 1.0, 1.0],
           ‘BBOX_NORMALIZE_MEANS‘: [0.0, 0.0, 0.0, 0.0],//norm的均值
           ‘BBOX_NORMALIZE_STDS‘: [0.1, 0.1, 0.2, 0.2],//norm的方差
           ‘BBOX_NORMALIZE_TARGETS‘: True,//不用rpn是的归一化
           ‘BBOX_NORMALIZE_TARGETS_PRECOMPUTED‘: True,//计算ProposalTargetLayer中targets时norm。使用rpn时只能为true
           ‘BBOX_REG‘: True,//训练gt样本的regression
           ‘BBOX_THRESH‘: 0.5,//不用rpn时用于筛选样本,regression的参数
           ‘BG_THRESH_HI‘: 0.5,//[LO,HI]之间的算背景
           ‘BG_THRESH_LO‘: 0.0,
           ‘FG_FRACTION‘: 0.25,//128中前景的比例,不够负样本补充,如果负样本不够那就不够吧
           ‘FG_THRESH‘: 0.5,//rpn提取的候选和gt重合大于0.5算前景
           ‘HAS_RPN‘: True,
           ‘IMS_PER_BATCH‘: 1,//一次取一张
           ‘MAX_SIZE‘: 1000,
           ‘PROPOSAL_METHOD‘: ‘gt‘,
           ‘RPN_BATCHSIZE‘: 256,//rpn样本数
           ‘RPN_BBOX_INSIDE_WEIGHTS‘: [1.0, 1.0, 1.0, 1.0],//被抽中正例的内部权重,针对x,y,w,h。
           ‘RPN_CLOBBER_POSITIVES‘: False,//先按照RPN_NEGATIVE_OVERLAP挑选bg
           ‘RPN_FG_FRACTION‘: 0.5,//rpn样本数中,fg的比例
           ‘RPN_MIN_SIZE‘: 16,//rpn 宽高的最小尺寸
           ‘RPN_NEGATIVE_OVERLAP‘: 0.3,//选择rpn的阈值bg
           ‘RPN_NMS_THRESH‘: 0.7,//12000进程nms的阈值
           ‘RPN_POSITIVE_OVERLAP‘: 0.7,//选择rpn的阈值fg
           ‘RPN_POSITIVE_WEIGHT‘: -1.0,//uniform抽中正例的权重<0
           ‘RPN_POST_NMS_TOP_N‘: 2000,//nms后保留2000个
           ‘RPN_PRE_NMS_TOP_N‘: 12000,//按score自高向第取12000个框
           ‘SCALES‘: [600],
           ‘SNAPSHOT_INFIX‘: ‘‘,//输出模型前缀
           ‘SNAPSHOT_ITERS‘: 10000,
           ‘USE_FLIPPED‘: True,//水平翻转
           ‘USE_PREFETCH‘: False//没有prefetch
    },

命令:

./tools/train_net.py --gpu 0 --solver models/hs/solver.prototxt --weights data/imagenet_models/VGG16.v2.caffemodel --imdb hs --iters 500000 --cfg experiments/cfgs/faster_rcnn_end2end.yml
时间: 2025-01-10 18:54:33

faster rcnn流程的相关文章

r-cnn学习系列(三):从r-cnn到faster r-cnn

把r-cnn系列总结下,让整个流程更清晰. 整个系列是从r-cnn至spp-net到fast r-cnn再到faster r-cnn.  RCNN 输入图像,使用selective search来构造proposals(大小不一,需归一化),输入到CNN网络来提取特征, 并根据特征来判断是什么物体(分类器,将背景也当做一类物体),最后是对物体的区域(画的框)进行微调(回归器). 由下面的图可看出,RCNN分为四部分,ss(proposals),CNN,分类器,回归器,这四部分是相对独立的.改进的

(转)Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks(更快的RCNN:通过区域提议网络实现实时)

原文出处 感谢作者~ Faster R-CNN: Towards Real-Time Object Detection with Region ProposalNetworks Shaoqing Ren, Kaiming He, Ross Girshick, Jian Sun 摘要 目前最先进的目标检测网络需要先用区域建议算法推测目标位置,像SPPnet[7]和Fast R-CNN[5]这些网络已经减少了检测网络的运行时间,这时计算区域建议就成了瓶颈问题.本文中,我们介绍一种区域建议网络(Reg

论文笔记:Faster R-CNN:Towards Real-Time Object Detection with Region Proposal Networks

文章: http://arxiv.org/abs/1506.01497 源码:坐等.... 目录: Region Proposal Networks Translation-Invariant Anchors A Loss Function for Learning Region Proposals Optimization Sharing Convolutional Features for Region Proposal and Object Detection Implementation

Faster rcnn代码理解(1)

这段时间看了不少论文,回头看看,感觉还是有必要将Faster rcnn的源码理解一下,毕竟后来很多方法都和它有相近之处,同时理解该框架也有助于以后自己修改和编写自己的框架.好的开始吧- 这里我们跟着Faster rcnn的训练流程来一步一步梳理,进入tools\train_faster_rcnn_alt_opt.py中: 首先从__main__入口处进入,如下: 上图中首先对终端中的命令行进行解析,获取相关的命令参数:然后利用mp.Queue()创建一个多线程的对象,再利用get_solvers

RCNN,Fast RCNN,Faster RCNN 的前生今世:(2)R-CNN

Region CNN(RCNN)可以说是利用深度学习进行目标检测的开山之作.作者Ross Girshick多次在PASCAL VOC的目标检测竞赛中折桂,2010年更带领团队获得终身成就奖,如今供职于Facebook旗下的FAIR. 这篇文章思路简洁,在DPM方法多年平台期后,效果提高显著.包括本文在内的一系列目标检测算法:RCNN,Fast RCNN, Faster RCNN代表当下目标检测的前沿水平,在github都给出了基于Caffe的源码 思想 本文解决了目标检测中的两个关键问题. 问题

纯C++版500VIP源码下载的Faster R-CNN(通过caffe自定义RPN层实现)

这里500VIP源码下载 dsluntan.com 介绍的是通过添加自定义层(RPN层)代替python层,实现c++版的Faster R-CNN,因为去掉python了,所以部署时不会因为牵扯到python库等其它的莫名其妙的错误,使用起来就跟单纯的caffe一样,更简单方便. 核心代码,借鉴的是这篇博客,这里的话,我们不扣具体的代码细节(比如rpn层是怎么产出候选框啊,非极大值抑制是具体怎么实现的等等),有兴趣的可以自己查下资料,所以主要是走一个步骤,从而完成c++版Faster R-CNN

Faster RCNN算法代码解析

一. Faster-RCNN代码解释 先看看代码结构: Data: This directory holds (after you download them): Caffe models pre-trained on ImageNet Faster R-CNN models Symlinks to datasets demo 5张图片 scripts 下载模型的脚本 Experiments: logs scripts/faster_rcnn_alt_opt.sh cfgs/faster_rcn

faster rcnn学习(三)

今天学习用来判断faster rcnn中对于评估多个类别检测的效果,部分内容参考http://blog.sina.com.cn/s/blog_9db078090102whzw.html. mAP(mean average precision)多类平均精度,首先计算出每个类的AP,然后取所有类的AP的平均.解释这个,先了解混淆矩阵的4个概念. TP:预测为真的正样例 TN:预测为真的负样例 FP:预测为假的正样例 FN:预测为假的负样例 记住这个很简单,以TP为例,先记住P代表预测的结果是posi

深度学习之目标检测常用算法原理+实践精讲 YOLO / Faster RCNN / SSD / 文本检测 / 多任务网络

深度学习之目标检测常用算法原理+实践精讲 YOLO / Faster RCNN / SSD / 文本检测 / 多任务网络 资源获取链接:点击这里 第1章 课程介绍 本章节主要介绍课程的主要内容.核心知识点.课程涉及到的应用案例.深度学习算法设计通用流程.适应人群.学习本门课程的前置条件.学习后达到的效果等,帮助大家从整体上了解本门课程的整体脉络. 1-1 课程导学 第2章 目标检测算法基础介绍 本章节主要介绍目标检测算法的基本概念.传统的目标检测算法.目前深度学习目标检测主流方法(one-sta