浅析haartraining方法进行人脸检测
上個(gè)月用了兩周的時(shí)間,學(xué)習(xí)了用于人臉檢測的haartraining算法,今天打算做一總結(jié)
首先先為和我一樣的初學(xué)者推薦幾篇博客
http://blog.csdn.net/zouxy09/article/details/7922923真的很感謝寫這篇文章的博主,講解深入淺出。本文中的主要邏輯也都是由他的文章啟發(fā)而來,有部分引用的內(nèi)容,這里提前聲明。
http://blog.sina.com.cn/s/blog_5f853eb10100sdgn.html?這篇文章是AdaBoost算法的代碼實(shí)現(xiàn),注釋實(shí)在是詳細(xì)!贊
http://www.cnblogs.com/tornadomeet/archive/2012/03/28/2420936.html?這篇文章非常明白的講解了如何利用opencv提供的可執(zhí)行文件一步步嘗試進(jìn)行人臉識別
開始進(jìn)入正題
haartraining方法是基于Haar特征和AdaBoost算法以及級聯(lián)思想的
那么首先,特征是什么?
假設(shè)在人臉檢測時(shí)我們需要有這么一個(gè)子窗口在待檢測的圖片窗口中不斷的移位滑動,子窗口每到一個(gè)位置,就會計(jì)算出該區(qū)域的特征,這個(gè)能夠按照我們規(guī)定的方式計(jì)算出某個(gè)區(qū)域的特征值的子窗口就是特征
那么haar特征又是什么
haar特征是由Viola、Lienhart等人提出的,原理并沒有不同,這里不多贅述
大家可以參考我之前總結(jié)的人臉識別嘗試(二)——Haar特征 ?總結(jié)的還是挺用心的,希望大家多支持
?http://blog.csdn.net/u011583927/article/details/44782197
總之,一個(gè)Haar特征的數(shù)據(jù)結(jié)構(gòu)應(yīng)該包含以下內(nèi)容:?
*haar特征模板類型
*是否有旋轉(zhuǎn)
*矩陣位置及大小
知道了Haar特性是什么,我們來聊聊AdaBoost算法
AdaBoost是一種具有一般性的分類器提升算法,既然是提升,那么一定是從弱分類器到強(qiáng)分類器的一個(gè)過程
先說弱分類器是怎樣產(chǎn)生的
在這之前,我先引出一個(gè)最差的分類器,暫且叫它“糟糕分類器”
對于一個(gè)待檢測的圖片,選出任意一種Haar特征,就可以計(jì)算得到一個(gè)特征值
如果我們定義一個(gè)閾值,那么將計(jì)算的特征值與這個(gè)閾值進(jìn)行比較,就能做出一個(gè)最低級的決策
我將這整個(gè)的過程稱為一個(gè)“糟糕分類器”(實(shí)際上并沒有這個(gè)稱呼,只是我個(gè)人這樣理解)用下圖表示
顯然僅僅憑借這樣粗糙的方式不可能判別一副圖片是否為人臉,因?yàn)樗男Ч_實(shí)太糟糕了。我們應(yīng)用多個(gè)這樣的糟糕分類器進(jìn)行級聯(lián),如下圖所示
? 一個(gè)弱分類器就是一個(gè)基本和上圖類似的決策樹,最基本的弱分類器只包含一個(gè)Haar-like特征,也就是它的決策樹只有一層,被稱為樹樁(stump)。注意:這里這樣的結(jié)構(gòu)還不能稱之為弱分類器,因?yàn)槲覀兊拈撝的壳盀橹惯€是未知,也可以理解為隨意選取的,這樣當(dāng)然不行。
? 對于這樣一個(gè)弱分類器(或者說是二叉決策樹)最重要的就是如何決定每個(gè)結(jié)點(diǎn)判斷的輸出,要比較輸入圖片的特征值和弱分類器中閾值。也就是要尋找合適的分類器閾值,使該分類器對所有樣本的判讀誤差最低。尋找最優(yōu)閾值的過程也就是我們進(jìn)行樣本訓(xùn)練的過程,訓(xùn)練后二叉決策樹就是一個(gè)弱分類器。
? 那么如何尋找最優(yōu)閾值呢?對于某一種特征,我們可以將輸入樣本(既有正樣本又有負(fù)樣本)分別計(jì)算對應(yīng)的特征值并按升序排序成一個(gè)隊(duì)列Seq。那么我們將閾值取遍隊(duì)列中每一個(gè)特征值,對于每次循環(huán),計(jì)算分錯(cuò)樣本的加權(quán)平均和,并記錄。遍歷完成后分錯(cuò)樣本的加權(quán)最小的那個(gè)位置對應(yīng)的特征值就是最優(yōu)閾值。然后我們要根據(jù)這次閾值的選取,將錯(cuò)分的樣本適當(dāng)?shù)脑黾訖?quán)重,選取另一個(gè)Haar特征,重復(fù)上面的過程。直至訓(xùn)練出要求的個(gè)數(shù)個(gè)“糟糕分類器”級聯(lián)起來組成一個(gè)弱分類器。
? 現(xiàn)在我們已經(jīng)能夠得到弱分類器了。它的數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct CvCARTHaarClassifier {CV_INT_HAAR_CLASSIFIER_FIELDS()int count;int* compidx;CvTHaarFeature* feature;CvFastHaarFeature* fastfeature;float* threshold;int* left;int* right;float* val; } CvCARTHaarClassifier;
??
? 那么由以上討論,假設(shè)我們由第一組樣本已經(jīng)訓(xùn)練出了一個(gè)弱分類器。顯然我們可以找出這個(gè)分類器錯(cuò)分的樣本出來,與一些新樣本組成第二組樣本,由這組樣本訓(xùn)練出第二個(gè)弱分類器。重復(fù)這個(gè)過程,可以得到T個(gè)弱分類器。我們組合這T個(gè)弱分類器成為一個(gè)強(qiáng)分類器CvStageHaarClassifier。我們先這樣理解,讓這些最優(yōu)弱分類器根據(jù)自己的地位進(jìn)行表決(判別的正確率決定其地位),決定當(dāng)前判斷的子窗口是否為人臉。這樣一個(gè)表決過程就代表了強(qiáng)分類器。然后我們可以訓(xùn)練多個(gè)強(qiáng)分類器,讓他們強(qiáng)強(qiáng)聯(lián)手。還是構(gòu)造一顆二叉決策樹,樹的每個(gè)節(jié)點(diǎn)是一個(gè)強(qiáng)分類器
強(qiáng)分類器的數(shù)據(jù)結(jié)構(gòu)如下:
/* internal stage classifier */ typedef struct CvStageHaarClassifier {CV_INT_HAAR_CLASSIFIER_FIELDS()int count;float threshold;CvIntHaarClassifier** classifier; } CvStageHaarClassifier;
強(qiáng)強(qiáng)聯(lián)手后就得到的最終的分類器,最終的分類器就如下圖一樣進(jìn)行判決得出結(jié)論
最終的Haar分類器為CvTreeCascadeClassifier,它代表一顆樹,樹中的每一個(gè)節(jié)點(diǎn)的核心功能就是一個(gè)強(qiáng)分類器,數(shù)據(jù)結(jié)構(gòu)如下:
typedef struct CvTreeCascadeClassifier {CV_INT_HAAR_CLASSIFIER_FIELDS()CvTreeCascadeNode* root; /* root of the tree */CvTreeCascadeNode* root_eval; /* root node for the filtering */int next_idx; } CvTreeCascadeClassifier;/* internal tree cascade classifier node */ typedef struct CvTreeCascadeNode {CvStageHaarClassifier* stage;struct CvTreeCascadeNode* next;struct CvTreeCascadeNode* child;struct CvTreeCascadeNode* parent;struct CvTreeCascadeNode* next_same_level;struct CvTreeCascadeNode* child_eval;int idx;int leaf; } CvTreeCascadeNode;
到這里,haartraining的主要思想就都說清楚了
最后,我們總結(jié)一下上面的內(nèi)容得出這樣的結(jié)論:
一組學(xué)習(xí)樣本可以通過訓(xùn)練得到一個(gè)弱分類器。
弱分類器就是一顆決策樹,決策樹的每個(gè)結(jié)點(diǎn)存儲的是一種haar特征和對應(yīng)的最優(yōu)閾值
多個(gè)弱分類器可以構(gòu)成一個(gè)強(qiáng)分類器
Haar分類器就是一顆結(jié)點(diǎn)是強(qiáng)分類器的決策樹
畢竟水平有限,希望大家看了這篇文章能夠多多指正,也希望小白能從中學(xué)到一點(diǎn)東西。
大家一起分享,才能一起變得強(qiáng)大~
總結(jié)
以上是生活随笔為你收集整理的浅析haartraining方法进行人脸检测的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: CNG 关于 Key 相关的操作
- 下一篇: 数据增强 transform_深度学习-