人臉檢測和人臉識別都是屬於典型的機器學習的方法,但是他們使用的方法卻相差很大。
對於人臉檢測而言,目前最有效的方法仍然是基於Adaboost的方法。在網上可以找到很多關於Adaboost方法的資料,但基本上是千篇一律,沒有任何新意。給初學者帶了很多不便。建議初學者只需要認真閱讀:北京大學 趙楠 的本科畢業論文 :基於 AdaBoost算法的人臉檢測 這篇畢業論文就夠了。作者詳細分析了Adaboost算法在人臉檢測中的具體執行過程,尤其是關於弱分類器的Haar特征選取過程,描述的相當清晰。
至於人臉檢測的代碼,網上基本上是關於如何用openCV去做人臉檢測的代碼。如果不需要對性能做更高的要求的話,直接用openCV就可以了。
根據對openCV代碼的理解,我重新提取了openCV人臉檢測的代碼,采用純C語言實現了人臉檢測,與openCV的代碼項目相比,有一下幾點不同:
1. 使用內存少。
1.1 原始openCV在檢測初始化的時候分配一個很大的buffer,在人臉檢測當中使用這個buffer,這個是由openCV的內存管理機制決定的。但在很多時候,圖像大小一般都沒有想象的那么大,這個大buffer只使用了其中的一小部分,內存空閑很大。在我的人臉檢測中,根據圖像大小分配2張圖片大小內存,分別存放積分圖和平方積分圖。其它的內存是結構體占用的內存,一般比較小。
1.2 原始openCv分類器文件是XML文本文件,而在我的人臉檢測之中是二進制文件。所以分類器文件比openCV小至少5倍以上。
2. 運行效率高
刪除了Canny邊緣檢測的代碼,針對具體的應用重新修改了算法執行中的部分參數。由於分類器是基於openCv改的,所以對人臉檢測的准確率沒有任何下降。
目前算法的代碼雖然是純C語言,但還沒有做定點優化。目前的性能在iPod4上面,對於640x480的圖片,檢測單張人臉的時間是60ms左右。
如果對adaBoost算法本身感興趣,除了可以閱讀openCv中的代碼之外,還有一個官方的代碼,實現了各種AdaBoost算法。
部分人臉檢測圖片的結果如下:


另外一張圖片:


測試圖片來自網絡,如涉及到版權問題,請告知!
