1. 程式人生 > >Ubuntu 下使用 FDDB 測試人臉檢測模型並生成 ROC 曲線

Ubuntu 下使用 FDDB 測試人臉檢測模型並生成 ROC 曲線

  FDDB 如此經典的測試基準,竟然缺少完整全面的測試流程教程。筆者自行梳理了在 FDDB 上測試人臉檢測模型的流程,力求詳細清晰,可復現。(版本: Ubuntu 16.04 和 OpenCV 3.4.2)

1. 下載 FDDB

官網下載 FDDB 資料集,解壓得到 originalPics 資料夾,FDDB-folds 資料夾和 README.txt
results 頁面下載評估程式,解壓得到 evaluation 資料夾。

2. 準備 .txt 檔案

新建imList.txt FDDB-folds 資料夾中有 10 個 FDDB-fold-i.txt 檔案,以特定順序記錄了所有圖片的路徑。按從 1 到 10 的順序把它們複製貼上到 imList.txt 中,或者在 FDDB-folds 資料夾中執行下面的指令來合併。

cat `ls|grep -v"ellipse"` > imList.txt

新建ellipseList.txt FDDB-folds 資料夾中有 10 個 FDDB-fold-i-ellipseList.txt 檔案,記錄了對應的人臉個數和位置資訊。按從 1 到 10 的順序把它們複製貼上到 ellipseList.txt 中,或者在 FDDB-folds 資料夾中執行下面的指令。

cat *ellipse* > ellipseList.txt

生成結果檔案 用你的模型按照 FDDB-fold-i.txt 的順序檢測圖片,生成與之對應的 10 個 fold-i-out.txt

,存放在 out-folds 資料夾中,併合並或複製貼上成 results.txt。結果檔案的格式需要為
...
image name i
number of faces in this image =im
face i1
face i2
...
face im
...

當檢測框為矩形時,faceim左上角的x座標 左上角的y座標 寬 高 置信度
例如
fold-01-out.txt 截圖
(當檢測框為橢圓時,格式需要為長軸半徑 短軸半徑 角度 中心點x 中心點y 置信度)

注: 下載使用別人的 imList.txt 和 ellipseList.txt 可能會導致報錯 Incompatible annotation and detection files. See output specifications. 這是 windows 下和 ubuntu 下的檔案不同導致的。只需要在 ubuntu 下面新建一個 .txt 檔案,然後將內容複製貼上進去即可。

資料夾截圖作為參考 (檔名稱和路徑不同時,後續步驟中的相應程式碼也應不同。)

資料夾截圖

3. 安裝 OpenCV (版本 3.4.2)

完全按照此教程安裝。

4. 修改 MakeFile

開啟 evaluation 資料夾下的 MakeFile,將

evaluate: $(OBJS)
    $(CC) $(LIBS) $(OBJS) -o [email protected]

修改為

evaluate: $(OBJS)
    $(CC) $(OBJS) -o [email protected] $(LIBS)

5. 修改 common.hpp

開啟 evaluation 資料夾下的 common.hpp,將

//#define __IMAGE_FORMAT__ ".jpg"
#define __IMAGE_FORMAT__ ".ppm"
#define __CVLOADIMAGE_WORKING__

修改為

#define __IMAGE_FORMAT__ ".jpg"
//#define __IMAGE_FORMAT__ ".ppm"
#define __CVLOADIMAGE_WORKING__

6. 把 CV_RGB 改成 Scalar

此時在 evaluation 資料夾中執行 make 仍會報錯,可按照錯誤提示找到程式碼位置,將 CV_RGB 改成 Scalar,並新增using namespace cv;
CV_RGB 錯誤截圖 1
CV_RGB 錯誤截圖 2
CV_RGB 錯誤截圖 3

7. make

全部修改完後,在 evaluation 資料夾中開啟終端,執行 make clean,再執行 make,可以成功編譯。
make 成功截圖

編譯成功後,FDDB 測試流程已經基本完成。後續步驟有兩種方式可選:(1) 執行第 8 和第 9 步。或者 (2) 執行第 10,11,12 步。

8. 執行 evaluate

繼續在上述終端裡執行

./evaluate -a ../ellipseList.txt -d ../results.txt -i ../originalPics/ -l ../imList.txt

注意若檔名稱和路徑與筆者 (見第 2 步中的截圖) 不同,需要相應修改。
完成後,在 evaluation 資料夾中生成了 tempContROC.txt 和 tempDiscROC.txt 兩個檔案。

9. 利用 MATLAB 等軟體繪圖

在第 8 步中得到的兩個 .txt 檔案即為 ROC 曲線上的點的座標資訊,可以自行選擇各種軟體繪圖了。只需注意檔案中的第二列為橫座標,第一列為縱座標,即可得到 ROC 曲線,至此可以關閉本教程

若選擇另一種繪圖方式 (官方提供的是這種),則可以跳過第 8 和第 9 步,依次執行下列第 10,11, 12 步。

10. 安裝 gnuplot

重新開啟一個終端,執行 sudo apt-get install gnuplot

11. 修改 runEvaluate.pl

開啟 evaluation 資料夾下的 runEvaluate.pl,填寫路徑如下:

#### VARIABLES TO EDIT ####
# where gnuplot is
my $GNUPLOT = "/usr/bin/gnuplot";
# where the binary is
my $evaluateBin = "./evaluate";
# where the images are
my $imDir = "../originalPics/";
# where the folds are
my $fddbDir = "../FDDB-folds/";
# where the detections are
my $detDir = "../out-folds/";
###########################

注意若檔名稱和路徑與筆者 (見第 2 步中的截圖) 不同,需要相應修改。

12. 執行 runEvaluate.pl

在 evaluation 資料夾的終端中執行 perl runEvaluate.pl
完成後在 out-folds 資料夾下生成了 ContROC.txt, DiscROC.txt, ContROC.png 和 DiscROC.png 四個檔案。

ContROC

DiscROC

可見此人臉檢測模型過於保守,只有 70+ 的誤檢個數,而召回率較低。

附 為什麼離散和連續的 ROC 曲線相差這麼大?

  結果有離散分數 discROC 和連續分數 contROC 兩種,discROC 僅關心 IoU 是不是大於0.5,contROC 是 IoU 越大越好。鑑於大家都採用無限制訓練加 FDDB 測試的方式,detector 會繼承訓練資料集的標註風格,繼而影響 contROC,所以 discROC 比較重要,contROC 看看就行了,不用太在意。