天天看點

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    本文基于VS2015平台,建立MFC項目工程,通過利用MFC建立可視化的人臉檢測以及相似度檢測程式。

    首先放圖,最終的結果界面如下圖所示。

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    為了能夠實作該效果,進行了如下的工作。認真看完,你會有很大的啟發。

    (一)首先需要在VS2015中建立MFC以及環境的配置

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項
通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    (二)建立完成MFC後,在工程中配置Dlib庫

    本文不需要對Dlib庫進行編譯,通過配置源碼的方式進行Dlib庫的配置,在我的電腦中,Dlib庫的路徑為:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    (1)右鍵點選項目->屬性

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

(2)設定包含目錄

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

(3)設定預處理器定義

    為了能夠對JPG以及PNG圖檔格式進行支援,需要添加對JPG以及PNG圖檔格式的支援:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

(3)設定庫目錄

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

(4)添加源檔案

    該源檔案在下載下傳的dlib源碼的dlib\all\source.pp這個路徑下的檔案,通過添加現有項的方式進行檔案的添加:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項
通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

(5)關閉SDL檢查

    為了防止由于啟動SDL檢查編譯器會嚴格檢測緩沖區的溢出問題,導緻某些檔案編譯失敗,是以需要關閉SDL檢查。

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

(6)取消預編譯頭

    由于導入了第三方的庫檔案,對于第三方的庫檔案來說,不一定會包含有預編譯的頭檔案stdaxf.h,此時将會報錯,是以為了解決這個問題,将預編譯頭取消:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

(7)添加指令行

    如果不添加/bigobj指令行,此時将會出現編譯問題,是以需要添加指令行。

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

(8)在以上都配置完成後,添加檔案到資源檔案中

    添加如下的資源檔案,将dlib\external\libjpeg,dlib\external\libpng,dlib\external\zlib下的所有檔案全部添加到資源檔案中,添加完成後,進行檔案的編譯。

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    編譯成功。

(二)建立人臉識别項目

    該項目包括兩個顯示原始圖檔的控件Picture Control,十個按鈕,按鈕的功能分别為:打開第一張圖檔,打開第二張圖檔,利用兩dlib庫對兩張圖檔進行相似度比對,利用dlib庫對人臉關鍵點進行檢測,利用opencv對所有圖檔進行人臉檢測。在對圖檔進行處理之後,進行實時的檢測,實時檢測包括利用dlib庫對人臉進行檢測,利用dlib庫對人臉關鍵點進行檢測,利用dlib庫對人臉界相似度進行檢測,最後利用opencv進行人臉實時檢測與dlib庫進行對比,最終的界面如下所示:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    點選檔案選擇按鈕,可以進行檔案的選擇,首先選擇兩張待識别的圖像,選擇後結果如下所示:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    圖檔選擇完成後,點選圖像對比按鈕,對比圖像,在得到圖像對比的結果之前,通過dlib庫中的算法,首先要将圖像中的人臉進行标定,标定完人臉後,進行人臉的特征點标定。結果如下所示:    

    (1)利用圖檔進行dlib人臉檢測

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    (2)利用圖檔進行dlib人臉特征點标定

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    (3)利用圖檔進行opencv人臉檢測

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    通過以上的測試,我們可以發現,通過dlib進行檢測,檢測的正确率很高,對于正臉以及偏轉較小的圖檔進行測試,結果很高,但是對于偏轉較大以及顔色與環境較相似的人臉來說,檢測效果不是很理想,但是dlib耗時很長;而opencv進行人臉檢測,檢測的正确率,相比于dlib來說,正确率相對較低,但是檢測的時間很短。

    接下來進行實時的檢測:

    (1)利用dlib庫,對人臉進行實時的檢測。

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    (2)利用dlib庫,對人臉關鍵點進行實時的檢測

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    (3)利用opencv庫,對人臉進行實時的檢測

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    通過進行實時的檢測,我們可以發現,利用dlib庫,進行實時檢測的準确率與opencv檢測的準确率大體相同,但是對于檢測的時間來說,利用opencv進行實時檢測的速度更快,同時能夠基本達到動态的檢測,而對于dlib庫來說,檢測的實時性體驗相當的差。

    (三)遇到的問題:

    在利用VS2015,dlib 19.17以及openCV 3.4.1進行開發的過程中,遇到了如下的問題:

    (1)如何在子函數中更新顯示界面:

        為了程式更加的簡介與修改友善,将具有相同功能的程式分别放置在不同的檔案中,但是如果此時要對界面進行更新操作的話,将會出現問題,此時需要進行如下的操作:

        AfxGetApp()->m_pMainWnd->GetDlgItem(你的控件的名字)->SetWindowText(要設定顯示的文字);

    (2)由于将所有的畫圖函數單獨進行封裝,是以為了能夠傳回集合,需要采用std::vector<資料類型> 來存儲要進行處理的資訊。如下是在我的程式中傳回所有檢測到的矩形框的資訊。

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    注意在使用std::vector<>的時候,要利用push_back()的方式将變量進行添加到集合。

    (3)在我們使用dlib庫的時候,與opencv進行資料交換時,會有資料的轉換問題,對于dlib庫來說,使用的類型為array2d<dlib::rgb_pixel> img_rgb,通過load_image(img_rgb,"test_image.jpg")的方式來加載圖像,但是對于opencv來說,不能夠輸入dlib::rgb_pixel的類型,對于opencv來說,cv::Mat才是可以讀入的圖像,通過cv::imread()函數來讀取函數,為了将dlib::rgb_pixel類型轉為cv::Mat類型,使用dlib::toMat(img_gray)來進行資料類型的轉換。使用方法如下所示:

