py-faster-rcnn 源碼解析1


faster rcnn是在fast rcnn的基礎上,包裝了RPN以及網絡共享。首先,看一下除fast rcnn以外的內容。

tools
1._init_paths.py
初始化路徑,要訪問module/package的路徑的加進去,給PYTHONPATH加上訪問caffe和lib的路徑
2.compress_net.py
使用truncated SVD壓縮網絡參數,這里,對fc6和fc7進行了壓縮,即全連接層
3.demo.py
使用VGG16 trained on PASCAL VOC 2007 在示例圖片上進行測試。
4.eval_recall.py

5.reval.py

6.rpn_generate.py
調用了rnp中的generator函數,這里只是一個封裝調用的過程, 我們在這里調用配置的參數、設置rpn的test參數,以及輸入輸出等操作。
7.test_net.py
調用lib/fast_rcnn/test.py中的函數test_net,用數據集測試fast r-cnn網絡,主要是一些參數的配置
8.train_faster_rcnn_alt_opt.py
用交替優化的方式訓練faster r-cnn,這里就是根據faster rcnn文章中的具體實現。可以在主函數中看到,其包括的步驟為:

  • RPN 1,使用imagenet model進行初始化參數,生成proposal,這里存儲在mp_kwargs
  • fast rcnn 1,使用 imagenet model 進行初始化參數,使用剛剛生成的proposal進行fast rcnn的訓練
    *RPN 2使用 fast rcnn 中的參數進行初始化(這里要注意哦),並生成proposal
  • fast rcnn 2,使用RPN 2 中的 model進行初始化參數,
    值得注意的是:在我們訓練時,我們可以在get_solvers中的max_iters中設置迭代次數,在不確定網絡是否可以調通時,減少迭代次數可以減少測試時間。
    我們在訓練faster rcnn網絡時,就是調用這個文件訓練的。
    9.train_net.py
    調用lib/fast_rcnn/train.py中的函數train_net,使用自己的數據集訓練fast r-cnn網絡
    10.train_svms.py
    使用r-cnn中的算法和超參數,訓練post-hoc SVMs

lib/rpn
1.generate_anchors.py
生成多尺度和多比例的錨點。這里由generate_anchors 函數主要完成,可以看到,使用了3個尺度(128,256,512)以及3個比例(1:1,1:2,2:1)。一個錨點由w,h,x_str,y_str固定,也就是寬、高、x_center和y_center固定。
2.anchor_target_layer.py
生成每個錨點的訓練目標和標簽,將其分類為1(object),0(not object),-1(ignore)。當label>0,yejiushi you object),-1(ignore)。當label>0,也就是有object時,將會進行box的回歸。其中,forward函數功能:在每一個cell中,生成9個錨點,提供這9個錨點的細節信息,過濾掉超過圖像的錨點,測量同GT的overlap。
3.proposal_layer.py
這個函數是用來將RPN的輸出轉變為object proposal的。作者新增了ProposalLayer類,其中forward實現了:生成錨點box、對每個錨點提供box的參數細節、將預測框切成圖像、刪除寬高小於閾值的框、將所有的(proposal,score)對排序、獲取pre_nms_topN proposals、獲取NMS、獲取after_nms_topN proposals。
4.proposal_target_layer.py
將proposal與 ground-truth targets對比,對每一個object proposal生成 proposal classification labels and bounding-box regression targets。
5.generate.py
使用一個rpn生成object proposals。

lib/nms
nms里的核心函數就是py_cpu_nms.py
py_cpu_nms.py

def py_cpu_nms(dets, thresh):
    """Pure Python NMS baseline."""
    #x1、y1、x2、y2、以及score賦值
    x1 = dets[:, 0]
    y1 = dets[:, 1]
    x2 = dets[:, 2]
    y2 = dets[:, 3]
    scores = dets[:, 4]

    #每一個op的面積
    areas = (x2 - x1 + 1) * (y2 - y1 + 1)
    #order是按照score排序的
    order = scores.argsort()[::-1]

    keep = []
    while order.size > 0:
        i = order[0]
        keep.append(i)
        xx1 = np.maximum(x1[i], x1[order[1:]])
        yy1 = np.maximum(y1[i], y1[order[1:]])
        xx2 = np.minimum(x2[i], x2[order[1:]])
        yy2 = np.minimum(y2[i], y2[order[1:]])

        #計算相交的面積
        w = np.maximum(0.0, xx2 - xx1 + 1)
        h = np.maximum(0.0, yy2 - yy1 + 1)
        inter = w * h
        #計算:重疊面積/(面積1+面積2-重疊面積)
        ovr = inter / (areas[i] + areas[order[1:]] - inter)

        inds = np.where(ovr <= thresh)[0]
        order = order[inds + 1]


免責聲明!

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



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