![]() |
OpenCV 4.12.0
開源計算機視覺
|
| 原始作者 | Ana Huamán |
| 相容性 | OpenCV >= 3.0 |
在本教程中,
基於 Haar 特徵的級聯分類器進行物件檢測是由 Paul Viola 和 Michael Jones 在其 2001 年的論文《使用增強級聯簡單特徵的快速物件檢測》("Rapid Object Detection using a Boosted Cascade of Simple Features")中提出的一種有效的物件檢測方法。它是一種基於機器學習的方法,其中級聯函式透過大量正向影像和負向影像進行訓練。然後將其用於檢測其他影像中的物件。
這裡我們將進行人臉檢測。最初,該演算法需要大量正向影像(人臉影像)和負向影像(無人臉影像)來訓練分類器。然後我們需要從中提取特徵。為此,使用瞭如下圖所示的 Haar 特徵。它們就像我們的卷積核。每個特徵是一個透過從黑色矩形下畫素和中減去白色矩形下畫素和而獲得的單個值。
現在,每個核的所有可能尺寸和位置都被用來計算大量的特徵。(想象一下這需要多少計算量?即使一個 24x24 的視窗也會產生超過 160000 個特徵)。對於每個特徵計算,我們需要找到白色和黑色矩形下的畫素和。為了解決這個問題,他們引入了積分圖。無論你的影像有多大,它都能將給定畫素的計算簡化為僅涉及四個畫素的操作。很棒,不是嗎?它讓事情變得超快。
但在我們計算的所有這些特徵中,大多數都是不相關的。例如,考慮下圖。頂行顯示了兩個好的特徵。第一個選定的特徵似乎側重於眼睛區域通常比鼻子和臉頰區域更暗的特性。第二個選定的特徵依賴於眼睛比鼻樑更暗的特性。但同樣的視窗應用於臉頰或任何其他地方則是不相關的。那麼我們如何從 160000 多個特徵中選擇最好的特徵呢?這可以透過 Adaboost 實現。
為此,我們將每一個特徵應用於所有訓練影像。對於每個特徵,它會找到最佳閾值,將人臉分類為正向和負向。顯然,會存在錯誤或錯誤分類。我們選擇錯誤率最小的特徵,這意味著它們是最能準確分類人臉和非人臉影像的特徵。(這個過程不像這般簡單。開始時,每張影像都被賦予相同的權重。每次分類後,錯誤分類影像的權重會增加。然後重複相同的過程。計算新的錯誤率。同時計算新的權重。這個過程一直持續到達到所需的準確率或錯誤率,或者找到所需的特徵數量)。
最終的分類器是這些弱分類器的加權和。之所以稱之為弱分類器,是因為它單獨無法分類影像,但與其他分類器一起形成一個強分類器。論文指出,即使 200 個特徵也能提供 95% 準確率的檢測。他們的最終設定包含大約 6000 個特徵。(想象一下從 160000 多個特徵減少到 6000 個特徵。這是一個巨大的提升)。
現在你拿一張影像。取每一個 24x24 的視窗。對它應用 6000 個特徵。檢查它是否是人臉。哇……這難道不是有點低效和耗時嗎?是的,確實如此。作者對此有一個很好的解決方案。
在一張影像中,大部分割槽域是非人臉區域。因此,更好的方法是使用一種簡單的方法來檢查一個視窗是否是非人臉區域。如果不是,則立即將其丟棄,不再對其進行處理。相反,專注於可能存在人臉的區域。這樣,我們就可以花更多時間檢查可能的人臉區域。
為此,他們引入了級聯分類器的概念。特徵不是一次性將所有 6000 個特徵應用於一個視窗,而是被分組到不同的分類器階段並逐個應用。(通常前幾個階段會包含極少的特徵)。如果一個視窗在第一階段失敗,就丟棄它。我們不再考慮它上面的剩餘特徵。如果它透過,則應用第二階段的特徵並繼續這個過程。透過所有階段的視窗就是一個人臉區域。這個計劃如何!
作者的檢測器包含 6000 多個特徵,分為 38 個階段,前五個階段分別包含 1、10、25、25 和 50 個特徵。(上圖中所示的兩個特徵實際上是從 Adaboost 中獲得的最佳兩個特徵)。根據作者的說法,平均每個子視窗只評估 6000 多個特徵中的 10 個。
這就是 Viola-Jones 人臉檢測工作原理的簡單直觀解釋。有關更多詳細資訊,請閱讀該論文或查閱“附加資源”部分中的參考文獻。
OpenCV 提供了一種訓練方法(參見 級聯分類器訓練)或預訓練模型,可以使用 cv::CascadeClassifier::load 方法讀取。預訓練模型位於 OpenCV 安裝的 data 資料夾中,或可以在 這裡 找到。
以下程式碼示例將使用預訓練的 Haar 級聯模型來檢測影像中的人臉和眼睛。首先,建立一個 cv::CascadeClassifier 並使用 cv::CascadeClassifier::load 方法載入必要的 XML 檔案。之後,使用 cv::CascadeClassifier::detectMultiScale 方法完成檢測,該方法返回檢測到的人臉或眼睛的邊界矩形。
請確保程式能夠找到檔案 haarcascade_frontalface_alt.xml 和 haarcascade_eye_tree_eyeglasses.xml 的路徑。它們位於 opencv/data/haarcascades 中。