關於openCV中的分類器

我的問題:有了opencv自帶的那些xml人臉檢測文檔,我們就可以用cvLoad()這個函數加載他們,讓他們對我們的人臉進行檢測,但是,現在生活中的計算機視覺並不遠遠是檢測人臉,還有很多物品需要識別,所以,能不能自己做個xml的檢測文檔,用它來檢測自己需要的東西呢?例如,檢測一個可樂瓶!
問題解決:
首先了解下,目標檢測分爲三個步驟:
1、 樣本的創建
2、 訓練分類器
3、 利用訓練好的分類器進行目標檢測。


一,樣本的創建:
訓練樣本分爲正例樣本和反例樣本,其中正例樣本是指待檢目標樣本(例如可樂瓶,人臉等),反例樣本指其它任意圖片。
1.正樣本
現在,我們來看正樣本的創建步驟:
正樣本由程序createsample 程序來創建。該程序的源代碼由OpenCV 給出,並且在bin 目錄下包含了這個可執行的程序。例如你opencv安裝目錄爲 c:\ 既C:\OpenCV\bin,你找找就有
正樣本可以由單個的目標圖片或者一系列的事先標記好的圖片來創建!


2在用createsamples.exe 這個程序前,先來了解下這個程序的一些命令組合模式
Createsamples 程序的命令行參數:
命令行參數:


-vec <vec_file_name>
訓練好的正樣本的輸出文件名。


-img<image_file_name>
源目標圖片(例如:一個公司圖標)


-bg<background_file_name>
背景描述文件。


-num<number_of_samples>
要產生的正樣本的數量,和正樣本圖片數目相同。


-bgcolor<background_color>
背景色(假定當前圖片爲灰度圖)。背景色制定了透明色。對於壓縮圖片,顏色方差量由bgthresh
參數來指定。則在bgcolor-bgthresh 和bgcolor+bgthresh 中間的像素被認爲是透明的。


-bgthresh<background_color_threshold>
-inv
如果指定,顏色會反色


-randinv
如果指定,顏色會任意反色


-maxidev<max_intensity_deviation>
背景色最大的偏離度。
-maxangel<max_x_rotation_angle>
-maxangle<max_y_rotation_angle>,
-maxzangle<max_x_rotation_angle>
最大旋轉角度,以弧度爲單位。
-show
如果指定,每個樣本會被顯示出來,按下"esc"會關閉這一開關,即不顯示樣本圖片,而創建過程
繼續。這是個有用的debug 選項。


-w<sample_width>
輸出樣本的寬度(以像素爲單位)


-h《sample_height》
輸出樣本的高度,以像素爲單位。


注:正樣本也可以從一個預先標記好的圖像集合中獲取。這個集合由一個文本文件來描述。每一個文本行對應一個圖片。每行的第一個元素是圖片文件名,第二個元素是對象實體的個數。後面緊跟着的是與之匹配的矩形框(x, y, 寬度,高度)。


由於 HaarTraining 訓練時輸入的正樣本是 vec 文件,所以需要使用 OpenCV 自帶的
CreateSamples程序將準備好的正樣本轉換爲 vec文件。轉換的步驟如下:
1)  製作一個正樣本描述文件,用於描述正樣本文件名(包括絕對路徑或相對路徑) ,
正樣本數目以及各正樣本在圖片中的位置和大小。典型的正樣本描述文件如下:
face_100/face00001.bmp 1 0 0 20 20
face_100/face00002.bmp 1 0 0 20 20
face_100/face00003.bmp 1 0 0 20 20

可採用 Dos命令結合 EditPlus 軟件生成樣本描述文件。
具體方法是在 Dos下的恰當目錄敲入
 dir face_100 /b > samples.dat,
則會生成一個 samples.dat,裏面包含所有正樣本文件名列表,但沒有相對路徑名和正樣本位置信息。在 samples.dat 文件各行行首增加“face _100/”的方法是
使用 EditPlus,先選中所有行,
然後按 Tab鍵爲每行增加一個製表位,
然後將製表位全部替換爲“face _100/”即可。
通過將“bmp”替換爲“bmp 1 0 0 20 20”即可在每行添加“1 0 0 20 20”。
 
運行CreateSamples程序。下面是一個運行參數示例:
opencv_createsamples.exe -vec pos.vec -info pos.dat  -num 200 -w 32 -h 32
表示有 200 個樣本,樣本寬 32,高 32,正樣本描述文件爲 pos.dat,結果輸出
到 pos.vec。 






 
運行完了會生成一個pos.vec 的文件。該文件包含正樣本數目,寬高以及所有樣本圖.
 
2 負樣本圖像可以是不含有正樣本模式的任何圖像,比如一些風景照等。訓練時, OpenCV
需要一個負樣本描述文件,該文件只需包含所有負樣本的文件名及絕對(或相對)路徑名。
以下是一個負樣本描述文件內容示例:
nonface_200/00001.bmp
nonface_200/00002.bmp
nonface_200/00003.bmp
 …
  負樣本描述文件的生成方法可參照正樣本描述文件生成方法。
 
