用DPM(Deformable Part Model,voc-release3.1)演算法在INRIA資料集上訓練自己的人體檢測模型

masikkk發表於2014-05-13

我的環境

DPM原始碼版本:voc-release3.1

VOC開發包版本:VOC2007_devkit_08-Jun

Matlab版本:MatlabR2012b

c++編譯器:VS2010

系統:Win7 32位

learn.exe迭代次數:5萬次

資料集:INRIA 人體資料集,等


步驟一,首先要使voc-release3.1目標檢測部分的程式碼在windows系統下跑起來

在Windows下執行Felzenszwalb的Deformable Part Models(voc-release4.01)目標檢測matlab原始碼

上文中用的4.01,3.1需要修改的地方是一樣的,反而更簡單。


步驟二,把訓練部分程式碼跑通,在VOC資料集上進行測試,如下文:

在windows下執行Felzenszwalb的Deformable Part Model(DPM)原始碼voc-release3.1來訓練自己的模型


步驟三,再之後就是使之能在其他的資料集上訓練模型,比如INRIA人體資料集。

這一步中主要是修改pascal_data.m檔案,這個檔案的作用就是讀取標註,為訓練準備資料。此函式會返回兩個陣列,pos[]和neg[],

pos[]中是正樣本資訊,格式為:[imagePath x1 y1 x2 y2 ];

neg[]中是負樣本資訊,格式為:[imagePath] 。

先讀取INRIA資料集的標註,儲存為下面的格式:


然後在pascal_data.m中讀取此檔案,依次將標註資訊儲存到pos[]陣列中,注意要將圖片路徑補全為絕對路徑。

    pos = []; % 儲存正樣本目標資訊的陣列,每個元素是一個結構,{im, x1, y1, x2, y2}
    numpos = 0; % 正樣本目標個數(一個圖片中可能含有多個正樣本目標)
    
    % InriaPersonPos.txt是從Inria人體資料集獲得的50個正樣本的標註檔案,格式為[x1 y1 x2 y2 RelativePath]
    [a,b,c,d,p] = textread('InriaPersonPos.txt','%d %d %d %d %s'); % 注意:讀取後p的型別時50*1的cell型別
    
    % 遍歷訓練圖片檔名陣列ids
    for i = 1:length(a);
        if mod(i,10)==0
            fprintf('%s: parsing positives: %d/%d\n', cls, i, length(a));
        end;
        numpos = numpos+1; % 正樣本目標個數
        pos(numpos).im = [VOCopts.datadir p{numpos}]; % 引用cell單元時要用{},引用矩陣單元時用()
        pos(numpos).x1 = a(numpos);
        pos(numpos).y1 = b(numpos);
        pos(numpos).x2 = c(numpos);
        pos(numpos).y2 = d(numpos);
    end
pos(numpos).im 中我也在相對路徑前加了VOCopts的資料集目錄datadir是因為我將INRIA資料集放在VOCdevkit目錄下了。


這裡要特別注意的是,不需要提前從INRIA資料集中根據標註檔案手動裁出人體目標,而是將標註資訊和正樣本原圖都告訴DPM演算法,它自動會進行縮放、剪裁處理,對於有的標註資訊超過影象邊界的,也沒關係,DPM中也會自己處理。

至於負樣本就無所謂了,反正都是從不含人體的原圖上隨機裁取,還用VOC資料集中的就行。

下面展示幾個訓練的模型,以及檢測結果

(1)50個INRIA正樣本目標,300個VOC負樣本目標,單元件(component)模型,部件個數為6。

模型視覺化圖如下:

沒想到僅用50個正樣本,訓練出的模型竟然很不錯,這也跟INRIA人體資料集的質量很高有關。

檢測結果如下:


在500個VOC測試圖上獲得的平均精度AP=0.091


(2)537個Spinello RGBD資料集中的正樣本目標,300個VOC負樣本目標,單元件,6個部件。

模型視覺化如下:


由於這537個正樣本目標來自對單個人的跟蹤結果,所以樣本不太好,如下:


所以訓練出來的模型根本檢測不到任何人體目標。


(3)2396個Spinello RGBD資料集中的正樣本目標,300個VOC負樣本目標,單元件,6個部件。

模型視覺化如下:


這次的資料來源和(2)中相同,只不過這次正樣本取自資料集中的所有34個人的跟蹤結果,訓練了一個晚上,結果還行。

檢測結果如下:


在500個VOC測試圖上獲得的平均精度AP=0.091。帶包圍盒預測的精度-召回率(precision-recall)曲線如下:


參考

用DPM(Deformable Part Model,voc-release3.1)演算法在INRIA資料集上訓練自己的人體檢測模型




相關文章