級聯分類器
這裡簡單的介紹一下級聯分類器的概念。
以人臉識別為例,為了提高人臉檢測的速度和精度,最終的分類器是通過幾個強分類器級聯得到,這就是所說的級聯分類器。在一個級聯分類系統中,對於每一個輸入圖片,順序通過每個強分類器,前面的強分類器相對簡單,其包含的弱分類器也相對較少,後面的強分類器逐級複雜,只有通過前面的強分類檢測後的圖片才能送入後面的強分類器檢測,比較靠前的幾級分類器可以過濾掉大部分的不合格圖片,只有通過了所有強分類器檢測的圖片區域才是有效人臉區域。
級聯分類訓練過程
1、 預先選定每一層的最大可接受誤檢率fpr(maximum acceptable rate of fpr) 和每一層最小可接受的檢測率(minimum acceptable detection rate)
2、 設定系統整體的可接受誤檢率
3、 初始化. FPR=1, TPR = 1(檢測率)
4、 循環. 如果當前
,添加一層adaboost分類器,如果該分類器訓練過程中沒有達到該層最大誤檢率就繼續添加新特徵,添加新特徵時降低閾值,使分類器的檢測率大於給定值,然後更新
5、 每一級分類器使用的訓練集是上一級分類器判定正確的樣本,而其中的錯分的被當作負樣本。這使得下一級的分類器更關注那些更難區分的樣本。
OPENCV
OpenCV是一個基於BSD許可(開源)發行的跨平臺計算機視覺庫,可以運行在Linux、Windows、Android和Mac OS操作系統上。它輕量級而且高效——由一系列 C 函數和少量 C++ 類構成,同時提供了Python、Ruby、MATLAB等語言的接口,實現了圖像處理和計算機視覺方面的很多通用算法。
OpenCV用C++語言編寫,它的主要接口也是C++語言,但是依然保留了大量的C語言接口。該庫也提供了大量的Python、Java and MATLAB/OCTAVE(版本2.5)的接口。這些語言的API接口函數可以通過在線文檔獲得。如今也提供對於C#、Ch、Ruby,GO的支持。
人臉識別級聯分類器文件
級聯分類器文件所在路徑如下
面部定位識別文件:haarcascade_frontalface_alt.xml
眼睛定位識別文件:haarcascade_eye.xml
微笑定位識別文件:haarcascade_smile.xml
上面所提到的級聯分類器文件均是OpenCV官方開發保重自帶的,如果想自己訓練級聯分類器文件,筆者將會在後續文章中詳細介紹,本文則著重介紹OpenCV級聯分類器在Java中的使用。
Java中實現人臉識別
筆者使用OpenCV 4.2.0開發包來進行接下來的介紹與代碼編寫。
創建級聯分類器
讀取待識別圖像
此處對待識別圖片進行了一些簡單的處理(主要是大小),以提高識別的速率。
輸入圖像如下(7.jpg):
面部定位識別
CascadeClassifier提供了很多定位識別方法,這裡我們只介紹我們示例中用到的一個方法。
image:待識別圖像;
objects:用於存儲檢測到對象的矩形向量;
scaleFactor:指定在每個圖像的縮放比;
minNeighbors:每個候選矩形必須保留多少個鄰居;
flags:對於舊的級聯,其含義與函數cvHaarDetectObjects中的含義相同。它不用於新的級聯。
minSize:最小可能的對象大小。小於該值的對象將被忽略。
maxSize:最大可能的對象大小。大於該值的對象將被忽略。
眼睛與微笑識別
為了使得眼睛與微笑識別更加準確我們這裡在面部定位的基礎上進行識別。
識別結果如下: