Faster RCNN proposal_layer.py
来源:互联网 发布:淘宝客服绩效考核方案 编辑:程序博客网 时间:2024/05/21 10:05
定义了一个 ProposalLayer 类, 在rpn_test.pt中会用到。
class ProposalLayer(caffe.Layer): """ Outputs object detection proposals by applying estimated bounding-box transformations to a set of regular boxes (called "anchors"). """
def setup(self, bottom, top):
def setup(self, bottom, top): # parse the layer parameter string, which must be valid YAML layer_params = yaml.load(self.param_str_) self._feat_stride = layer_params['feat_stride'] anchor_scales = layer_params.get('scales', (8, 16, 32)) # 生成9个anchors 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 interest if len(top) > 1: top[1].reshape(1, 1, 1, 1)
def forward(self, bottom, top): 输出Top[0],是 R个 regions of interest, each is a 5-tuple (n, x1, y1, x2, y2) , 其中n 代表batch index; x1, y1, x2, y2表示矩形的4个点的坐标。
输出Top[1]为每个proposal的得分,即是一个物体的可能性。
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_N post_nms_topN = cfg[cfg_key].RPN_POST_NMS_TOP_N nms_thresh = cfg[cfg_key].RPN_NMS_THRESH min_size = cfg[cfg_key].RPN_MIN_SIZE # the first set of _num_anchors channels are bg probs # the second set are the fg probs, which we want # 前9个通道为背景类;后9个通道为非背景类 scores = bottom[0].data[:, self._num_anchors:, :, :] # bbox_deltas 为 rpn_box_pred,是对targets的预测,后面会据此来对proposals的位置进行预测 bbox_deltas = bottom[1].data im_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 anchors height, width = scores.shape[-2:] if DEBUG: print 'score map size: {}'.format(scores.shape) # Enumerate all shifts shift_x = np.arange(0, width) * self._feat_stride shift_y = np.arange(0, height) * self._feat_stride shift_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 anchors A = self._num_anchors K = 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 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) scores = scores.transpose((0, 2, 3, 1)).reshape((-1, 1)) # Convert anchors into proposals via bbox transformations # 利用 bbox_deltas 对anchors进行修正,得到proposals的预测位置 proposals = bbox_transform_inv(anchors, bbox_deltas) # 2. clip predicted boxes to image 裁剪 proposals = 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) 选出Top_N,后面再进行 NMS 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 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 blob if len(top) > 1: top[1].reshape(*(scores.shape)) top[1].data[...] = scores
0 0
- Faster RCNN proposal_layer.py
- Faster RCNN 源码解析(3.3) -- proposal_layer.py
- Faster RCNN roidb.py
- Faster RCNN train_faster_rcnn_alt_opt.py
- Faster RCNN layer.py
- Faster RCNN train.py
- Faster RCNN generate.py
- Faster RCNN blob.py
- Faster RCNN minibatch.py
- Faster RCNN pascal_voc.py
- Faster RCNN imdb.py
- Faster RCNN anchor_target_layer.py
- py-faster-rcnn
- Faster RCNN generate_anchors.py
- Faster RCNN-generate_anchors.py
- Windows-Py-Faster-rcnn
- win10+py-faster-rcnn
- 训练py-faster-rcnn
- Part part = request.getPart("upfile"); 报错解决方法
- 【Arduino官方教程第零辑】基础部分 1-1 什么是Arduino
- jquery 获取select数组与name数组长度
- 微信js-sdk实现“分享到朋友圈”和“发送给朋友”
- Android 6.0 关于WiFi的改变
- Faster RCNN proposal_layer.py
- C++中的STL中map用法详解
- java基础教程1:简介
- time和datetime时间戳---python
- Android一种字幕效果的实现
- java基础 第三章 数据类型和运算符
- java 基础 第四章流程控制与数组
- 学习GitHub(三): git分支的创建、合并和删除
- uva 221 Urban Elevations