在學(xué)習(xí)人臉識(shí)別的時(shí)候,我們常用到各種分類器,如haarcascade_frontalface_default.xml霎褐。但是我們會(huì)疑惑,這個(gè)分類器是從哪里來的侦香,為此我寫了這篇文章解答各位的疑惑。
首先我們要安裝OpenCV,官網(wǎng)地址為https://opencv.org/袱吆。我們可以安裝在任意位置,在opencv\build\etc\haarcascades目錄下距淫,我們可以看到有很多OpenCV已經(jīng)訓(xùn)練好的分類器绞绒。
網(wǎng)上在其他地方下載的分類器的文件,和這里并沒有什么區(qū)別榕暇。在這里蓬衡,我并不想使用別人訓(xùn)練好的分類器喻杈,我想自己動(dòng)手制作一個(gè)。
在官方教程中的描述如下狰晚,http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/user_guide/ug_traincascade.html
我們可以知道筒饰,OpenCV有兩個(gè)程序可以訓(xùn)練級(jí)聯(lián)分類器: opencv_haartraining 和
opencv_traincascade。這二者主要的區(qū)別是opencv_traincascade 支持 Haar 和
LBP(Local Binary Patterns) 兩種特征壁晒,并易于增加其他的特征瓷们。與Haar特征相比,
LBP特征是整數(shù)特征秒咐,因此訓(xùn)練和檢測(cè)過程都會(huì)比Haar特征快幾倍换棚。LBP和Haar特征
用于檢測(cè)的準(zhǔn)確率,是依賴訓(xùn)練過程中的訓(xùn)練數(shù)據(jù)的質(zhì)量和訓(xùn)練參數(shù)反镇。訓(xùn)練一個(gè)與基
于Haar特征同樣準(zhǔn)確度的LBP的分類器是可能的固蚤。
opencv_traincascade and opencv_haartraining 所輸出的分類器文件格式并不相同。
注意歹茶,新的級(jí)聯(lián)檢測(cè)接口(參考 objdetect 模塊中的 CascadeClassifier 類)支持這兩
種格式夕玩。 opencv_traincascade 可以舊格式導(dǎo)出選練好的級(jí)聯(lián)分類器。但是在訓(xùn)練過
程被中斷后再重啟訓(xùn)練過程惊豺, opencv_traincascade and opencv_haartraining 不能
裝載與中斷前不同的文件格式燎孟。
opencv_traincascade 程序使用TBB來處理多線程。如果希望使用多核并行運(yùn)算加
速尸昧,請(qǐng)使用TBB來編譯OpenCV揩页。
一般來說,正負(fù)樣本數(shù)目比例為1:3時(shí)訓(xùn)練結(jié)果較好烹俗,但是不是絕對(duì)爆侣。由于每個(gè)樣本的差異性不同等因素,所以沒有絕對(duì)的比例關(guān)系幢妄。但是負(fù)樣本需要比正樣本多兔仰,因?yàn)樵瓌t上說負(fù)樣本的多樣性越大越好,我們才能有效降低誤檢率蕉鸳,而不僅僅是通過正樣本的訓(xùn)練讓其能識(shí)別物體乎赴。在本次訓(xùn)練中,我選擇了63個(gè)正樣本和200個(gè)負(fù)樣本潮尝,均為灰度圖像榕吼。
進(jìn)入采取的樣本的目錄,輸入如下命令:
dir /b/s/p/w *.jpg > positives.txt
替換掉目錄中的路徑名,只保留文件名:
注意:負(fù)樣本的圖片大小可以不用進(jìn)行歸一化成統(tǒng)一大小,因?yàn)槠湓谟?xùn)練的時(shí)候可以進(jìn)行指定大小勉失,訓(xùn)練時(shí)會(huì)進(jìn)行圖像resize操作羹蚣。
接著就是正樣本的生成,其是比較重要的戴质。其中正樣本的樣本采集有兩種方法:
A度宦、只通過一張正樣本圖片踢匣,結(jié)合負(fù)樣本進(jìn)行其他正樣本的生成告匠。這種方法比較適合剛性的物體戈抄,即正樣本目標(biāo)不會(huì)變形,所以要對(duì)其進(jìn)行樣本采集比較困難后专,例如交通LOGO牌划鸽,無法對(duì)其進(jìn)行變形采用。這種情況可以通過圖像手段來對(duì)其進(jìn)行一些圖像預(yù)處理操作戚哎,從而產(chǎn)生樣本裸诽。其使用的指令是:
其要使用 【-img】參數(shù)來指明單張正樣本,其中的【num】是指通過這一張正樣本要生成的樣本數(shù)量型凳,其是通過負(fù)樣本結(jié)合來生成的丈冬,負(fù)樣本主要是給旋轉(zhuǎn)等操作后的正樣本提供背景。他會(huì)在生成樣本的同時(shí)直接生成vec文件甘畅。
注意:其中更好的生成樣本的工具代碼是:opencv-haar-classifier-training 其使用腳本來調(diào)用opencv_createsamples.exe進(jìn)行樣本的生成埂蕊,而且也可以順路生成vec文件,真的超方便疏唾。
B蓄氧、通過人為采集所有訓(xùn)練樣本。其中正樣本的txt文件格式如下,其中文件路徑后面的格式是在指令生成后自己手動(dòng)替換得到的:
其指令如下:
此時(shí)提供的是包含所有的正樣本路徑的txt文件槐脏,其生成可以參考上面的方法喉童。此時(shí)這里設(shè)置的x、y顿天、z三軸旋角等一些數(shù)據(jù)增城的參數(shù)是不會(huì)被采用的堂氯,其只有上面A單張樣本是才使用這些參數(shù)。其中的【-num】的只要小于或等于正樣本的指牌废,否則會(huì)報(bào)錯(cuò)祖灰。
注意:這是把所有目標(biāo)都裁剪下來的處理方式,而且需要進(jìn)行樣本歸一化畔规。還有一種就是使用工具在整張圖片上進(jìn)行正樣本標(biāo)注局扶,其可以使用ObjectMarker工具。具體過程參考博客:基于級(jí)聯(lián)分類器的多目標(biāo)檢測(cè)
3叁扫、級(jí)聯(lián)分類器的訓(xùn)練:
但樣本都準(zhǔn)備好后三妈,其訓(xùn)練指令為:
opencv_traincascade -data classifier -vec pos.vec -bg negatives.txt -numStages 20 -minHitRate 0.999 -maxFalseAlarmRate 0.5 -numPos 14000 -numNeg 10000 -w 20 -h 20 -mode ALL -precalcValBufSize 1024 -precalcIdxBufSize 1024 -featureType LBP
pause
通用參數(shù):
-data <cascade_dir_name>
目錄名,如不存在訓(xùn)練程序會(huì)創(chuàng)建它莫绣,用于存放訓(xùn)練好的分類器畴蒲。
-vec <vec_file_name>
包含正樣本的vec文件名(由 opencv_createsamples 程序生成)。
-bg <background_file_name>
背景描述文件对室,也就是包含負(fù)樣本文件名的那個(gè)描述文件模燥。
-numPos <number_of_positive_samples>
每級(jí)分類器訓(xùn)練時(shí)所用的正樣本數(shù)目咖祭。其指設(shè)置為正樣本數(shù)量的85%(這是一個(gè)保守值)。具體的也要根據(jù)級(jí)聯(lián)器的層數(shù)來決定的蔫骂。因?yàn)槊總€(gè)stages都是會(huì)增加圖片數(shù)量來進(jìn)行分類么翰。
-numNeg <number_of_negative_samples>
每級(jí)分類器訓(xùn)練時(shí)所用的負(fù)樣本數(shù)目,可以大于 -bg 指定的圖片數(shù)目辽旋。
-numStages <number_of_stages>
訓(xùn)練的分類器的級(jí)數(shù)浩嫌。
-precalcValBufSize <precalculated_vals_buffer_size_in_Mb>
緩存大小,用于存儲(chǔ)預(yù)先計(jì)算的特征值(feature values)补胚,單位為MB码耐。
-precalcIdxBufSize <precalculated_idxs_buffer_size_in_Mb>
緩存大小,用于存儲(chǔ)預(yù)先計(jì)算的特征索引(feature indices)溶其,單位為MB骚腥。內(nèi)存越大纫塌,訓(xùn)練時(shí)間越短坎拐。
-baseFormatSave
這個(gè)參數(shù)僅在使用Haar特征時(shí)有效。如果指定這個(gè)參數(shù)偶摔,那么級(jí)聯(lián)分類器將以老的格式存儲(chǔ)金闽。
級(jí)聯(lián)參數(shù):
-stageType <BOOST(default)>
級(jí)別(stage)參數(shù)纯露。目前只支持將BOOST分類器作為級(jí)別的類型。
-featureType<{HAAR(default), LBP}>
特征的類型: HAAR - 類Haar特征代芜; LBP - 局部紋理模式特征埠褪。
-w <sampleWidth>
-h <sampleHeight>
訓(xùn)練樣本的尺寸(單位為像素)。必須跟訓(xùn)練樣本創(chuàng)建(使用 opencv_createsamples 程序創(chuàng)建)時(shí)的尺寸保持一致挤庇。
Boosted分類器參數(shù):
-bt <{DAB, RAB, LB, GAB(default)}>
Boosted分類器的類型: DAB - Discrete AdaBoost, RAB - Real AdaBoost, LB - LogitBoost, GAB - Gentle AdaBoost钞速。
-minHitRate <min_hit_rate>
分類器的每一級(jí)希望得到的最小檢測(cè)率〉诊酰總的檢測(cè)率大約為 min_hit_rate^number_of_stages渴语。總檢測(cè)率即為整個(gè)級(jí)聯(lián)器的檢測(cè)召回率昆咽,
-maxFalseAlarmRate <max_false_alarm_rate>
分類器的每一級(jí)希望得到的最大誤檢率驾凶。總的誤檢率大約為 max_false_alarm_rate^number_of_stages. 為整個(gè)級(jí)聯(lián)器的誤檢率
-weightTrimRate <weight_trim_rate>
Specifies whether trimming should be used and its weight. 一個(gè)還不錯(cuò)的數(shù)值是0.95掷酗。
-maxDepth <max_depth_of_weak_tree>
弱分類器樹最大的深度调违。一個(gè)還不錯(cuò)的數(shù)值是1,是二叉樹(stumps)泻轰。
-maxWeakCount <max_weak_tree_count>
每一級(jí)中的弱分類器的最大數(shù)目技肩。The boosted classifier (stage) will have so many weak trees (<=maxWeakCount), as needed to achieve the given -maxFalseAlarmRate.
類Haar特征參數(shù):
-mode <BASIC (default) | CORE | ALL>
選擇訓(xùn)練過程中使用的Haar特征的類型。 BASIC 只使用右上特征浮声, ALL 使用所有右上特征和45度旋轉(zhuǎn)特征虚婿。
此時(shí)訓(xùn)練的結(jié)果圖:
注意:由于是20stages旋奢,所以訓(xùn)練時(shí)間要三四個(gè)鐘,其中采用LBP特征會(huì)比Haar特征快十幾倍的訓(xùn)練速度然痊。還有如果想把檢測(cè)準(zhǔn)確度提高很高至朗,則需要大量的樣本和好的圖像質(zhì)量。
4玷过、中斷后爽丹,如果不行在繼續(xù)訓(xùn)練筑煮,如何通過先前的中間文件來生產(chǎn)分類器文件cascade.xml辛蚊?
方法:此時(shí)需要修改訓(xùn)練指令的【-numStages】將其設(shè)置成已有的states的層數(shù),則其則會(huì)生成上面的檢測(cè)文件xml真仲。至此已經(jīng)訓(xùn)練完成袋马,并得到cascade.xml檢測(cè)文件,接下來就是如何使用這個(gè)文件用于人臉檢測(cè)秸应,其方法是使用opencv3書里提供的人臉檢測(cè)例子虑凛,只要替換相應(yīng)的xml文件即可