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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM