轉(zhuǎn)載:https://my.oschina.net/kangvcar/blog/1557459
Face Recognition人臉識(shí)別庫(kù)
這是世界上最簡(jiǎn)單的人臉識(shí)別庫(kù)了。你可以通過(guò)Python引用或者命令行的形式使用它,來(lái)管理和識(shí)別人臉。
該軟件包使用dlib中最先進(jìn)的人臉識(shí)別深度學(xué)習(xí)算法,使得識(shí)別準(zhǔn)確率在《Labled Faces in the
world》測(cè)試基準(zhǔn)下達(dá)到了99.38%。
它同時(shí)提供了一個(gè)叫face_recognition的命令行工具,以便你可以用命令行對(duì)一個(gè)文件夾中的圖片進(jìn)行識(shí)別操作。
特征
在圖片中識(shí)別人臉
找到圖片中所有的人臉:

import face_recognitionimage=face_recognition.load_image_file("your_file.jpg")face_locations=face_recognition.face_locations(image)
找到并操作圖片中的臉部特征
獲得圖片中人類眼睛、鼻子、嘴、下巴的位置和輪廓:

import face_recognitionimage = face_recognition.load_image_file("your_file.jpg")face_landmarks_list = face_recognition.face_landmarks(image)
找到臉部特征有很多超級(jí)有用的應(yīng)用場(chǎng)景,當(dāng)然你也可以把它用在最顯而易見(jiàn)的功能上:美顏功能就像美圖秀秀那樣:

鑒定圖片中的臉
識(shí)別圖片中的人是誰(shuí)

import face_recognitionknown_image=face_recognition.load_image_file("biden.jpg")unknown_image=face_recognition.load_image_file("unknown.jpg")biden_encoding=face_recognition.face_encodings(known_image)[0]unknown_encoding=face_recognition.face_encodings(unknown_image)[0]results=face_recognition.compare_faces([biden_encoding],unknown_encoding)
你甚至可以用這個(gè)軟件包做人臉的實(shí)時(shí)識(shí)別:

這里有一個(gè)實(shí)時(shí)識(shí)別的例子
安裝
環(huán)境要求:
Python3.3+或者Python2.7
MacOS或者Linux(Windows不做支持,但是你可以試試,也許也能運(yùn)行)
安裝步驟
在Mac或Linux上安裝
首先,確保你安裝了dlib,以及該軟件的Python綁定接口。如果沒(méi)有的話,看這篇安裝說(shuō)明:
然后,使用pip3(Python 2的pip2)從pypi安裝此模塊:
pip3install face_recognition
如果你安裝遇到問(wèn)題,可以試試這個(gè)安裝好了的虛擬機(jī)
在樹(shù)莓派2+上安裝
在Windows上安裝
雖然Windows不是官方支持的,但是有熱心網(wǎng)友寫出了一個(gè)Windows上的使用指南,請(qǐng)看這里:
@ masoudr的Windows 10安裝指南(dlib + face_recognition)
使用已經(jīng)配置好的虛擬機(jī)(支持VMWare和VirtualBox)
下載預(yù)配置的虛擬機(jī)映像(適用于VMware Player或VirtualBox)。
使用方法
命令行界面
如果你已經(jīng)安裝了face_recognition,那么你的系統(tǒng)中已經(jīng)有了一個(gè)名為face_recognition的命令,你可以使用它對(duì)圖片進(jìn)行識(shí)別,或者對(duì)一個(gè)文件夾中的所有圖片進(jìn)行識(shí)別。
首先你需要提供一個(gè)文件夾,里面是所有你希望系統(tǒng)認(rèn)識(shí)的人的圖片。其中每個(gè)人一張圖片,圖片以人的名字命名:

接下來(lái),你需要準(zhǔn)備另一個(gè)文件夾,里面是你要識(shí)別的圖片:

