faster rcnn学习之rpn 的生成

接着上一节《 faster rcnn学习之rpn训练全过程》,假定我们已经训好了rpn网络,下面我们看看如何利用训练好的rpn网络生成proposal.

其网络为rpn_test.pt

# Enter your network definition here.
# Use Shift+Enter to update the visualization.
name: "VGG_CNN_M_1024"
input: "data"
input_shape {dim: 1dim: 3dim: 224dim: 224
}
input: "im_info"
input_shape {dim: 1dim: 3
}
layer {name: "conv1"type: "Convolution"bottom: "data"top: "conv1"convolution_param {num_output: 96kernel_size: 7stride: 2}
}
layer {name: "relu1"type: "ReLU"bottom: "conv1"top: "conv1"
}
layer {name: "norm1"type: "LRN"bottom: "conv1"top: "norm1"lrn_param {local_size: 5alpha: 0.0005beta: 0.75k: 2}
}
layer {name: "pool1"type: "Pooling"bottom: "norm1"top: "pool1"pooling_param {pool: MAXkernel_size: 3stride: 2}
}
layer {name: "conv2"type: "Convolution"bottom: "pool1"top: "conv2"convolution_param {num_output: 256pad: 1kernel_size: 5stride: 2}
}
layer {name: "relu2"type: "ReLU"bottom: "conv2"top: "conv2"
}
layer {name: "norm2"type: "LRN"bottom: "conv2"top: "norm2"lrn_param {local_size: 5alpha: 0.0005beta: 0.75k: 2}
}
layer {name: "pool2"type: "Pooling"bottom: "norm2"top: "pool2"pooling_param {pool: MAXkernel_size: 3stride: 2}
}
layer {name: "conv3"type: "Convolution"bottom: "pool2"top: "conv3"convolution_param {num_output: 512pad: 1kernel_size: 3}
}
layer {name: "relu3"type: "ReLU"bottom: "conv3"top: "conv3"
}
layer {name: "conv4"type: "Convolution"bottom: "conv3"top: "conv4"convolution_param {num_output: 512pad: 1kernel_size: 3}
}
layer {name: "relu4"type: "ReLU"bottom: "conv4"top: "conv4"
}
layer {name: "conv5"type: "Convolution"bottom: "conv4"top: "conv5"convolution_param {num_output: 512pad: 1kernel_size: 3}
}
layer {name: "relu5"type: "ReLU"bottom: "conv5"top: "conv5"
}#========= RPN ============layer {name: "rpn_conv/3x3"type: "Convolution"bottom: "conv5"top: "rpn/output"convolution_param {num_output: 256kernel_size: 3 pad: 1 stride: 1}
}
layer {name: "rpn_relu/3x3"type: "ReLU"bottom: "rpn/output"top: "rpn/output"
}
layer {name: "rpn_cls_score"type: "Convolution"bottom: "rpn/output"top: "rpn_cls_score"convolution_param {num_output: 18   # 2(bg/fg) * 9(anchors)kernel_size: 1 pad: 0 stride: 1}
}
layer {name: "rpn_bbox_pred"type: "Convolution"bottom: "rpn/output"top: "rpn_bbox_pred"convolution_param {num_output: 36   # 4 * 9(anchors)kernel_size: 1 pad: 0 stride: 1}
}
layer {bottom: "rpn_cls_score"top: "rpn_cls_score_reshape"name: "rpn_cls_score_reshape"type: "Reshape"reshape_param { shape { dim: 0 dim: 2 dim: -1 dim: 0 } }
}#========= RoI Proposal ============layer {name: "rpn_cls_prob"type: "Softmax"bottom: "rpn_cls_score_reshape"top: "rpn_cls_prob"
}
layer {name: 'rpn_cls_prob_reshape'type: 'Reshape'bottom: 'rpn_cls_prob'top: 'rpn_cls_prob_reshape'reshape_param { shape { dim: 0 dim: 18 dim: -1 dim: 0 } }
}
layer {name: 'proposal'type: 'Python'bottom: 'rpn_cls_prob_reshape'bottom: 'rpn_bbox_pred'bottom: 'im_info'top: 'rois'top: 'scores'python_param {module: 'rpn.proposal_layer'layer: 'ProposalLayer'param_str: "'feat_stride': 16"}
}

同样借用文献[1]的图 ,网络绘制出来如下:我们发现与rpn基本相同。




如上,一张大小为224*224的图片经过前面的5个卷积层,输出256张大小为13*13的 特征图(你也可以理解为一张13*13*256大小的特征图,256表示通道数),然后使用1*1的卷积输出13*13*18的rpn_cls_score,和13*13*36的rpn_bbox_pred。rpn_cls_score经过了reshape,准备进行softmax输出。


接着rpn_cls_score_reshape使用softmax输出了rpn_cls_prob,再reshape回去,输出rpn_cls_prob_reshape。


最后rpn_cls_prob_reshape(1*18*13*13),rpn_bbox_pred(1*36*13*13),im_info (1*3)输入到proposal层中输出了rois与scores。

layer {name: 'proposal'type: 'Python'bottom: 'rpn_cls_prob_reshape'bottom: 'rpn_bbox_pred'bottom: 'im_info'top: 'rois'top: 'scores'python_param {module: 'rpn.proposal_layer'layer: 'ProposalLayer'param_str: "'feat_stride': 16"}
}
我们来看看proposal_layer,

  def setup(self, bottom, top):# parse the layer parameter string, which must be valid YAMLlayer_params = yaml.load(self.param_str_)self._feat_stride = layer_params['feat_stride']anchor_scales = layer_params.get('scales', (8, 16, 32))self._anchors = generate_anchors(scales=np.array(anchor_scales))self._num_anchors = self._anchors.shape[0]if DEBUG:print 'feat_stride: {}'.format(self._feat_stride)print 'anchors:'print self._anchors# rois blob: holds R regions of interest, each is a 5-tuple# (n, x1, y1, x2, y2) specifying an image batch index n and a# rectangle (x1, y1, x2, y2)top[0].reshape(1, 5)# scores blob: holds scores for R regions of interestif len(top) > 1:top[1].reshape(1, 1, 1, 1)
anchor_target_layer.py 的setup类似,设置了top的shape,并且生成了左上角顶点的anchors。

    def forward(self, bottom, top):# Algorithm:## for each (H, W) location i#   generate A anchor boxes centered on cell i#   apply predicted bbox deltas at cell i to each of the A anchors# clip predicted boxes to image# remove predicted boxes with either height or width < threshold# sort all (proposal, score) pairs by score from highest to lowest# take top pre_nms_topN proposals before NMS# apply NMS with threshold 0.7 to remaining proposals# take after_nms_topN proposals after NMS# return the top proposals (-> RoIs top, scores top)assert bottom[0].data.shape[0] == 1, \'Only single item batches are supported'cfg_key = str(self.phase) # either 'TRAIN' or 'TEST'pre_nms_topN  = cfg[cfg_key].RPN_PRE_NMS_TOP_Npost_nms_topN = cfg[cfg_key].RPN_POST_NMS_TOP_Nnms_thresh    = cfg[cfg_key].RPN_NMS_THRESHmin_size      = cfg[cfg_key].RPN_MIN_SIZE# the first set of _num_anchors channels are bg probs   (前9个是背景,后面的是前景预测)# the second set are the fg probs, which we wantscores = bottom[0].data[:, self._num_anchors:, :, :]bbox_deltas = bottom[1].dataim_info = bottom[2].data[0, :]if DEBUG:print 'im_size: ({}, {})'.format(im_info[0], im_info[1])print 'scale: {}'.format(im_info[2])# 1. Generate proposals from bbox deltas and shifted anchorsheight, width = scores.shape[-2:]if DEBUG:print 'score map size: {}'.format(scores.shape)# Enumerate all shiftsshift_x = np.arange(0, width) * self._feat_strideshift_y = np.arange(0, height) * self._feat_strideshift_x, shift_y = np.meshgrid(shift_x, shift_y)shifts = np.vstack((shift_x.ravel(), shift_y.ravel(),shift_x.ravel(), shift_y.ravel())).transpose()# Enumerate all shifted anchors:## add A anchors (1, A, 4) to# cell K shifts (K, 1, 4) to get# shift anchors (K, A, 4)# reshape to (K*A, 4) shifted anchorsA = self._num_anchorsK = shifts.shape[0]anchors = self._anchors.reshape((1, A, 4)) + \shifts.reshape((1, K, 4)).transpose((1, 0, 2))anchors = anchors.reshape((K * A, 4))# Transpose and reshape predicted bbox transformations to get them# into the same order as the anchors:## 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# 为了与anchors的shape对应,故做了此变换bbox_deltas = bbox_deltas.transpose((0, 2, 3, 1)).reshape((-1, 4))# Same story for the scores:## scores are (1, A, H, W) format# transpose to (1, H, W, A)# reshape to (1 * H * W * A, 1) where rows are ordered by (h, w, a)# 为了与anchors的shape对应,故做了此变换scores = scores.transpose((0, 2, 3, 1)).reshape((-1, 1))# Convert anchors into proposals via bbox transformations,生成预测(x1,y1,x2,y2)proposals = bbox_transform_inv(anchors, bbox_deltas)# 2. clip predicted boxes to imageproposals = clip_boxes(proposals, im_info[:2])# 3. remove predicted boxes with either height or width < threshold# (NOTE: convert min_size to input image scale stored in im_info[2])keep = _filter_boxes(proposals, min_size * im_info[2])proposals = proposals[keep, :]scores = scores[keep]# 4. sort all (proposal, score) pairs by score from highest to lowest# 5. take top pre_nms_topN (e.g. 6000)order = scores.ravel().argsort()[::-1]if pre_nms_topN > 0:order = order[:pre_nms_topN]proposals = proposals[order, :]scores = scores[order]# 6. apply nms (e.g. threshold = 0.7)# 7. take after_nms_topN (e.g. 300)# 8. return the top proposals (-> RoIs top)keep = nms(np.hstack((proposals, scores)), nms_thresh)if post_nms_topN > 0:keep = keep[:post_nms_topN]proposals = proposals[keep, :]scores = scores[keep]# Output rois blob# Our RPN implementation only supports a single input image, so all# batch inds are 0# rois 的shape为1*5,(n,x1,y1,x2,y2) ,这里生成的box的尺度是缩放后的。batch_inds = np.zeros((proposals.shape[0], 1), dtype=np.float32)blob = np.hstack((batch_inds, proposals.astype(np.float32, copy=False)))top[0].reshape(*(blob.shape))top[0].data[...] = blob# [Optional] output scores blobif len(top) > 1:top[1].reshape(*(scores.shape))top[1].data[...] = scores
而forward中,先是生成了所有的anchor,然后利用预测地偏移量与生成的anchor一起生成proposal.

再接着进行了一些删减操作以及nms去重。返回前景分数最高的一些proposals及对应的scores.注意生成的proposal是相对于

输入尺度的,也就是缩放后的尺度。



我们再回到train_faster_rcnn_alt_opt中。看Stage 1 RPN, generate proposals'

  mp_kwargs = dict(queue=mp_queue,imdb_name=args.imdb_name,rpn_model_path=str(rpn_stage1_out['model_path']),cfg=cfg,rpn_test_prototxt=rpn_test_prototxt)p = mp.Process(target=rpn_generate, kwargs=mp_kwargs)p.start()rpn_stage1_out['proposal_path'] = mp_queue.get()['proposal_path']p.join()

在rpn_generate中,载入了网络,且使用了生成的rpn网络,接下来imdb_proposals根据网络与imdb生成了rpn_proposals。

imdb_proposals在generate.py中。 

def im_proposals(net, im):"""Generate RPN proposals on a single image."""blobs = {}blobs['data'], blobs['im_info'] = _get_image_blob(im)net.blobs['data'].reshape(*(blobs['data'].shape))net.blobs['im_info'].reshape(*(blobs['im_info'].shape))blobs_out = net.forward(data=blobs['data'].astype(np.float32, copy=False),im_info=blobs['im_info'].astype(np.float32, copy=False))scale = blobs['im_info'][0, 2]boxes = blobs_out['rois'][:, 1:].copy() / scalescores = blobs_out['scores'].copy()return boxes, scoresdef imdb_proposals(net, imdb):"""Generate RPN proposals on all images in an imdb."""_t = Timer()imdb_boxes = [[] for _ in xrange(imdb.num_images)]for i in xrange(imdb.num_images):im = cv2.imread(imdb.image_path_at(i))_t.tic()imdb_boxes[i], scores = im_proposals(net, im)_t.toc()print 'im_proposals: {:d}/{:d} {:.3f}s' \.format(i + 1, imdb.num_images, _t.average_time)if 0:dets = np.hstack((imdb_boxes[i], scores))# from IPython import embed; embed()_vis_proposals(im, dets[:3, :], thresh=0.9)plt.show()return imdb_boxes
可以看到在im_proposals中有

  boxes = blobs_out['rois'][:, 1:].copy() / scale
所以rpn生成的proposal经过了缩放,又回到了原始图片的尺度。

imdb_boxes的shape是N*5.N为盒子的序号。


参考:

1. http://blog.csdn.net/zy1034092330/article/details/62044941

2. https://www.zhihu.com/question/35887527/answer/140239982





本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/258634.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

初学java之常用组件

1 2 import javax.swing.*;3 4 import java.awt.*;5 class Win extends JFrame6 {7 JTextField mytext; // 设置一个文本区8 JButton mybutton;9 JCheckBox mycheckBox[]; 10 JRadioButton myradio[]; 11 ButtonGroup group; //为一…

anaconda 安装在c盘_最省心的Python版本和第三方库管理——初探Anaconda

打算把公众号和知乎专栏的文章搬运一点过来。 历史文章可以去关注我的公众号&#xff1a;不二小段&#xff0c;或者知乎&#xff1a;段小草。也欢迎来看我的视频学Python↓↓↓跟不二学Python这篇文章可以作为Python入门的第一站可以结合这期视频来看&#xff0c;基本上是这期视…

dubbo控制中心部署,权重配置,以及管控台中各个配置的简单查看

dubbo给我们提供了现成的后台管理网站&#xff0c;专门管理这些服务&#xff0c;应用&#xff0c;路由规则&#xff0c;动态配置&#xff0c;访问控制、权重控制、负载均衡等等&#xff0c;还可以查看系统日志&#xff0c;系统状态&#xff0c;系统环境等等&#xff0c;功能很是…

1001种玩法 | 1001种玩法--数据存储(2)

新智云www.enncloud.cn第二趴 Flockdb&#xff1a;一个高容错的分布式图形数据库 FlockDB是一个存储图数据的分布式数据库&#xff0c;图数据库的存储对象是数学概念图论里面的图&#xff0c;而非图片。Twitter使用它来存储人与人之间的关系图&#xff0c;这些关系包括&#xf…

Android ListView分页,动态添加数据

1.ListView分页的实现&#xff0c;重点在于实现OnScrollListener接口&#xff0c;判断滑动到最后一项时&#xff0c;是否还有数据可以加载&#xff0c; 我们可以利用listView.addFootView(View v)方法进行提示 自定义一个ListView&#xff08;这里本来想进行一些自定已修改的。…

faster rcnn的测试

当训练结束后&#xff0c;faster rcnn的模型保存在在py-faster-rcnn/output目录下&#xff0c;这时就可以用已有的模型对新的数据进行测试。 下面简要说一下测试流程。 测试的主要代码是./tools/test_net.py&#xff0c;并且使用到了fast_rcnn中test.py。 主要流程就是&…

Android-Universal-Image-Loader 的使用说明

这个图片异步载入并缓存的类已经被非常多开发人员所使用&#xff0c;是最经常使用的几个开源库之中的一个&#xff0c;主流的应用&#xff0c;随便反编译几个火的项目&#xff0c;都能够见到它的身影。但是有的人并不知道怎样去使用这库怎样进行配置&#xff0c;网上查到的信息…

faster rcnn end2end 训练与测试

除了前面讲过的rpn与fast rcnn交替训练外&#xff0c;faster rcnn还提供了一种近乎联合的训练&#xff0c;姑且称为end2end训练。 根据论文所讲&#xff0c;end2end的训练一气呵成&#xff0c;对于前向传播&#xff0c;rpn可以作为预设的网络提供proposal.而在后向传播中&…

基于像素聚类的分割方法基于slic的方法_博士论文摘要 | 张荣春:数码影像与TLS点云数据融合提取地质结构面方法研究...

《测绘学报》构建与学术的桥梁 拉近与权威的距离数码影像与TLS点云数据融合提取地质结构面方法研究张荣春1,21.南京邮电大学地理与生物信息学院, 江苏 南京 210023;2.河海大学地球科学与工程学院, 江苏 南京 211100收稿日期&#xff1a;2019-03-27基金项目&#xff1a;国家自然…

jaxb转xml空值双标签_单品运营思维:标签-词路-聚焦-直搜-超直

非标品标签思维&#xff1a;针对非标品 主要是2.0为主的打法根据搜索入池的关键词&#xff0c;有什么词做什么词。有个细节&#xff1a;不一定进什么词做什么词&#xff0c;这个维度当中加入3.0的思维3.0入手 转2.0再切3.0(检测词路健康度&#xff0c;非严格意义估算单量)举例&…

如何在PFSense中设置故障转移和负载平衡

故障转移是一种备份操作模式&#xff0c;仅在主系统由于系统故障或任何计划停机时间而变得不可用时&#xff0c;系统组件&#xff08;如网络&#xff09;的操作才由辅助系统承担。在本教程中&#xff0c;我们将看到如何设置故障转移和负载平衡&#xff0c;以使pfSense能够将流量…

图像金字塔总结

本文转载自&#xff1a; http://blog.csdn.net/dcrmg/article/details/52561656 一、 图像金字塔 图像金字塔是一种以多分辨率来解释图像的结构&#xff0c;通过对原始图像进行多尺度像素采样的方式&#xff0c;生成N个不同分辨率的图像。把具有最高级别分辨率的图像放在底部…

什么叫做罗列式_项目起盘的时候,如何确定自己该做什么社群?

这是祁杰『社群日记』第48篇持续日更&#xff0c;做最懂社群的营销咨询人很多人手上有资源&#xff0c;准备起盘项目的时候&#xff0c;总会思考一个问题&#xff1a;我能做什么样的社群&#xff1f;今天我们从用户需求出发&#xff0c;拆解一下哪些社群是能够确切地满足用户的…

Feature Pyramid Networks for Object Detection 总结

最近在阅读FPN for object detection,看了网上的很多资料&#xff0c;有些认识是有问题的&#xff0c;当然有些很有价值。下面我自己总结了一下&#xff0c;以供参考。 1. FPN解决了什么问题&#xff1f; 答&#xff1a; 在以往的faster rcnn进行目标检测时&#xff0c;无论…

那些 IT 界的神翻译,原来我学不好编程的原因就在这

近日博主 ruanyf 在网上发布了一条关于套接字“socket”的解释&#xff0c;引发了网友对于那些 IT 界的神翻译的讨论&#xff1a; 突然想到&#xff0c;socket就是插座。服务器的socket&#xff0c;就是服务器提供插座&#xff0c;等着客户端的插头插进来。一旦插入完成&#x…

navicat 结构同步会加锁吗_被柜员怠慢的张小波,真的会永久地转走几个亿的结构性存款吗?...

4月7日下午&#xff0c;北京凤凰联动文化传媒有限公司总裁张小波发布微博称&#xff0c;前几天去安贞附近一银行&#xff0c;想把借记卡的转帐额度从每天五百万上调一下&#xff0c;没有想到&#xff0c;在其问到“最高可调到多少”时&#xff0c;柜员回答一个亿并“鄙夷地看了…

Mask RCNN笔记

mask rcnn简介 mask rcnn是何凯明基于以往的faster rcnn架构提出的新的卷积网络&#xff0c;一举完成了object instance segmentation. 该方法在有效地目标的同时完成了高质量的语义分割。 文章的主要思路就是把原有的Faster-RCNN进行扩展&#xff0c;添加一个分支使用现有的检…

网页设计中常用的19个Web安全字体

来自http://www.jb51.net 在Web编码中&#xff0c;CSS默认应用的Web字体是有限的&#xff0c;虽然在新版本的CSS3&#xff0c;我们可以通过新增的font-face属性来引入特殊的浏览器加载字体。但多数情况下&#xff0c;考虑各个因素的影响我们还是在尽量充分利用这些默认调用的字…

搜索专题题解

题目链接&#xff1a; codeforces 277A - Learning Languages 题目描述&#xff1a; 一个团体有n个人&#xff0c;每个人都掌握了一些语言&#xff0c;每个人学一门语言有1个花费&#xff0c;两个人之间可以通过其他人的翻译&#xff0c;问最少花费多少使得这个团体的任意两个人…

Facebook 开源的快速文本分类器 FastTex

FastText是Facebook开发的一款快速文本分类器&#xff0c;提供简单而高效的文本分类和表征学习的方法&#xff0c;性能比肩深度学习而且速度更快。 fastText 原理fastText 方法包含三部分&#xff1a;模型架构、层次 Softmax 和 N-gram 特征。下面我们一一介绍。 1.1 模型架构 …