Haar Feature-based Cascade Classifiers

Jeremy Pai
Life’s a Struggle
7 min readMar 26, 2021
等等拿來作人臉偵測的影像,Image by Free-Photos from Pixabay

此方法出自於 Rapid Object Detection using a Boosted Cascade of Simple Features 這篇 2001 年的 Paper [1],是一種基於機器學習產生的物體偵測技術。本篇只會簡單說明 Haar feature-based cascade classifiers 的流程,主要是學習使用 OpenCV 內建的函式做人臉偵測。

Algorithm

首先透過 Haar features 的 kernel 計算取得特徵再送到後面的 Cascade classifiers 作處理,最終會輸出該區域是否含有目標物的結果。最早的 Paper 是簡單地透過底下的 kernel 計算抽取特徵 (Haar features)。

Resource: OpenCV - Cascade Classifier [3]

後來經過一系列的演進才變成底下更完善的 kernel [2]

Resource: An Extended Set of Haar-like Features for Rapid Object Detection [2]

補充一下,原文有為了加速運算而引入 Integral Image 的想法 (詳細請看 [1])

不過這些 kernel 會抽取到大量的特徵。如同 [1] 提供的例子,眼睛相對於周圍是屬於較暗的區域,所以特徵就會被底下這 2 個 kernel 抽取。但是這 2 個 kernel 在其他地方卻找不到其他有用的特徵,而因此產生沒用的 Harr features。

Resource: Rapid Object Detection using a Boosted Cascade of Simple Features [1]

根據 [1] 的結果,24 x 24 的 kernel 會產生 160000+ 個特徵,那我們該怎麼去篩選這些特徵呢?

他們採用 AdaBoost 的想法,每個特徵都先對所有影像分類一次,再從中挑選錯誤率最小的特徵當作第一個弱分類器 (弱分類器:單獨這個分類器沒有辦法得到很好的分類結果)。接著將分類錯誤的影像權重調高,使這些影像在下一個特徵比較有機會得到正確的分類結果。

之後就都一樣將分類錯誤的影像權重調高...直到這些弱分類器合併在一起生成的分類器能夠達到足夠好的分類結果。經過前面的過程,大約從 160000+ 個特徵篩選到剩 6000 個特徵。

但是 6000 個特徵要一個一個去檢查也是很浪費計算資源,因此作者設計了 Cascade Classifier 的概念。作法就是將特徵切成好幾個階段,每一個階段只用少量的特徵去作檢查看有沒有目標物的存在,如果沒有的話就不會繼續檢查下去,有的話才會繼續用其他的特徵檢查 。Paper 是分成 38 個階段,前 5 個階段分別用 1、10、25、25 與 50 個特徵去做檢查。

透過 Cascade Classifier 的方式,就能更進一步提升計算速度。

Code

繁瑣的部分說完惹,現在直接上 code

OpenCV repository

首先在 OpenCV 的 GitHub 中下載 “haarcascade_frontalface_default.xml” ,這是預先訓練好的人臉偵測 model,能直接省去標註的麻煩。(在這個 repository 也有很多其他預先訓練好的檔案可供使用,例如微笑偵測、全身偵測與貓臉偵測)

Haar Feature-based Cascade Classifiers

先將要做人臉偵測的影像讀取進來並且轉換成灰階影像,這是因為 Haar feature-based cascade classifiers 只能操作在灰階影像。

再來就是將預先訓練好的 Haar feature-based cascade classifiers (也就是剛剛下載的檔案) 裝進 cv2.CascadeClassifier,最後就會以 4-tuple 的形式回傳人臉的位子 ( x 座標, y 座標, 寬度, 高度)。

detectMultiScale 的參數可以參考 OpenCV 的解釋。如果發現找不到人臉的位置或是圈選一些奇怪位置的話也不需太灰心,可能是要調參的關係,經驗上主要是調整 scaleFactor 與 minNeighbors。

scaleFactor 代表影像要以多少的比例縮小,是來自 Image Pyramids 的概念。如果 scaleFactor 越小,就會產生越多 scale 的影像,搜索會較為費時但成效較好 (但有時也會產生 False Positive 的結果);如果 scaleFactor 越大,就會產生越少 scale 的影像,成效較差但搜索會較快。

minNeighbors 這個參數我不太確定,應該是代表在同一個區域如果有超過 minNeighbors 數量的區域才認定有目標物存在,因此這個參數也能夠降低 False Positive 的發生(就是明明沒有目標物卻被誤認為有)。

最後將搜尋到的區塊畫在影像上,就會得到以下結果,算是滿不錯的。

6 個人中有 5 個人確實捕捉到人臉,只有 1 個背向鏡頭的女孩沒有,不過這個預先訓練好的 model 確實只針對正面的臉做訓練,因此沒有捕捉到也很合理

Haar feature-based cascade classifiers 可以偵測任意目標物,並不只侷限在 OpenCV repository 當中的類別。此算法最大的優點是 Real-time 的!因此可以運作在像 Raspberry Pi 這樣有限運算資源的平台上。不過缺點是時常會偵測錯誤…

[後記]:本篇是運用 OpenCV 預先訓練好的 model 作人臉偵測,當然也可以自己訓練一個。有興趣可以參考這位大神的文章 — Opencv Cascade Object Detection [4] 或是 OpenCV 官網的教學 — Cascade Classifier Training

總而言之,此方法以現在的技術來說並不是最優選擇,只能說是一項時代的眼淚吧...

Resource

[1] Paul Viola and Michael Jones, “Rapid Object Detection using a Boosted Cascade of Simple Features.”, Proceedings of the 2001 IEEE computer society conference on computer vision and pattern recognition. CVPR 2001. Vol. 1. IEEE, 2001

[2] Rainer Lienhart and Jochen Maydt, “An Extended Set of Haar-like Features for Rapid Object Detection.”, Proceedings. international conference on image processing. Vol. 1. IEEE, 2002

[3] OpenCV — Cascade Classifier

[4] CH.Tseng — Opencv Cascade Object Detection

--

--

Jeremy Pai
Life’s a Struggle

機器視覺演算法工程師~不限主題隨心寫下自己想寫的事物