從零開始構(gòu)建人臉識(shí)別模型(附實(shí)例和Python代碼)
01 介紹
你是否意識(shí)到,每當(dāng)你上傳照片到Facebook上,平臺(tái)都會(huì)用人臉識(shí)別算法來識(shí)別圖片中的人物?目前還有一些政府在用人臉識(shí)別技術(shù)來識(shí)別和抓捕罪犯。此外,最常見的應(yīng)用就是通過自己的臉部解鎖手機(jī)。
計(jì)算機(jī)視覺的子領(lǐng)域應(yīng)用得非常廣泛,并且全球很多商業(yè)活動(dòng)都已經(jīng)從中獲益。人臉識(shí)別模型的使用在接下來的幾年內(nèi)還會(huì)繼續(xù)增長,所以一起來了解如何從零開始構(gòu)建人臉識(shí)別模型吧!
本文首先會(huì)介紹人臉識(shí)別模型的內(nèi)部工作原理。隨后結(jié)合一個(gè)簡單的案例,我們將通過Python進(jìn)行案例實(shí)踐。在本文的***部分,你將完成你的***個(gè)人臉識(shí)別模型!
02 理解人臉識(shí)別的工作原理
為了理解人臉識(shí)別算法工作原理,我們首先來了解一下特征向量的概念。(譯者注:此處的特征向量指機(jī)器學(xué)習(xí)的概念,不同于矩陣?yán)碚摗#?/p>
每個(gè)機(jī)器學(xué)習(xí)算法都會(huì)將數(shù)據(jù)集作為輸入,并從中學(xué)習(xí)經(jīng)驗(yàn)。算法會(huì)遍歷數(shù)據(jù)并識(shí)別數(shù)據(jù)中的模式。例如,假定我們希望識(shí)別指定圖片中人物的臉,很多物體是可以看作模式的:
- 臉部的長度/寬度。
- 由于圖片比例會(huì)被調(diào)整,長度和高度可能并不可靠。然而,在放縮圖片后,比例是保持不變的——臉部長度和寬度的比例不會(huì)改變。
- 臉部膚色。
- 臉上局部細(xì)節(jié)的寬度,如嘴,鼻子等。
顯而易見,此時(shí)存在一個(gè)模式——不同的臉有不同的維度,相似的臉有相似的維度。有挑戰(zhàn)性的是需要將特定的臉轉(zhuǎn)為數(shù)字,因?yàn)闄C(jī)器學(xué)習(xí)算法只能理解數(shù)字。表示一張臉的數(shù)字(或訓(xùn)練集中的一個(gè)元素)可以稱為特征向量。一個(gè)特征向量包括特定順序的各種數(shù)字。
舉一個(gè)簡單的例子,我們可以將一張臉映射到一個(gè)特征向量上。特征向量由不同的特征組成,如:
- 臉的長度(cm)
- 臉的寬度(cm)
- 臉的平均膚色(R,G,B)
- 唇部寬度(cm)
- 鼻子長度(cm)
當(dāng)給定一個(gè)圖片時(shí),我們可以標(biāo)注不同的特征并將其轉(zhuǎn)化為如下的特征向量:
如此一來,我們的圖片現(xiàn)在被轉(zhuǎn)化為一個(gè)向量,可以表示為(23.1,15.8,255,224,189,5.2,4.4)。當(dāng)然我們還可以從圖片中衍生出無數(shù)的其他特征(如,頭發(fā)顏色,胡須,眼鏡等)。然而在這個(gè)簡單的例子中,我們只考慮這五個(gè)簡單的特征。
現(xiàn)在,一旦我們將每個(gè)圖片解碼為特征向量,問題就變得更簡單。明顯地,當(dāng)我們使用同一個(gè)人的兩張面部圖片時(shí),提取的特征向量會(huì)非常相似。換言之,兩個(gè)特征向量的“距離”就變得非常小。
此時(shí)機(jī)器學(xué)習(xí)可以幫我們完成兩件事:
- 提取特征向量。由于特征過多,手動(dòng)列出所有特征是非常困難的。一個(gè)機(jī)器學(xué)習(xí)算法可以自動(dòng)標(biāo)注很多特征。例如,一個(gè)復(fù)雜的特征可能是:鼻子長度和前額寬度的比例。手動(dòng)列出所有的這些衍生特征是非常困難的。
- 匹配算法:一旦得到特征向量,機(jī)器學(xué)習(xí)算法需要將新圖片和語料庫中的特征向量進(jìn)行匹配。
既然我們對人臉識(shí)別如何工作有了基本的理解,讓我們運(yùn)用一些廣泛使用的Python庫來搭建自己的人臉識(shí)別算法。
03 案例學(xué)習(xí)
首先給定一些人物臉部的圖片——可能是一些名人,如Mark Zuckerberg, Warren Buffett, Bill Gates, Shah Rukh Khan等,并把這些人臉看作我們的語料庫?,F(xiàn)在,我們給定一些其他名人的新圖片(“新人物”),并判斷這些“新人物”是否在語料庫中。
以下是語料庫中的圖片:
如圖所示,我們所列舉的名人有Barack Obama, Bill Gates, Jeff Bezos, Mark Zuckerberg, Ray Dalio 和Shah Rukh Khan。
現(xiàn)在,假定“新人物”如下:
▲注:以上所有圖片均來自Google圖片
顯而易見,這是Shah Rukh Khan。然而對電腦來說,這個(gè)任務(wù)很有挑戰(zhàn)性。因?yàn)閷τ谖覀儊碚f,我們可以輕易地將圖片的多種特征結(jié)合來判斷這是哪個(gè)人物。然而對電腦而言,學(xué)習(xí)如何識(shí)別人臉是非常不直觀的。
有一個(gè)神奇但是簡單的python庫封裝了以上提及的內(nèi)容——可以根據(jù)臉部特征生成特征向量并且知道如何區(qū)分不同的臉。這個(gè)python庫叫做face_recognition。它應(yīng)用了dlib——一個(gè)現(xiàn)代C++工具包,其中包含了一些機(jī)器學(xué)習(xí)算法來幫助完成復(fù)雜的基于C++的應(yīng)用。
Python中的face_recognition庫可以完成大量的任務(wù):
- 發(fā)現(xiàn)給定圖片中所有的臉。
- 發(fā)現(xiàn)并處理圖片中的臉部特征。
- 識(shí)別圖片中的臉。
- 實(shí)時(shí)的人臉識(shí)別。
接下來,我們將探討其中的第三種任務(wù)——識(shí)別圖片中的臉。
你可以在github的如下鏈接中獲取face_recognition庫的源代碼。
鏈接:
??https://github.com/ageitgey/face_recognition??
事實(shí)上,這里有一些如何安裝face_recognition庫的指導(dǎo)。
鏈接:
??https://github.com/ageitgey/face_recognition#installation-options??
在你安裝face_recognition之前,還需要安裝dlib包。你可以從如下鏈接中找到安裝dlib的指導(dǎo)。
鏈接:
??https://gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf ??
04 Python應(yīng)用
這部分包括使用face_recognition庫搭建簡單人臉識(shí)別系統(tǒng)的代碼。這是一個(gè)應(yīng)用操作的部分,我們將在下一部分解讀代碼來理解更多細(xì)節(jié)。
# import the libraries
import os
import face_recognition
# make a list of all the available images
images = os.listdir('images')
# load your image
image_to_be_matched = face_recognition.load_image_file('my_image.jpg')
# encoded the loaded image into a feature vector
image_to_be_matched_encoded = face_recognition.face_encodings(
image_to_be_matched)[0]
# iterate over each image
for image in images:
# load the image
current_image = face_recognition.load_image_file("images/" + image)
# encode the loaded image into a feature vector
current_image_encoded = face_recognition.face_encodings(current_image)[0]
# match your image with the image and check if it matches
result = face_recognition.compare_faces(
[image_to_be_matched_encoded], current_image_encoded)
# check if it was a match
if result[0] == True:
print "Matched: " + image
else:
print "Not matched: " + image
文件結(jié)構(gòu)如下:
facialrecognition:
- fr.py
- my_image.jpg
- images/
- barack_obama.jpg
- bill_gates.jpg
- jeff_bezos.jpg
- mark_zuckerberg.jpg
- ray_dalio.jpg
- shah_rukh_khan.jpg
- warren_buffett.jpg
我們的根目錄,facialrecognition包括:
- fr.py的形式的人臉識(shí)別代碼。
- my_image.jpg – 即將被識(shí)別的圖片(“新人物”)。
- images/ – 語料庫。
如果你按照前文創(chuàng)建文件結(jié)構(gòu)并執(zhí)行代碼,如下是你能得到的結(jié)果:
Matched: shah_rukh_khan.jpg
Not matched: warren_buffett.jpg
Not matched: barack_obama.jpg
Not matched: ray_dalio.jpg
Not matched: bill_gates.jpg
Not matched: jeff_bezos.jpg
Not matched: mark_zuckerberg.jpg
顯而易見,新名人是Shah Rukh Khan 并且我們的人臉識(shí)別系統(tǒng)可以識(shí)別!
05 理解Python代碼
現(xiàn)在讓我們解讀代碼來,并理解其工作原理:
# import the libraries
import os
import face_recognition
以上是引入操作。我們將通過已經(jīng)建好的os庫來讀入語料庫中的所有圖片,并且通過face_recognition來完成算法部分。
# make a list of all the available images
images = os.listdir('images')
這個(gè)簡單的代碼將幫助我們識(shí)別語料庫中所有圖片的路徑。一旦執(zhí)行這些代碼,我們可以得到:
images = ['shah_rukh_khan.jpg', 'warren_buffett.jpg', 'barack_obama.jpg', 'ray_dalio.jpg', 'bill_gates.jpg', 'jeff_bezos.jpg', 'mark_zuckerberg.jpg']
現(xiàn)在,以下代碼將加載新人物的圖片:
# load your image
image_to_be_matched = face_recognition.load_image_file('my_image.jpg')
為了保證算法可以解析圖片,我們將人物臉部圖片轉(zhuǎn)化為特征向量:
# encoded the loaded image into a feature vector
image_to_be_matched_encoded = face_recognition.face_encodings(
image_to_be_matched)[0]
剩余的代碼相對簡單:
# iterate over each image
for image in images:
# load the image
current_image = face_recognition.load_image_file("images/" + image)
# encode the loaded image into a feature vector
current_image_encoded = face_recognition.face_encodings(current_image)[0]
# match your image with the image and check if it matches
result = face_recognition.compare_faces(
[image_to_be_matched_encoded], current_image_encoded)
# check if it was a match
if result[0] == True:
print "Matched: " + image
else:
print "Not matched: " + image
此時(shí),我們:
- 對每個(gè)圖像進(jìn)行循環(huán)操作。
- 將圖像解析為特征向量。
- 比較語料庫中已經(jīng)加載的圖片和被識(shí)別的新人物圖片。
- 如果兩者匹配,我們就顯示出來。如果不匹配,我們也要顯示結(jié)果。
如上所示,結(jié)果顯示這個(gè)簡單的人臉識(shí)別算法進(jìn)行得很順利。讓我們嘗試將my_image替換為另一個(gè)圖片:
當(dāng)你再次運(yùn)行這個(gè)算法,將會(huì)看到如下結(jié)果:
Not matched: shah_rukh_khan.jpg
Not matched: warren_buffett.jpg
Not matched: barack_obama.jpg
Not matched: ray_dalio.jpg
Not matched: bill_gates.jpg
Not matched: jeff_bezos.jpg
Not matched: mark_zuckerberg.jpg
很明顯,系統(tǒng)沒有將馬云識(shí)別為以上的任何一個(gè)名人。這意味著我們的算法在以下方面都表現(xiàn)得很好:
- 正確地識(shí)別那些在語料庫中存儲(chǔ)的人。
- 對語料庫中不存在的人物進(jìn)行標(biāo)注。
06 人臉識(shí)別算法的應(yīng)用
人臉識(shí)別是一個(gè)成熟的研究方向,已被廣泛地應(yīng)用在工業(yè)界和學(xué)術(shù)界。例如,一個(gè)罪犯在中國被捕可能就得益于人臉識(shí)別系統(tǒng):系統(tǒng)識(shí)別了他的臉并發(fā)出警報(bào)。由此可見,面部識(shí)別可以用來減少犯罪。還有許多其他有趣的人臉識(shí)別案例:
- 面部身份驗(yàn)證:Apple在iPhones中引入了Face ID以用于面部身份驗(yàn)證。一些銀行也嘗試使用面部身份驗(yàn)證來解鎖。
- 用戶服務(wù):馬來西亞的一些銀行安裝了新的人臉識(shí)別系統(tǒng),用于識(shí)別有價(jià)值的銀行客戶,以便銀行為其提供個(gè)人服務(wù)。進(jìn)而銀行可以通過維持這類用戶并提升用戶滿意度來獲取更多收益。
- 保險(xiǎn)行業(yè):很多保險(xiǎn)公司正在通過運(yùn)用人臉識(shí)別系統(tǒng)來匹配人的臉和ID提供的照片,使賠付過程變得更簡單。
07 尾記
綜上所述,人臉識(shí)別是一個(gè)有趣的問題并且有很多強(qiáng)大的案例。這些應(yīng)用可以有效地從各個(gè)方面為社會(huì)服務(wù)。盡管將這些技術(shù)商業(yè)化可能會(huì)帶來倫理風(fēng)險(xiǎn),但我們會(huì)把這個(gè)問題留到下次討論。
希望你能從本文中有所收獲。
原文標(biāo)題:
Simple Introduction to Facial Recognition (with Python codes)
原文鏈接:
關(guān)于譯者:王雨桐,統(tǒng)計(jì)學(xué)在讀,數(shù)據(jù)科學(xué)碩士預(yù)備,跑步不停,彈琴不止。夢想把數(shù)據(jù)可視化當(dāng)作藝術(shù),目前日常是摸著下巴看機(jī)器學(xué)習(xí)。