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]