自己制作人臉識(shí)別的分類器

在學(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)練好的分類器绞绒。

image.png

網(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

替換掉目錄中的路徑名,只保留文件名:


image.png

注意:負(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)替換得到的:

其指令如下:


image.png

此時(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é)果圖:

image.png

注意:由于是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文件即可

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末软啼,一起剝皮案震驚了整個(gè)濱河市桑谍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖公黑,帶你破解...
    沈念sama閱讀 211,123評(píng)論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異番刊,居然都是意外死亡含鳞,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評(píng)論 2 384
  • 文/潘曉璐 我一進(jìn)店門芹务,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蝉绷,“玉大人鸭廷,你說我怎么就攤上這事∪勐穑” “怎么了辆床?”我有些...
    開封第一講書人閱讀 156,723評(píng)論 0 345
  • 文/不壞的土叔 我叫張陵,是天一觀的道長桅狠。 經(jīng)常有香客問我讼载,道長,這世上最難降的妖魔是什么中跌? 我笑而不...
    開封第一講書人閱讀 56,357評(píng)論 1 283
  • 正文 為了忘掉前任咨堤,我火速辦了婚禮,結(jié)果婚禮上漩符,老公的妹妹穿的比我還像新娘一喘。我一直安慰自己,他們只是感情好嗜暴,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,412評(píng)論 5 384
  • 文/花漫 我一把揭開白布凸克。 她就那樣靜靜地躺著,像睡著了一般闷沥。 火紅的嫁衣襯著肌膚如雪萎战。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評(píng)論 1 289
  • 那天舆逃,我揣著相機(jī)與錄音蚂维,去河邊找鬼。 笑死颖侄,一個(gè)胖子當(dāng)著我的面吹牛鸟雏,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播览祖,決...
    沈念sama閱讀 38,904評(píng)論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼孝鹊,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了展蒂?” 一聲冷哼從身側(cè)響起又活,我...
    開封第一講書人閱讀 37,672評(píng)論 0 266
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎锰悼,沒想到半個(gè)月后柳骄,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,118評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡箕般,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,456評(píng)論 2 325
  • 正文 我和宋清朗相戀三年耐薯,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,599評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡曲初,死狀恐怖体谒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情臼婆,我是刑警寧澤抒痒,帶...
    沈念sama閱讀 34,264評(píng)論 4 328
  • 正文 年R本政府宣布,位于F島的核電站颁褂,受9級(jí)特大地震影響故响,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜颁独,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,857評(píng)論 3 312
  • 文/蒙蒙 一彩届、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奖唯,春花似錦惨缆、人聲如沸糜值。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽寂汇。三九已至病往,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間骄瓣,已是汗流浹背停巷。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評(píng)論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留榕栏,地道東北人畔勤。 一個(gè)月前我還...
    沈念sama閱讀 46,286評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像扒磁,于是被迫代替她去往敵國和親庆揪。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,465評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容