負樣本圖像的大小隻要不小於正樣本就可以,在使用負樣本時,OpenCV 自動從負樣本
圖像中摳出一塊和正樣本同樣大小的區域作爲負樣本,具體可查看函數
icvGetNextFromBackgroundData() 。具體摳圖過程爲:
1)  確定摳圖區域的左上角座標(Point.x, Point.y)
2)  確定一個最小縮放比例,使得原負樣本圖像縮放後恰好包含選中負樣本區域
3)  對原負樣本圖象按計算好的縮放比例進行縮放
4)  在縮放後的圖像上摳出負樣本,如圖 3.2 左半部分的虛線框所示。










 
三、訓練分類器
樣本創建之後,接下來要訓練分類器,這個過程是由haartraining 程序來實現的。


Haartraining 的命令行參數如下:


-data<dir_name>
存放訓練好的分類器的路徑名。


-vec<vec_file_name>
正樣本文件名(由trainingssamples 程序或者由其他的方法創建的)


-bg<background_file_name>
背景描述文件。


-npos<number_of_positive_samples>,
-nneg<number_of_negative_samples>
用來訓練每一個分類器階段的正/負樣本。合理的值是:nPos = 7000;nNeg = 3000


-nstages<number_of_stages>
訓練的階段數。


-nsplits<number_of_splits>
決定用於階段分類器的弱分類器。如果1,則一個簡單的stump classifier 被使用。如果是2 或者更
多,則帶有number_of_splits 個內部節點的CART 分類器被使用。


-mem<memory_in_MB>
預先計算的以MB 爲單位的可用內存。內存越大則訓練的速度越快。


-sym(default)
-nonsym
指定訓練的目標對象是否垂直對稱。垂直對稱提高目標的訓練速度。例如,正面部是垂直對稱的。
-minhitrate《min_hit_rate》
每個階段分類器需要的最小的命中率。總的命中率爲min_hit_rate 的number_of_stages 次方。
-maxfalsealarm<max_false_alarm_rate>
沒有階段分類器的最大錯誤報警率。總的錯誤警告率爲max_false_alarm_rate 的
number_of_stages 次方。
-weighttrimming<weight_trimming>
指定是否使用權修正和使用多大的權修正。一個基本的選擇是0.9
-eqw
-mode<basic(default)|core|all>
選擇用來訓練的haar 特徵集的種類。basic 僅僅使用垂直特徵。all 使用垂直和45 度角旋轉特徵。


-w《sample_width》
-h《sample_height》
訓練樣本的尺寸,(以像素爲單位)。必須和訓練樣本創建的尺寸相同


然後,同樣在dos命令行輸入harr這個函數的命令


具體如圖:








然後,按回車,會出現“成果”界面
如果出現:訓練停留在一個分類器長達幾小時沒有相應,問題出現在取負樣本的那個函數 icvGetHaarTrainingDataFromBG中(另見我的博客http://blog.sina.com.cn/s/blog_75e063c10100za53.html中對於icvGetHaarTrainingDataFromBG的分析);只有當之前的強分類器對負樣本集內的樣本全部分類正確時纔會出現死循環,因爲只要有一個樣本會被錯分爲正樣本,那麼通過count次掃描整個負樣本集就能得到count個負樣本,當然這count個負樣本實際上就是一個負樣本的count個拷貝。爲避免這種情況,負樣本集中的樣本數需要足夠多 。
不過此時的分類器已經完全額、可以使用,因爲它的誤檢率已經很低,從實用性上時沒有任何問題的。所以我們可以通過設置-nstages 這個參數來限制分類器級數,適當時候停止並生成xml文件。






附:需要樣例人臉和非人臉的,可以上csdn上下載。地址:http://download.csdn.net/detail/rxm24217/4221235


到目前爲止,你自己需要的分類器的xml文檔就生成了,你自個找下當前那個目錄,會發現,多了幾個文件夾,請看圖:








到目前爲止,就告一段落了!


(這裏就只有幾個圖片,所以,很快訓練完,不過,要想訓練出檢測率高的xml,圖片的張數的很多,那時候,會訓練幾個小時到1天,時間幾天的時間,那時候,你只求你的電腦不要斷電!)
 
 
 
那麼我該用什麼辦法檢驗我訓練出的分類器的各項性能呢?
回答:要用opencv_performance.exe


先得到test sample:
 
用命令: opencv_createsamples.exe -info test1.dat -img face7.jpg -bg C:/TDDOWNLOAD/car_pic/bg.txt -num 35
 
-info 後面是生成的dat 文件, 
-img 是人臉圖片
-bg 背景圖片
-num 生成的sample數量
 
 
測試命令:
opencv_performance.exe -data haarcascade_frontalface_alt2.xml -info test1.dat -ni
 
-data 參數接要測試的xml文檔
-info 是生成的sample
 
發佈了19 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章