#include<dlib/opencv.h>

#include<opencv2/opencv.hpp>

cv::Mat img = dlib::toMat(image_gray);

    這樣img就可以利用opencv進行了處理。

    将opencv的Mat類型轉為dlib類型的資料:

cv::Mat I;

dlib::cv_image<uchar>(I);

    (4)由于是進行人臉識别,是以在進行人臉識别的過程中,算法執行效率不是很高,為了能夠更好的進行算法的加速,使用openmp進行并行計算。為了可以使用并行計算,需要進行VS2015的配置。但是,對于dubug模式來說,不能夠進行配置,隻能在release模式下進行配置。

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項
通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    (四)人臉相似度檢測    

        接下來進行比較困難的人臉相似度檢測。

        對圖檔進行人臉相似度檢測,檢測的結果如下所示:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    我們可以發現對于同一張圖檔檢測結果為1,接下來利用不同的圖檔進行結果的檢測,如下所示:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    通過最後的結果我們可以看到,對于不同的人臉,檢測的相似度很低,是以可以采用設定門檻值的方式進行判定。

    最後我們來進行最後的一個實驗,也就是最重要的一個實驗,進行實時的檢測,在進行實時的檢測時,首先需要建立檢測圖檔庫,對庫的制作分别包括如下的幾個步驟:(1)讀入原始的圖檔;(2)對原始的圖檔進行人臉檢測,并且檢測到5個特征點;(3)對檢測後的圖檔進行裁剪,将人臉部分裁剪出來,進行存儲。之後點選dlib人臉相似度檢測,進行實時的人臉檢測通過攝像頭檢測到人臉,之後與庫中的人臉進行比對,最後輸出人臉檢測的結果以及相似度最大的人臉。

    圖檔庫的制作:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    其中database為存儲的原始檢測圖檔,經過第一次處理後,将處理得到的人臉以及标記了人臉關鍵點的圖像存儲到databaseFindFaceAndAlignment檔案夾中,之後進行第二次處理,将databaseFindFaceAndAlignment中的标記了人臉的圖檔取出,進行裁剪,将裁剪下來的人臉存儲在databaseCrop檔案夾中,至此所有的檔案處理完畢。

    點選dlib人臉相似度檢測按鈕,進行實時的拍照,将得到的圖像存儲在originalPicture檔案夾中,接下來對圖檔進行人臉的裁剪,将得到的裁剪後的圖檔存儲到cameraCropPicture檔案夾中。本文所做人臉檢測,沒有進行活體檢測。最後得到的處理結果如下所示:

    原始拍攝的圖檔

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    進行裁剪,裁剪後的結果如下所示:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    對人臉進行比對,從庫當中找到最終的處理結果,找到最終的結果如下所示:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

    可以發現對于圖檔來說,可以很好地找到,預測相似的機率為:

通過MFC,利用opencv、seetaface以及dlib進行人臉識别以及相似度檢測,有結果及使用注意事項

   總結:

    通過大約一個星期的探索,做出了一個簡易的人臉檢測系統,該人臉檢測系統既可以對圖檔進行人臉的檢測以及特征點的标定和人臉相似度的比對,也可以進行實時的人臉檢測,實時的人臉檢測,包括了特征點的标定,人臉的标定以及相似度檢測,通過實踐發下了如下的幾個問題,希望可以跟大家進行相應的探讨:

    (1)如何能夠實作對于光照的魯棒性,在不同光源下都可以很好地進行檢測,想法是對圖檔進行亮度的提升。

    (2)對于不同大小的圖檔,如何能夠提高處理的速度問題,當圖檔過大,處理速度很慢,不能夠達到實時的要求。

    (3)通過實驗發現了一個問題,原始測試資料與利用手機拍攝的資料大小不一樣,當利用手機拍攝的圖檔進行檢測時,不能很好地檢測出來,是以有一個疑問,是否圖像的像素是影響識别準确率的一個因素。 

    當然對于人臉檢測,有許多的方面可做,對于複雜的環境,同時複雜的環境中有多個人臉如何進行比對以及檢測,對于雙胞胎能否進行檢測,都是我們以後将要做的工作。在進行了傳統的檢測方法後,在接下來的文章中還要做基于深度學習的人臉檢測,與普通的算法進行對比。

繼續閱讀