より高速なR-CNN faster_rcnnソースコードファイルフォルダは3 faster_rcnn.py、含まれていresnet.py、vgg16.pyを。
1.faster_rcnn.pyコメント
1 クラス_fasterRCNN(nn.Module): 2 "" " 高速RCNN " "" 3。 DEF __init__(セルフ、クラス、class_agnostic): #のクラスに依存しない回帰に基づく方法は、わずか2バウンディングボックス、すなわち、前景と背景であるぴったりた 4。 スーパー(_fasterRCNN、自己)。__init__ () 。5つの self.classesクラス= #1 タイプ 。6 self.n_classes = LEN(クラス)#1 カテゴリの数 。7 self.class_agnostic = class_agnostic #の前景背景クラス 8つの #損失二種類損失 9 self.RCNN_loss_cls = 0 10 self.RCNN_loss_bbox = 0 11 12 #定義RPN定义RPN网络 13 self.RCNN_rpn = _RPN(self.dout_base_model) 14 self.RCNN_proposal_target = _ProposalTargetLayer(self.n_classes) #候选区域对应GT 15 self.RCNN_roi_pool = _RoIPooling(cfg.POOLING_SIZE 、cfg.POOLING_SIZE、1.0 / 16.0) #のプーリング 16 self.RCNN_roi_align = RoIAlignAvg(cfg.POOLING_SIZE、cfg.POOLING_SIZE、1.0 / 16.0 ) 17 18 self.grid_size = cfg.POOLING_SIZE * 2 なら cfg.CROP_RESIZE_WITH_MAX_POOL 他cfg.POOLING_SIZE 19 self.RCNN_roi_crop = _RoICrop() 20は、 21である DEFフォワード(セルフ、im_data、im_info、gt_boxes、num_boxes):#1 画像アノテーション情報ブロック番号情報 22が BATCH_SIZE = im_data.size(0) 23である 24 im_info = im_info.data 25 gt_boxes = gt_boxes.data 26は num_boxes = num_boxes.data 27 28 #の特徴マップ得るために画像データ・ベース・モデルベースのフィード 29 #図の基本的な機能を得るために、画像データのベースモデルに供給されます。 30 base_feat = self.RCNN_base(im_data) 31であります 32 #の機能地図TP RPN ROIを得るために、送り台 33は、 #1 背面図RPNに機能ROIS取得 34は 関心領域、rpn_loss_cls、rpn_loss_bbox = self.RCNN_rpn(base_feat、im_info、gt_boxes、num_boxes) 35 36 #ITトレーニング・フレーズである場合、使用グランド用bboxes trubut精製 37 位グランドトゥルースが回帰使用して訓練された場合に 38で IF :self.trainingは 39 roi_data = (関心領域は、gt_boxes、num_boxes)self.RCNN_proposal_target 40個 のROI、rois_label、rois_target、rois_inside_ws、rois_outside_ws = roi_data 41は 42であります rois_label =可変(rois_label.view(-1 ).LONG()) 43 rois_target =可変(rois_target.view(-1、rois_target.size(2 ))) 44 rois_inside_ws =可変(rois_inside_ws.view(-1、rois_inside_ws。サイズ(2 ))) 45 rois_outside_ws =可変(rois_outside_ws.view(-1、rois_outside_ws.size(2 ))) 46 他: 47 rois_label = なし 48 rois_target = なし 49 rois_inside_ws = なし 50 rois_outside_ws = なし 51 rpn_loss_cls = 0 52 rpn_loss_bbox = 0 53 54 のROI = 可変(関心領域) 55の #は予測関心領域に基づいてROIプーリングない 56 #、进行のROIのプーリングプーリング下面方式 57 58 なら cfg.POOLING_MODE == ' 収穫' : 59 #pdb.set_trace () 60 #pooled_feat_anchor = _crop_pool_layer(base_feat、rois.view(-1、5)) 61 grid_xy = _affine_grid_gen(rois.view(-1、5)、base_feat.size()[2 :]、self.grid_size) 62 grid_yx = torch.stack([grid_xy.data [:、:、:、1]、grid_xy.data [:、:、:、0]]、3 ).contiguous() 63 pooled_feat = self.RCNN_roi_crop(base_feat、変数(grid_yx).detach()) 64 であればcfg.CROP_RESIZE_WITH_MAX_POOL: 65 pooled_feat = F.max_pool2d(pooled_feat、2、2 ) 66 のelif cfg.POOLING_MODE == ' ALIGN ' : 67 pooled_feat = self.RCNN_roi_align(base_feat、rois.view (-1、5 )) 68 のelif cfg.POOLING_MODE == ' プール' : 69 = self.RCNN_roi_poolのpooled_feat(base_feat、rois.view(-1,5 )) 70 71である #のプールされたへの供給原料はトップモデル特長 72の #の最後のフィードバックモデルにプールした後の特性を 73で pooled_feat = self._head_to_tail(pooled_feat) 74 75 #BBOXは、計算オフセット 76 #計算はボックス境界オフセット 77を bbox_pred = self.RCNN_bbox_pred(pooled_feat) 78 IF self.training 及び ませんself.class_agnostic: 79の #は対応する列にROIを選択よらラベル 80 #適切なカラムを選択するROIタグに従って 81 bbox_pred_view = bbox_pred.view(bbox_pred.size(0)、INT(bbox_pred.size(1)/ 4),. 4 ) 82 bbox_pred_select = torch.gather(bbox_pred_view ,. 1、rois_label.view( rois_label.size(0),. 1 ,. 1).expand(rois_label.size(0),. 1 ,. 4 )) 83 bbox_pred bbox_pred_select.squeezeは=(1 ) 84 85 #計算オブジェクト分類確率 86 #のコンピューティングオブジェクト分類確率 87 cls_score = self.RCNN_cls_score(pooled_feat) 88 cls_prob = F.softmax(cls_score ,. 1 ) 89 90 RCNN_loss_cls =0 91 RCNN_loss_bbox = 0 92 93 場合self.training: 94の #分類損失 95 #分类损失 96 RCNN_loss_cls = F.cross_entropy(cls_score、rois_label) 97 98 #バウンディングボックス回帰L1損失は 99 #回归损失 100 RCNN_loss_bbox = _smooth_l1_lossを(bbox_pred、 rois_target、rois_inside_ws、rois_outside_ws) 101 102 103 cls_prob = cls_prob.view(BATCH_SIZE、rois.size(1)、-1 ) 104 = bbox_pred.view bbox_pred(BATCH_SIZE、rois.size(1)、-1 ) 105個の 106 リターンのROI、cls_prob、bbox_pred、rpn_loss_cls、rpn_loss_bbox、RCNN_loss_cls、RCNN_loss_bbox、rois_label 107の 108 #の初期重み 109 DEF _init_weights(自己): 110 DEF normal_init(M、平均、STDDEV、切り捨て=偽): #は、SD 111 #切り捨てられた正規乱数通常 112 "" " 113 切り捨て正常および正常ランダム:. initalizer重量 114 " "" 115 #のXはパラメータである 1 16 IF 切り捨て: 117 m.weight.data.normal _()fmod_(2).mul_(STDDEV).add_(平均)。 #ない完璧な近似値 118 他: 119 m.weight.data.normal_(平均、STDDEV) 120 m.bias。 data.zero_() 121 122 normal_init(self.RCNN_rpn.RPN_Conv、0、0.01 、cfg.TRAIN.TRUNCATED) 123 normal_init(self.RCNN_rpn.RPN_cls_score、0、0.01 、cfg.TRAIN.TRUNCATED) 124 normal_init(self.RCNN_rpn .RPN_bbox_pred、0、0.01 、cfg.TRAIN.TRUNCATED) 125 normal_init(self.RCNN_cls_score、0、0.01 、cfg.TRAIN.TRUNCATED) 126 normal_init(self.RCNN_bbox_pred、0、0.001 、cfg.TRAIN.TRUNCATED) 127 128 デフcreate_architecture(自己): 129 self._init_modules() 130 self._init_weights()
REF:https://blog.csdn.net/weixin_43872578/article/details/87930953