haar分類器是乙個基於樹的分類器,它建立了boost篩選式級聯分類器。可以使用opencv中的「人臉」檢測器來檢測「基本剛性的」物體(臉,汽車,自行車,人體)。通過成千上萬的物體各個角度的訓練影象,訓練出新的分類器、這個技術被用來設計目前最優的檢測演算法。因此,對於此類識別的任務,haar分類器是乙個有用的工具。
opencv稱這個檢測器為「haar分類器」是因為它使用haar特徵或更準確的描述是類haar的小波特徵,該特徵由矩形影象區域的加減組成。opencv包含一系列的預先訓練好的物體識別檔案,但也允許使用**訓練兵儲存新的物體模型。除了人臉外,訓練方法createsamples()和haartraining()和識別方法cvhaardetectobject()可以用於具有紋理的近似剛性的任何物體。
viola-jones識別器使用adaboost,但是把它組織為篩選式的級聯分類器,每個結點是多個樹構成的分類器,且每個結點的正確識別率很高,但是正確拒絕率很低。如果一旦獲得目標不在類別中的結論,則計算終止,演算法也宣布該位置上沒有人臉。因此,只有通過分類器中的所有級別,才會認為物體被檢測到。這樣的有點是當目標出現頻率較低的時候,例如一幅大圖中只有一幅小人臉的時候,篩選式的級聯分類器可以顯著地降低計算量,因為大部分被檢測的區域都可以很早的被篩選掉,迅速判斷出此處無人臉。
viola-jones的篩選式級分類器中,弱分類器是乙個多數情況下只有一層的決策樹,例如決策stump。一層決策樹允許下面形式的決策,判斷特徵f的值v大於某個閾值t。yes表示可能是人臉,no則表示不是人臉。
該演算法把每個boosting分類器組合成篩選式級聯的乙個結點。如下圖:
每個結點的boosting使結點具有高通過率。例如,在檢測人臉的時候,幾乎所有的人臉99.9%都被檢測出並允許通過,但是50%的非人臉也得以通過。這沒有關係,因為20個節點使總識別庫為0.99920≈98%,而錯誤接受率僅為0.520≈0.0001%
對正確分類的樣本降低權重,對錯誤分類的樣本增大權重,有時候這會令人困惑。其中原因是boosting希望更加關注無法分類的樣本,忽略已經指導如何分類的樣本,boosting最大化間距。
識別時,原始影象的不同區域都會被掃瞄。70%~80%的非人臉區域在篩選式級聯的前兩個結點被拒絕,每個結點使用大約10個決策樹,這種快速的早期拒絕提高了人臉檢測的速度。
此方法不限於人臉檢測,它適用於其他表面有區別的剛性物體的檢測。正面人臉,車的前部,側部和後部都可以用它來檢測,但如果是人的側臉和車的斜視角,則效果不好,主要是因為這些視角在模板中有很多變化,而塊特徵無法很好地處理這種變化。例如,為了讓模型學習側臉的曲線,側臉邊緣外的背景也會被當做有用資訊進行學習。
haar-like特徵
假設在人臉檢測時我們需要有這麼乙個子視窗在待檢測的視窗中不斷的移位滑動,子視窗每到乙個位置,就會計算出該區域的特徵,然後用我們訓練好的級聯分類器對該特徵進行篩選,一旦該特徵通過了所有強分類器的篩選,則判定該區域為人臉。
下面是viola牛們提出的haar-like特徵。
下面是lienhart等牛們提出的haar-like特徵。
這些所謂的特徵不就是一堆堆帶條紋的矩形麼,到底是幹什麼用的?將上面的任意乙個矩形放到人臉區域上,然後,將白色區域的畫素和減去黑色區域的畫素和,得到的值我們暫且稱之為人臉特徵值,如果你把這個矩形放到乙個非人臉區域,那麼計算出的特徵值應該和人臉特徵值是不一樣的,而且越不一樣越好,所以這些方塊的目的就是把人臉特徵量化,以區分人臉和非人臉。
為了增加區分度,可以對多個矩形特徵計算得到乙個區分度更大的特徵值,那麼什麼樣的矩形特徵怎麼樣的組合到一塊可以更好的區分出人臉和非人臉呢,這就是adaboost演算法要做的事了。
opencv測試源**:
void detectanddraw( mat& img, cascadeclassifier& cascade,
cascadeclassifier& nestedcascade,
double scale, bool tryflip )
; //建立縮小的,加快檢測速度
//nt cvround (double value) 對乙個double型的數進行四捨五入,並返回乙個整型數!
mat gray, smallimg( cvround (img.rows/scale), cvround(img.cols/scale), cv_8uc1 );
//轉成灰度影象,harr特徵基於灰度圖
cvtcolor( img, gray, cv_bgr2gray );
//改變影象大小,使用雙線性差值
resize( gray, smallimg, smallimg.size(), 0, 0, inter_linear );
//變換後的影象進行直方圖均值化處理
equalizehist( smallimg, smallimg );
//程式開始和結束插入此函式獲取時間,經過計算求得演算法執行時間
t = (double)cvgettickcount();
//檢測人臉
//detectmultiscale函式中smallimg表示的是要檢測的輸入影象為smallimg,faces表示檢測到的人臉目標序列,1.1表示
//每次影象尺寸減小的比例為1.1,2表示每乙個目標至少要被檢測到3次才算是真的目標(因為周圍的畫素和不同的視窗大
//小都可以檢測到人臉),cv_haar_scale_image表示不是縮放分類器來檢測,而是縮放影象,size(30, 30)為目標的
//最小最大尺寸
cascade.detectmultiscale( smallimg, faces,
1.1, 3, 0
//|cv_haar_find_biggest_object
//|cv_haar_do_rough_search
|cv_haar_scale_image
,size(30, 30));
//如果使能,翻轉影象繼續檢測
if( tryflip )
}t = (double)cvgettickcount() - t;
// qdebug( "detection time = %g ms\n", t/((double)cvgettickfrequency()*1000.) );
for( vector::const_iterator r = faces.begin(); r != faces.end(); r++, i++ )
else
rectangle( img, cvpoint(cvround(r->x*scale), cvround(r->y*scale)),
cvpoint(cvround((r->x + r->width-1)*scale), cvround((r->y + r->height-1)*scale)),
color, 3, 8, 0);
if( nestedcascade.empty() )
continue;
smallimgroi = smallimg(*r);
//同樣方法檢測人眼
nestedcascade.detectmultiscale( smallimgroi, nestedobjects,
1.1, 2, 0
//|cv_haar_find_biggest_object
//|cv_haar_do_rough_search
//|cv_haar_do_canny_pruning
|cv_haar_scale_image
,size(30, 30) );
for( vector::const_iterator nr = nestedobjects.begin(); nr != nestedobjects.end(); nr++ )
}cv::imshow( "result", img );
}在實際應用中,還需要對有旋轉角度的人臉進行旋轉校正,才能檢測出正確的人臉。否則,上面的**只能檢測正面,筆直的人臉。
機器學習 人臉檢測和Haar分類器
haar分類器是乙個基於樹的分類器,它建立了boost篩選式級聯分類器。可以使用opencv中的 人臉 檢測器來檢測 基本剛性的 物體 臉,汽車,自行車,人體 通過成千上萬的物體各個角度的訓練影象,訓練出新的分類器 這個技術被用來設計目前最優的檢測演算法。因此,對於此類識別的任務,haar分類器是乙...
使用 Haar 級聯人臉檢測
haar 級聯概念 在進行影象分類和跟蹤過程中,提取影象的細節很有用,這些細節也被稱為特徵,對於給定的影象,特徵可能會因區域的大小而有所不同,區域大小也可被稱為視窗大小。即使視窗大小不同,僅在尺度上大小不同的影象也應該有相似的特徵。這種特徵集合被稱為級聯。haar 級聯具有尺度不變性。opencv ...
Python應用一 haar人臉檢測
使用國內源來安裝速度更快,參考教程 知乎教程安裝完畢之後,先測試一下opencv是否可以使用,所以可以先輸入一些簡單的 來測試一下。import cv2 開啟專案資料夾下面的photo子資料夾下的檔案 img cv2.imread r photo lena.png cv2.imshow lena i...