首先看下代碼文件夾的說明(這部分轉自:http://blog.csdn.net/bailufeiyan/article/details/50749694)
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]
前段時間看了faster r-cnn的源碼,對該框架有了更清楚的認識,特此總結下整個過程。
1、准備
從train_faster_rcnn_alt_opt.py開始,通過args先做一些配置工作,包括solvers,max_iter等。
還進行了多線程的操作。
接下來,將整個訓練過程分為四步。
(這部分可參考我之前的博客:http://www.cnblogs.com/573177885qq/p/6130877.html)
2、Stage 1 RPN, init from ImageNet model
用ImageNet初始化,通過調用train_rpn來訓練RPN網絡。
進入train_rpn:
這部分包括配置參數、初始化caffe、准備數據集(roidb,imdb),然后是train_net。
通過get_roidb來准備數據集, 參考:http://www.cnblogs.com/573177885qq/p/6141796.html
調用train_net開始正式訓練。在train_net中,首先通過filter_roidb過濾掉一部分roidb,通過
set_roidb將roidb設置進layer[0](即ROILayer),最后訓練train_model。詳細參考layer中的setup,
在訓練時roilayer的forward函數,在第一個層,只需要進行數據拷貝,在不同的階段根據prototxt文件
定義的網絡結構拷貝數據,blobs = self._get_next_minibatch()這個函數讀取圖片數據(調用get_minibatch函數,
這個函數在minibatch中,主要作用是為faster rcnn做實際的數據准備,在讀取數據的時候,分出了boxes,gt_boxes,
im_info(寬高縮放)等)。
minibatch部分參考:http://www.cnblogs.com/573177885qq/p/6142152.html
畫出stage1_rpn_train.pt如圖:
該圖包括6個top blob:data、rois、labels、bbox_targetx、bbox_inside_weights、bbox_outside_weights。
其中rpn-data層使用的是AnchorTargetLayer,這部分參考:http://www.cnblogs.com/573177885qq/p/6141507.html
這就是第一階段的過程。
3、Stage 1 RPN, generate proposals
用上一步訓練的模型生成proposals,供后面使用。
在生成proposals時,調用的是rpn_generate,在其中又調用了rpn文件夾下generate.py中的imdb_proposals(實在太繞了),
在這個函數中,終於可以看到imread讀入圖片了,並調用im_proposals生成圖片的proposals以及得分(這部分以后補充)。
至此,得到imdb proposals。
4、Stage 1 Fast R-CNN using RPN proposals, init from ImageNet model
用上一步的proposals以及ImageNet model訓練fast r-cnn。這里通過調用train_fast_rcnn來訓練
5、Stage 2 RPN, init from stage 1 Fast R-CNN model
利用上一步訓練的模型,保持前五層(卷積層)不動,訓練RPN網絡。
6、 Stage 2 RPN, generate proposals
利用上一步訓練好的RPN網絡,生成proposals。
7、Stage 2 Fast R-CNN, init from stage 2 RPN R-CNN model
利用上一步的proposals,產生最終的檢測網絡。這一步,卷積層和rpn層固定,只訓練全連接層(stage1只固定
rpn層,訓練其他層)。
最后輸出最終訓練的模型。
參考:http://blog.csdn.net/u011956147/article/details/53053381