通過前幾節的介紹,讀者應該對Fast R-CNN有了基本的瞭解,並且準備好了訓練和測試的數據集。本節基於Fast R-CNN源碼分別介紹訓練、測試、評估和優化網絡的方法,訓練和測試過程主要參考文獻[8]。
5.7.1 訓練階段
下面以側臉數據集在Fast R-CNN上訓練人臉檢測網絡模型為例,說明Fast R-CNN的訓練過程。
1.下載預訓練網絡
首先下載預訓練網絡,本實驗使用的是ImageNet模型。
2.準備數據集
在FRCNN項目下,新建一個DataSet文件夾存放訓練和測試的數據集和對應的文件,目錄結構如下:
在 5.6 節中使用EdgeBoxes方法在訓練數據集上提取了對應的OP矩陣:edges_celianTrain.mat,將該矩陣放在FRCNN/data/selective_search_data路徑下。
3.修改程序
FRCNN/lib/datasets下的文件是與訓練和檢測相關的程序,因此本實驗對pasca_voc.py、factory.py、imdb.py和__init__.py進行修改。
將pascal_voc.py重命名為wang_detect_face.py,修改的一些主要代碼如程序2所示。
程序2:wang_detect_face.py
程序3是factory.py修改後的代碼,如下所示。
程序3:factory.py
此外,將wang_detect_face.py、factory.py、imdb.py和__init__.py頭文件中的from.pascal_voc import pascal_voc修改為from.wang_detect_face import wang_detect_face。
讀者可以按照參考文獻[8]修改這些文件。
4.修改網絡
在FRCNN/data下的fast_rcnn_models文件夾和imagenet_model文件夾內,分別有3個網絡,表5-1所示為每個網絡模型對應的類型。
表5-1 網絡模型的介紹
本實驗使用的網絡模型是imagenet_models文件夾中的VGG_CNN_M_1024.v2.caffemodel。在選擇好預訓練模型後,還需要對網絡中的參數進行修改。打開FRCNN/models/VGG_CNN_M_1024/train.prototxt,進行如下修改。
首先,將data層的num_classes 21修改為2(原來是20類+背景,本實驗為人臉+背景,即2類)。
其次,將cls_score層的num_output 21修改為2。
最後,將bbox_pred層的num_output 84 修改為8(類別數乘以4)。
5.運行訓練命令
通過前面幾個步驟,已經完成了數據的處理、程序的調整和訓練網絡參數的修改。接下來,使用如下命令訓練人臉檢測模型。
訓練結果模型保存在FRCNN/output/default下。
5.7.2 測試階段
在進行測試前,首先需要修改測試網絡和測試程序。
1.修改測試網絡
將FRCNN/models/VGG_CNN_M_1024/test.prototxt文件中cls_score層的num_output 21修改為2,bbox_pred層的num_output 84修改為8。
2.修改測試程序
本書使用MATLAB測試程序,需要修改 FRCNN/matlab/fast_rcnn_demo.m文件,修改後的文件如程序4所示。
程序4:fast_rcnn_demo.m
3.運行測試程序
修改完成後,將待測試的圖片路徑和名稱放在FRCNN/DataSet/test.txt內,並且每張圖片的同級目錄下,需要存放對應的OP矩陣,以_boxes.mat為後綴。
最後,執行如下命令:
運行完成後,檢測結果會保存在detect_result.txt文件中,如下是本實驗的運行結果文件。圖5-2所示是一些測試圖片的檢測結果。
運行結果文件:detect_result.txt
圖5-2 一些測試圖片的檢測結果
5.7.3 評估階段
在測試完成後,需要對測試數據集進行評估。本書使用的評估方法和通常的評估方法一致,即若檢測框和真實邊界框的面積交集/面積並集 0.5,則認為該檢測框檢測到的為人臉區域。程序5是本書的評估程序。
程序5:eval_result.m
按照程序5評估後,可得到如表5-2所示的結果。
表5-2 檢測結果
5.7.4 優化階段
由表5-2可知,本次訓練出的人臉檢測模型的正確率只有86.4%。為了獲得更優的人臉檢測模型,需要調整modelsVGG_CNN_M_1024solver.prototxt文件中的參數,主要調整base_lr和stepsize。
網絡參數文件:solver.prototxt