然后你就可以運(yùn)行face_recognition命令了,把剛剛準(zhǔn)備的兩個(gè)文件夾作為參數(shù)傳入,命令就會(huì)返回需要識(shí)別的圖片中都出現(xiàn)了誰(shuí):
$ face_recognition ./pictures_of_people_i_know/./unknown_pictures//unknown_pictures/unknown.jpg,Barack Obama/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person
輸出中,識(shí)別到的每張臉都單獨(dú)占一行,輸出格式為<圖片名稱>,<人名>。 unknown_person 是一個(gè)與你的文件夾的已知人圖像不匹配的人物。
調(diào)整公差/靈敏度
如果你正在為同一個(gè)人獲得多個(gè)比較,那可能就是這樣您的照片中的人看起來(lái)非常相似,容差值較低需要使臉部比較更嚴(yán)格。 你可以用--tolerance參數(shù)來(lái)做到這一點(diǎn)。默認(rèn)容差值為0.6,較低的數(shù)字使臉部比較更嚴(yán)格:
$ face_recognition --tolerance0.54./pictures_of_people_i_know/./unknown_pictures//unknown_pictures/unknown.jpg,Barack Obama/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person
如果要按順序查看每次計(jì)算出的面距要調(diào)整公差設(shè)置,可以使用:--show-distancetrue
$ face_recognition --show-distancetrue./pictures_of_people_i_know/./unknown_pictures//unknown_pictures/unknown.jpg,Barack Obama,0.378542298956785/face_recognition_test/unknown_pictures/unknown.jpg,unknown_person,None
更多例子
如果你只想知道每張照片中的人的名字,但不要關(guān)心文件名,你可以這樣做:
$ face_recognition ./pictures_of_people_i_know/./unknown_pictures/| cut -d','-f2Barack Obamaunknown_person
加快人臉識(shí)別
如果您有多個(gè)CPU內(nèi)核的電腦,則可以并行完成臉部識(shí)別。例如,如果您的系統(tǒng)有4個(gè)CPU內(nèi)核,您可以通過(guò)使用在相同的時(shí)間量?jī)?nèi)所有的CPU內(nèi)核并行處理約4倍的圖像。 如果您使用的是Python 3.4或更新版本,請(qǐng)傳入?yún)?shù):--cpus <number_of_cpu_cores_to_use> parameter:
$ face_recognition --cpus4./pictures_of_people_i_know/./unknown_pictures/
您還可以傳入使用系統(tǒng)中的所有CPU內(nèi)核。--cpus-1
Python模塊
你可以通過(guò)導(dǎo)入face_recognition模塊來(lái)使用它,使用方式超級(jí)簡(jiǎn)單,文檔在這里API文件:
自動(dòng)找到圖片中所有的臉
import face_recognitionimage = face_recognition.load_image_file("my_picture.jpg")face_locations = face_recognition.face_locations(image)# face_locations is now an array listing the co-ordinates of each face!
看看這個(gè)例子自己實(shí)踐一下,試試看。
你還可以自定義替換人類識(shí)別的深度學(xué)習(xí)模型。
注意:想獲得比較好的性能的話,你可能需要GPU加速(使用英偉達(dá)的CUDA庫(kù))。所以編譯的時(shí)候你也需要開(kāi)啟dlib的GPU加速選項(xiàng)。
import face_recognitionimage = face_recognition.load_image_file("my_picture.jpg")face_locations = face_recognition.face_locations(image, model="cnn")# face_locations is now an array listing the co-ordinates of each face!
你也可以通過(guò)這個(gè)例子實(shí)踐一下,試試看。
如果你有很多圖片和GPU,你也可以并行快速識(shí)別,看這篇文章。
自動(dòng)識(shí)別人臉特征
import face_recognitionimage = face_recognition.load_image_file("my_picture.jpg")face_landmarks_list = face_recognition.face_landmarks(image)# face_landmarks_list is now an array with the locations of each facial feature in each face.# face_landmarks_list[0]['left_eye'] would be the location and outline of the first person's left eye.
試試這個(gè)例子,試試看。
識(shí)別人臉鑒定是哪個(gè)人
import face_recognitionpicture_of_me = face_recognition.load_image_file("me.jpg")my_face_encoding = face_recognition.face_encodings(picture_of_me)[0]# my_face_encoding now contains a universal 'encoding' of my facial features that can be compared to any other picture of a face!unknown_picture = face_recognition.load_image_file("unknown.jpg")unknown_face_encoding = face_recognition.face_encodings(unknown_picture)[0]# Now we can see the two face encodings are of the same person with `compare_faces`!results = face_recognition.compare_faces([my_face_encoding], unknown_face_encoding)if results[0] == True:? ? print("It's a picture of me!")else:print("It's not a picture of me!")
這里是一個(gè)例子,試試看。
Python代碼示例
所有的例子都在這里。
人臉檢測(cè)
在GPU(使用深度學(xué)習(xí))的圖像批量查找面孔
面部特征
面部識(shí)別
根據(jù)已知人的照片,查找并識(shí)別照片中的未知臉部
通過(guò)數(shù)字表面距離比較面部,而不是僅True / False匹配
使用您的網(wǎng)絡(luò)攝像頭識(shí)別實(shí)況視頻中的人臉 - 簡(jiǎn)單/較慢版本(需要安裝OpenCV)
使用您的網(wǎng)絡(luò)攝像頭識(shí)別實(shí)況視頻中的人臉 - 更快的版本(需要安裝OpenCV)
識(shí)別視頻文件中的面孔并寫出新的視頻文件(需要安裝OpenCV)
識(shí)別Raspberry Pi w /相機(jī)的面孔
運(yùn)行Web服務(wù)通過(guò)HTTP識(shí)別面孔(需要安裝Flask)
人臉識(shí)別如何運(yùn)作
如果你想了解臉部位置和識(shí)別如何工作,而不是取決于黑匣子庫(kù),請(qǐng)閱讀我的文章。
注意事項(xiàng)
面部識(shí)別模型是針對(duì)成年人進(jìn)行培訓(xùn)的,對(duì)兒童的工作效果不佳。它傾向于使用默認(rèn)比較閾值0.6來(lái)混合孩子很容易。
部署到云端主機(jī)(Heroku,AWS等)
由于face_recognition取決于使用dlibC ++編寫的內(nèi)容,將其用于云端托管服務(wù)商,如Heroku或AWS 部署應(yīng)用程序可能很棘手。 為了使事情更容易,這個(gè)repo中有一個(gè)Dockerfile示例,顯示如何在Docker容器中運(yùn)行一個(gè)構(gòu)建的應(yīng)用程序face_recognition。因此,您應(yīng)該可以部署支持Docker圖像的任何服務(wù)。
常見(jiàn)問(wèn)題
問(wèn)題:使用face_recognition或運(yùn)行示例時(shí)出現(xiàn)Illegal instruction(coredumped)
解決方案:dlib使用SSE4或AVX進(jìn)行編譯,但您的CPU太舊,不支持。 您需要更改dlib代碼后重新編譯這里概述代碼更改。
問(wèn)題:運(yùn)行攝像頭示例時(shí)出現(xiàn)RuntimeError: Unsupported image type, must be 8bit gray or RGB image.
解決方案:您的網(wǎng)絡(luò)攝像機(jī)可能未正確使用OpenCV設(shè)置。在這里尋找更多幫助。 問(wèn)題:運(yùn)行pip2 install face_recognition時(shí)出現(xiàn)MemoryError
解決方案:face_recognition_models文件對(duì)于可用的緩存內(nèi)存來(lái)說(shuō)太大了。嘗試使用以下方法pip2 --no-cache-dir install face_recognition來(lái)盡量避免這個(gè)問(wèn)題。
問(wèn)題:AttributeError: 'module' object has no attribute 'face_recognition_model_v1'
解決方案:dlib您安裝的版本太舊了。您需要19.7或更新版本。升級(jí)dlib。
問(wèn)題:AttributeError: 'Module' object has no attribute 'cnn_face_detection_model_v1'
解決方案:dlib您安裝的版本太舊了。您需要19.7或更新版本。升級(jí)dlib。
問(wèn)題:TypeError: imread() got an unexpected keyword argument 'mode'
解決方案:scipy您安裝的版本太舊了。您需要版本0.17或更新版本。升級(jí)scipy。
謝謝
非常感謝戴維斯·金(@nulhom)創(chuàng)建dlib并提供訓(xùn)練有素的面部特征檢測(cè)和此庫(kù)中使用的臉部編碼模型。有關(guān)ResNet上有關(guān)面部編碼的更多信息,請(qǐng)查看他的博文。
感謝所有在Python數(shù)據(jù)科學(xué)圖書(shū)館工作的所有人,如data,scipy,scikit-image,pillow等,使得這種東西在Python中如此簡(jiǎn)單而有趣。
感謝Cookiecutter和audreyr / cookiecutter-pypackage項(xiàng)目模板,使Python項(xiàng)目打包方式更有效率。