faster-rcnn算法总结
faster-rcnn的整体流程比较复杂,尤其是数据的预处理部分,流程比较繁琐。我写faster-rcnn系列文章的目的是对该算法的原始版本有个整体的把握,如果需要使用该算法做一些具体的任务,推荐使用mmdetection框架,该框架使用PyTorch写成,相比于原始的基于caffe python接口的版本就简洁优雅多了。下面对改算法的整体过程做一个梳理,分为训练过程(端到端的训练)和测试过程两部分。本文注重算法原理,因此直接从如下的数据输入开始:
layer {
name: 'input-data'
type: 'Python'
top: 'data'
top: 'im_info'
top: 'gt_boxes'
python_param {
module: 'roi_data_layer.layer'
layer: 'RoIDataLayer'
param_str: "'num_classes': 2"
}
}
一、训练过程
1、输入数据经过一个ConvNet得到一个feature map(backbone的输出),记为bk_feat;
2、bk_feat经过1个3x3的Conv得到rpn/output;
3、从rpn/output分出两个分支:一个分支经过1个1x1的Conv,输出通道数为2*num_anchor,得到输出rpn_cls_score,它表示在feature map的每一个位置,每一个anchor内含有物体的概率。另一个分支经过1个1x1的Conv,输出通道数为4*num_anchor,得到输出rpn_bbox_pred,它表示网络预测出的,在feature map的每一个位置,每一个anchor相对于它“负责”的物体的真实边界框的偏移量dx, dy, dw, dh;
4、接下来是rpn-data层,该层的工作首先是生成anchor,然后按照一定的规则为anchor打上0(背景),1(前景),-1(忽略)标签,最后计算出每一个anchor相对于它“负责”的gt的偏移量dx, dy, dw, dh(bbox_targets),这个偏移量就是第一阶段的回归目标。
5、利用第4步得到的bbox_targets和第3步得到的rpn_bbox_pred产生第一阶段的SmoothL1Loss损失rpn_loss_bbox,同时用第4步得到的label和第3步得到的rpn_cls_score产生第一阶段的SoftmaxWithLoss损失rpn_loss_cls;
6、然后是proposal层,该层的工作首先也是生成anchor,然后将anchor和rpn_bbox_pred“相加”,得到proposal。然后经过NMS,从结果中选取分数最大的前2000个作为RPN网络产生的rois;
7、接着是roi-data层,该层的工作是从上面的rois中,按照前景:背景=1:3的比例选出总共128个rois,每个rois的label是它“负责”的gt(和该rois交并比最大的gt)的类别,背景rois的label为0。接下来与第4步一样,计算出每一个rois相对于它“负责”的gt的偏移量bbox_targets,作为第二阶段的回归目标。,所不同的是这个偏移量是和类别一一对应的,其它类别的偏移量都为0;
8、利用第6步得到的rois,从bk_feat中截取相应区域的feature,并对这个feature做7x7的RoIPooling得到固定大小的feature,然后该feature经过2个FC,最后分出两个分支:一个分支经过1个FC,输出维度为num_class+1(num_class是数据集的类别个数,不包含背景),得到输出cls_score,它表示每个rois内含有的物体属于每个类别(包含背景)的概率。另一个分支经过1个FC,输出维度为4*(num_class+1),得到输出bbox_pred,它表示每个rois相对于它“负责”的每个类别(包含背景)的物体的真实边界框的偏移量dx, dy, dw, dh。
9、用第7步得到的bbox_targets和第8步得到的bbox_pred产生第二阶段的SmoothL1Loss损失loss_bbox,同时用第7步得到的label和第8步得到的cls_score产生第二阶段的SoftmaxWithLoss损失loss_cls。
二、测试过程
1、输入数据经过一个ConvNet得到一个feature map(backbone的输出),记为bk_feat;
2、bk_feat经过1个3x3的Conv得到rpn/output;
3、从rpn/output分出两个分支:一个分支经过1个1x1的Conv,输出通道数为2*num_anchor,得到输出rpn_cls_score,它表示在feature map的每一个位置,每一个anchor内含有物体的概率。另一个分支经过1个1x1的Conv,输出通道数为4*num_anchor,得到输出rpn_bbox_pred,它表示网络预测出的,在feature map的每一个位置,每一个anchor相对于它“负责”的物体的真实边界框的偏移量dx, dy, dw, dh;
4、接下来是proposal层,该层的工作首先是生成anchor,然后将anchor和rpn_bbox_pred“相加”,得到proposal。之后取分数最大的前6000个(训练时取前12000个)proposal进行NMS操作,overlap阈值是0.7,最后从结果中选取分数最大的前300个(训练时取前2000个)作为RPN网络产生的rois;
5、利用第4步得到的rois,从bk_feat中截取相应区域的feature,并对这个feature做7x7的RoIPooling得到固定大小的feature,然后该feature经过2个FC,最后分出两个分支:一个分支经过1个FC,输出维度为num_class+1(num_class是数据集的类别个数,不包含背景),得到输出cls_prob,它表示每个rois内含有的物体属于每个类别(包含背景)的概率。另一个分支经过1个FC,输出维度为4*(num_class+1),得到输出bbox_pred,它表示每个rois相对于它“负责”的每个类别(包含背景)的物体的真实边界框的偏移量dx, dy, dw, dh。
6、将第4步得到的rois和第5步得到的bbox_pred“相加”得到bbox,它的shape为(num_rois, 4*(num_class+1))。因此,每一个bbox都和唯一的一个类别相对应,bbox的分数即为第5步得到的cls_prob。接下来对每一类物体,筛选出分数大于一定阈值(0.05)的bbox做NMS(overlap阈值是0.3),最后把所有类别的结果合并起来,得到的所有bbox和它们相应的分数即为最终的检测结果。该过程的部分代码摘录如下:
rois = net.blobs['rois'].data.copy()
# unscale back to raw image space
boxes = rois[:, 1:5] / im_scales[0]
scores = blobs_out['cls_prob']
box_deltas = blobs_out['bbox_pred']
pred_boxes = bbox_transform_inv(boxes, box_deltas) im = cv2.imread(imdb.image_path_at(i))
scores, boxes = im_detect(net, im, box_proposals)
# skip j = 0, because it's the background class
for j in xrange(1, imdb.num_classes):
inds = np.where(scores[:, j] > thresh)[0]
cls_scores = scores[inds, j]
cls_boxes = boxes[inds, j*4:(j+1)*4]
cls_dets = np.hstack((cls_boxes, cls_scores[:, np.newaxis])) \
.astype(np.float32, copy=False)
keep = nms(cls_dets, cfg.TEST.NMS)
cls_dets = cls_dets[keep, :]
if vis:
vis_detections(im, imdb.classes[j], cls_dets)
all_boxes[j][i] = cls_dets
faster-rcnn算法总结的更多相关文章
- 第三十一节,目标检测算法之 Faster R-CNN算法详解
Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...
- 【目标检测】Faster RCNN算法详解
Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with region proposal network ...
- 目标检测算法之Faster R-CNN算法详解
Fast R-CNN存在的问题:选择性搜索,非常耗时. 解决:加入一个提取边缘的神经网络,将候选框的选取交给神经网络. 在Fast R-CNN中引入Region Proposal Network(RP ...
- faster rcnn算法及源码及论文解析相关博客
1. 通过代码理解faster-RCNN中的RPN http://blog.csdn.net/happyflyy/article/details/54917514 2. faster rcnn详解 R ...
- Faster RCNN算法训练代码解析(3)
四个层的forward函数分析: RoIDataLayer:读数据,随机打乱等 AnchorTargetLayer:输出所有anchors(这里分析这个) ProposalLayer:用产生的anch ...
- Faster RCNN算法训练代码解析(1)
这周看完faster-rcnn后,应该对其源码进行一个解析,以便后面的使用. 那首先直接先主函数出发py-faster-rcnn/tools/train_faster_rcnn_alt_opt.py ...
- Faster RCNN算法demo代码解析
一. Faster-RCNN代码解释 先看看代码结构: Data: This directory holds (after you download them): Caffe models pre-t ...
- Faster RCNN算法训练代码解析(2)
接着上篇的博客,我们获取imdb和roidb的数据后,就可以搭建网络进行训练了. 我们回到trian_rpn()函数里面,此时运行完了roidb, imdb = get_roidb(imdb_name ...
- 目标检测-Faster R-CNN
[目标检测]Faster RCNN算法详解 Ren, Shaoqing, et al. “Faster R-CNN: Towards real-time object detection with r ...
- Paper Reading:Faster RCNN
Faster R-CNN 论文:Faster R-CNN: Towards Real-Time Object Detection with Region Proposal Networks 发表时间: ...
随机推荐
- leetcood学习笔记-9
题目描述 方法一:转换为字符串 class Solution: def isPalindrome(self, x: int) -> bool: if x<0: return False e ...
- Yii2 搜索
搜索的形式: 第一种,点击空白处: <?php $data=['0'=>'已删除','10'=>'正常','1'=>'锁定']; ?> <table style=' ...
- NOIP模拟测试19
T1: 题目大意:将一颗有N个节点的树分割,使得每个联通块大小相等,问一共有多少方案.(N<=1000000) 首先,一条很显然的性质,每个联通块的大小一定是N的因子. 然后,我们可以对于每个因 ...
- Ubuntu 14.04 搭建 LNMP
LNMP(Linux-Nginx-MySQL-PHP)这四种软件的组合,可以成为一个免费.高效.扩展性强的网站服务系统. 一.操作步骤 1.安装Nginx sudo apt-get update su ...
- CSS:CSS 导航栏
ylbtech-CSS:CSS 导航栏 1.返回顶部 1. CSS 导航栏 导航栏 熟练使用导航栏,对于任何网站都非常重要. 使用CSS你可以转换成好看的导航栏而不是枯燥的HTML菜单. 导航栏=链接 ...
- libvert开启TCP监听
1.设置libvirtd 编辑/etc/libvirt/libvirtd.conf listen_tls = 0 listen_tcp = 1 auth_tcp="none" tc ...
- 自己写Linux module来收集buddy info
1 编写代码pslist.c 1: #include<linux/init.h> 2: #include<linux/module.h> 3: #include<linu ...
- Codeforces 340B - Maximal Area Quadrilateral (计算几何)
Codeforces Round #198 (Div. 2) 题目链接:Maximal Area Quadrilateral Iahub has drawn a set of \(n\) points ...
- 剑指offer——570~n-1中缺失的数字
题目:0~n-1中缺失的数字. 一个长度为n-1的递增排序数组中的所有数字都是唯一的,并且每个数字都在范围0~n-1之内. 在范围0~n-1内的n个数字中有且只有一个数字不在该数组中,请找出这个数字. ...
- 【WLAN常用语】—VAP
文章摘自:https://forum.huawei.com/enterprise/zh/forum.php?mod=viewthread&tid=396533&page=1#pid22 ...