1. 程式人生 > >faster rcnn 原始碼解讀

faster rcnn 原始碼解讀

faster rcnn 原始碼解讀

原始碼解析

faster rcnn是在fast rcnn的基礎上,包裝了rpn的提取以及網路共享,所以,這裡,我們著重看一下這一部分的程式碼,fast rcnn的原始碼解析,之後會在另外的部落格中介紹。

tools

在tools資料夾中,是我們直接呼叫的最外層的封裝檔案。其中主要包含的檔案為:

  • _init_paths.py :用來初始化路徑的,也就是之後的路徑會join(path,*
  • compress_net.py:用來壓縮引數的,使用了SVD來進行壓縮,這裡可以發現,作者對於fc6層和fc7層進行了壓縮,也就是兩個全連線層。
  • demo.py
    :通常,我們會直接呼叫這個函式,如果要測試自己的模型和資料,這裡需要修改。這裡呼叫了fast_rcnn中的test、config、nums_wrapper函式。vis_detections用來做檢測,parse_args用來進行引數設定,以及damo和主函式。
  • eval_recall.py:評估函式
  • reval.py:re-evaluate,這裡呼叫了fast_rcnn以及dataset中的函式。其中,from_mats函式和from_dets函式分別loadmat檔案和pkl檔案。
  • rpn_genetate.py:這個函式呼叫了rpn中的genetate函式,之後我們會對rpn層做具體的介紹。這裡,主要是一個封裝呼叫的過程,我們在這裡呼叫配置的引數、設定rpn的test引數,以及輸入輸出等操作。
  • test_net.py:測試fast rcnn網路。主要就是一些引數配置。
  • train_faster_rcnn_alt_opt.py:訓練faster rcnn網路使用交替的訓練,這裡就是根據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網路時,就是呼叫這個檔案訓練的。
  • train_net.py:使用fast rcnn,訓練自己資料集的網路模型。
  • train_svms.py:使用最原始的RCNN網路訓練post-hoc SVMs。

RPN

這裡我們主要看lib/rpn資料夾下的程式碼。這裡主要介紹了rpn的模型,其中,包含的主要檔案如下:

  • generate_anchors.py: 生成多尺度和多比例的錨點。這裡由generate_anthors函式主要完成,可以看到,使用了 3 個尺度( 128, 256, and 512)以及 3 個比例(1:1,1:2,2:1)。一個錨點由w, h, x_ctr, y_ctr固定,也就是寬、高、x center和y center固定。

  • proposal_layer.py:這個函式是用來將RPN的輸出轉變為object proposals的。作者新增了ProposalLayer類,這個類中,重新了set_up和forward函式,其中forward實現了:生成錨點box、對於每個錨點提供box的引數細節、將預測框切成影象、刪除寬、高小於閾值的框、將所有的(proposal, score) 對排序、獲取 pre_nms_topN proposals、獲取NMS 、獲取 after_nms_topN proposals。(注:NMS,nonmaximum suppression,非極大值抑制)

  • anchor_target_layer.py:生成每個錨點的訓練目標和標籤,將其分類為1 (object), 0 (not object) , -1 (ignore).當label>0,也就是有object時,將會進行box的迴歸。其中,forward函式功能:在每一個cell中,生成9個錨點,提供這9個錨點的細節資訊,過濾掉超過影象的錨點,測量同GT的overlap。

  • proposal_target_layer.py:對於每一個object proposal 生成訓練的目標和標籤,分類標籤從0-k,對於標籤>0的box進行迴歸。(注意,同anchor_target_layer.py不同,兩者一個是生成anchor,一個是生成proposal)

  • generate.py:使用一個rpn生成object proposals。

作者就是通過以上這些檔案生成rpn的。

nms

lib/nms資料夾下是非極大值抑制,這部分大家應該已經非常熟悉了,其python版本的核心函式為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]

其他檔案下的程式碼,如datasets、fast_rcnn、roi_data_layer、utils程式碼同fastrcnn大致相同,會在fast rcnn原始碼中介紹。