人脸识别-dlib
本文要做一個人臉比對功能,輸入兩張圖片,輸出是否同一人,用到了dlib模塊。
dlib是一個可以做人臉檢測和識別的第三方模塊,官方給出預訓練模型在亞洲人臉的識別率不是很理想,我們需要在自己的數據集上重新訓練,提高準確率。
一、安裝dlib模塊
環境:win10,pip1、下載“dlib-19.8.1-cp36-cp36m-win_amd64.whl”
百度云鏈接鏈接:https://pan.baidu.com/s/1yTQ_404E_CbQUF4KDxTIYA提取碼:orgh
2、打開命令行并進入到whl文件所在目錄
運行pip install dlib-19.8.1-cp36-cp36m-win_amd64.whl
3、引入dlib模塊
找到dlib安裝路徑,找到dlib.pyd文件,直接復制到項目里,就可以正常引用和調用里面的方法
二、安裝圖片標注工具imglab
1、編譯imglab
官方提供了imglab工具用于制作人臉識別的數據集,遺憾的是官方提供的是源碼,需要我們自己編譯 。這里提供一個編譯好的exe文件下載,能用可以直接跳到數據集制作部分。
鏈接:https://pan.baidu.com/s/1jNArBPkW0S4ifgP_pHbmnA提取碼:w2re
1)在github下載dlib的源碼,進入到imglab所在目錄,可以看到源碼,需要我們自己編譯。
在imglab下新建build文件夾。
2)安裝vs2019
https://visualstudio.microsoft.com/zh-hans/vs/?visualstudio.microsoft.com
?
3)安裝cmake
安裝好后打開cmake-gui.exe
Configure配置完成后,cmake顯示如下信息,此時點擊【Generate】按鈕,生成exe文件
打開build文件夾,可以發現生成了imglab.exe文件
三、制作自己的數據集
1)新建文件夾images并添加圖片
2)復制imglab.exe到images文件夾下
3)打開命令行,進入到images文件夾下,輸入imglab -c mydataset.xml ./,按回車,在當前目錄生成mydataset.xml文件。
4)命令行輸入imglab mydataset.xml,按回車,打開imglab程序窗口。
5)如果想要訓練的模型檢測出來的人臉可以提取出人臉特征,供后面的人臉識別對接,那么標記圖片的時候需要按照特定方式來標記,標記方式有兩種,一種是68個特征點的標記方式,另一種是5個特征點的標記方式,特征標記順序如下圖:
注意,特征點的順序必須如下圖所示,順序不能錯,不然可以正常訓練,但是訓練出來的模型提取不了特征向量。68個特征點位置
5個特征點位置
步驟:
標記完成的圖片如下:
四、訓練人臉檢測模型
官方預訓練的模型對亞洲人臉的識別度不好,所以如果你有自己的數據集,可以訓練自己的模型來改善這個問題。人臉識別需要兩個模型,一個是人臉檢測模型,一個是人臉特征提取模型。官方的說法是:人臉特征提取模型是使用幾百萬張圖片訓練出來的,如果你有幾千張圖片,訓練的模型不會對準確率有太大提高,所以應該訓練人臉檢測模型,提高在特定數據集上的準確度。
五、人臉比對
實現功能:輸入兩張圖片,判斷是否同一人。
人臉比對使用了兩個預訓練的模型:
- 人臉檢測:shape_predictor_68_face_landmarks.dat
- 特征點提取:dlib_face_recognition_resnet_model_v1.dat
其中的人臉檢測模型可以換成我們自己訓練的模型predictor.dat
from skimage import io import numpy as np import dlibdef getVector(picPath):print("Processing file: {}".format(picPath))detector = dlib.get_frontal_face_detector()model1_path = 'shape_predictor_68_face_landmarks.dat'model2_path = 'dlib_face_recognition_resnet_model_v1.dat'sp = dlib.shape_predictor(model1_path)facerec = dlib.face_recognition_model_v1(model2_path)img = io.imread(picPath)dets = detector(img, 1)print("Number of faces detected: {}".format(len(dets)))for k, d in enumerate(dets):shape = sp(img, d)face_descriptor = facerec.compute_face_descriptor(img, shape)return np.array(face_descriptor,dtype=float)def comparePic(pic1,pic2):vector1 = getVector(pic1)vector2 = getVector(pic2)op1 = np.sqrt(np.sum(np.square(vector1 - vector2)))print("歐氏距離:{}".format(op1))return op1if __name__ == '__main__':score = comparePic('images/Aaron_Eckhart_0001.jpg','images/Aaron_Guiel_0001.jpg')if score < 0.6:print('同一人')else:print('不是一個人')六、人臉檢測和比對源碼下載
鏈接:https://pan.baidu.com/s/1X0gBamWDz8cEjm_h1QwmKQ提取碼:y7uy
?
編輯于 2020-03-13
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
- 上一篇: SpringBoot各种Controll
- 下一篇: Dlib模型人脸特征检测原理及demo