編者按:如今,人臉識別已經(jīng)在我們的生活中處處可見——無論是政府布置在大街小巷的“天眼”,還是手機軟件中用于驗證用戶個人身份的確認(rèn)手段,刷臉解鎖、刷臉支付......每個人與生俱來的這張“獨一無二”的臉正在取代數(shù)字密碼,成為虛擬世界中的身份證明。小編沒有iPhone XS,所以就在這里推薦一篇人臉識別入門佳作吧~
人臉識別是計算機視覺的一個子領(lǐng)域,它的應(yīng)用范圍非常廣泛,現(xiàn)在已經(jīng)成為世界各地的企業(yè)爭相競逐的新技術(shù)之一??紤]到市場的盈利現(xiàn)狀,未來這項技術(shù)還會有更大的需求空間,所以作為機器學(xué)習(xí)的學(xué)習(xí)者,自己動手去從頭開始構(gòu)建一個人臉識別工具很有價值。
本文就是如何構(gòu)建人臉識別器的一則指南,在文章中,首先我們會介紹這項技術(shù)的基本原理,然后用一個簡單案例演示如何用Python來實現(xiàn)。
人臉識別的工作原理
在理解人臉識別的工作原理之前,我們先來看看什么是特征向量。
機器學(xué)習(xí)算法的本質(zhì)是將數(shù)據(jù)集中的所有樣本作為輸入,從數(shù)據(jù)中學(xué)習(xí)“知識”,簡而言之,算法會遍歷數(shù)據(jù)并識別數(shù)據(jù)中的模式。以人臉識別為例,如果我們希望給定一幅圖像,算法能識別出圖像中的人是誰,那么這時它識別到的模式其實有很多種:
臉部的長度/寬度
有時長度/寬度的具體數(shù)值可能是不可靠的,因為它們會隨著圖像縮放不斷變化,但即使在重新縮放之后,某些數(shù)據(jù)還是會始終保持不變——臉部的長寬比率
膚色
五官的形狀,如嘴、鼻子等
顯然,它們有一個共識——不同人臉的臉部長寬比、五官、膚色等是不同的。如果兩張人臉很相似,那它們在這些方面的差異就比較小。這就引出了最具挑戰(zhàn)性的一個步驟:把特定人的面部轉(zhuǎn)換成數(shù)字表示——機器學(xué)習(xí)算法只能理解數(shù)字。
這種“人臉”(或訓(xùn)練集中特征)的數(shù)字表示就是我們所說的特征向量,它包含按特定順序排列的一系列數(shù)字。
為了方便理解,下面舉一個簡單的例子,我們可以將“人臉”映射到一個特征向量,該特征向量可以包含各種特征,例如:面長(cm)、面寬(cm)、平均膚色(RGB)、嘴唇寬度(cm)、鼻子長度(cm)。
基本上,給定一個圖像,我們可以繪制出各種特征并將其轉(zhuǎn)換為特征向量,如:
因此這張人臉可以用(23.1, 15.8, 255, 224, 189, 5.2, 4.4)這個向量表示。當(dāng)然,除了以上特征,我們還可以通過觀察和測量獲得更多人臉信息,比如發(fā)色、面部毛發(fā)、是否戴眼鏡等,但為了方便介紹,我們在這篇文章里只考慮以上5個簡單特征。
一旦我們將每個圖像編碼成特征向量,問題就變得非常簡單了,因為我們可以通過計算向量之間的“距離”判斷兩張“人臉”的相似程度。而機器學(xué)習(xí)在這里發(fā)揮的作用主要有兩個:
派生特征向量:數(shù)據(jù)集中的數(shù)據(jù)量往往非常多,手動列出每個特征顯然不現(xiàn)實。機器學(xué)習(xí)算法可以智能地標(biāo)記出所需特征,也可以做一些簡單計算,如鼻子長度與前額寬度的比率。
匹配算法:一旦獲得了特征向量,機器學(xué)習(xí)算法就可以把新圖像與數(shù)據(jù)集中存在的特征向量集相匹配。
現(xiàn)在我們已經(jīng)基本了解了人臉識別的工作原理,緊接著,讓我們使用一些著名的Python庫,嘗試構(gòu)建自己的人臉識別算法。
案例分析
下面是我們數(shù)據(jù)集中的一些圖像,分別是奧巴馬、比爾·蓋茨、杰夫·貝佐斯、馬克·扎克伯格、雷·達(dá)利奧和沙魯克汗。我們把這些人稱為“語料庫”,然后準(zhǔn)備另一位名人(“新名人”)的圖像,模型的任務(wù)是確定“新名人”是否出現(xiàn)在“語料庫”中。
對人類來說,區(qū)分上述6人非常簡單,即便有讀者不認(rèn)識著名男性沙魯克汗(末圖),我們也能從外形上看出他和奧巴馬的明顯區(qū)別。但這對計算機而言并不簡單。
我們選擇的“新名人”:
得益于社區(qū)成員的貢獻(xiàn),現(xiàn)在我們有一個非常簡單的Python庫,它封裝了上面提到的所有內(nèi)容——從面部創(chuàng)建特征向量并知道如何檢測人臉。這個Python庫叫face_recognition,如果再深入研究一下,你會發(fā)現(xiàn)它來自dlib——沒錯,那個跨平臺的C++公共庫,它包含很多機器學(xué)習(xí)常用算法,有助于編寫復(fù)雜的基于C ++的應(yīng)用程序。
Python中的face_recognition庫可以執(zhí)行大量任務(wù):
檢測給定圖像中的所有人臉
檢測和標(biāo)記圖像中的人臉特征
識別圖像中的人臉
實時人臉識別
這里我們只介紹如何用face_recognition識別圖像中的人臉,即上述第三個任務(wù)。
facerecognition源碼:github.com/ageitgey/facerecognition
如何安裝facerecognition庫:github.com/ageitgey/facerecognition#installation-options
在安裝face_recognition之前,你還需要安裝dlib:gist.github.com/ageitgey/629d75c1baac34dfa5ca2a1928a7aeaf
在Python中實現(xiàn)
本節(jié)包含使用face_recognition庫構(gòu)建簡單人臉識別系統(tǒng)的代碼,這是實現(xiàn)部分,代碼具體表示什么我們會下下節(jié)介紹。
# 導(dǎo)入庫
import os
import face_recognition
# 制作所有可用圖像的列表
images = os.listdir('images')
# 加載圖像
image_to_be_matched = face_recognition.load_image_file('my_image.jpg')
# 將加載圖像編碼為特征向量
image_to_be_matched_encoded = face_recognition.face_encodings(
image_to_be_matched)[0]
# 遍歷每張圖像
for image in images:
# 加載圖像
current_image = face_recognition.load_image_file("images/" + image)
# 將加載圖像編碼為特征向量
current_image_encoded = face_recognition.face_encodings(current_image)[0]
# 將你的圖像和圖像對比,看是否為同一人
result = face_recognition.compare_faces(
[image_to_be_matched_encoded], current_image_encoded)
# 檢查是否一致
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
shahrukhkhan.jpg
warren_buffett.jpg
它們分別表示:
fr.py:人臉識別的代碼
my_image.jpg:要識別的圖像(“新名人”)
images/:“語料庫”
當(dāng)你創(chuàng)建上面的文件夾結(jié)構(gòu)并運行上面的代碼時,這是你得到的輸出:
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)能夠檢測到他!
理解Python代碼
現(xiàn)在,我們來分解上述代碼,進(jìn)一步了解它是如何工作的:
# 導(dǎo)入庫
import os
import face_recognition
這就是常規(guī)“導(dǎo)入”操作,我們會用face_recognition編寫算法
# 制作所有可用圖像的列表
images = os.listdir('images')
這行簡單代碼可以幫助我們識別語料庫中所有圖像的路徑。執(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)在,下面加載新名人圖像:
# 加載圖像
image_to_be_matched = face_recognition.load_image_file('my_image.jpg')
為了確保算法能夠解釋圖像,我們將圖像轉(zhuǎn)換為特征向量:
# 將加載圖像編碼為特征向量
image_to_be_matched_encoded = face_recognition.face_encodings(
image_to_be_matched)[0]
剩下的代碼不難理解:
# 遍歷每張圖像
for image in images:
# 加載圖像
current_image = face_recognition.load_image_file("images/" + image)
# 將加載圖像編碼為特征向量
current_image_encoded = face_recognition.face_encodings(current_image)[0]
# 將你的圖像和圖像對比,看是否為同一人
result = face_recognition.compare_faces(
[image_to_be_matched_encoded], current_image_encoded)
# 檢查是否一致
if result[0] == True:
print"Matched: " + image
else:
print"Not matched: " + image
綜合來看,我們用這些代碼做到了:
在每個圖像上循環(huán)
將圖像編碼為特征向量
將加載的圖像與要識別的圖像進(jìn)行比較
如果人物一致,我們輸出結(jié)果。如果人物不一致,我們也會輸出結(jié)果
上面的輸出清楚地表明這個簡單人臉識別算法的效果非常好,讓我們嘗試用另一個圖像替換my_image :
再次運行算法時,輸出變成了這樣:
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
顯然,馬云不在我們的“語料庫”中。
人臉識別應(yīng)用
人臉識別是一個有趣的問題,關(guān)于它的研究比較成熟,這項技術(shù)也被廣泛應(yīng)用于工業(yè)界和學(xué)術(shù)界。“歌神”張學(xué)友之所以能成為“逃犯克星”,演唱會現(xiàn)場布置的先進(jìn)人臉識別攝像頭功不可沒,這也是人臉識別用于減輕犯罪的一個典例。此外,這項技術(shù)還有許多應(yīng)用:
身份驗證:蘋果已經(jīng)為iPhone中的人臉身份驗證引入高級面部識別碼,一些常用的APP,如支付寶,也在用戶要求進(jìn)行個人社保信息操作時要求進(jìn)行人臉認(rèn)證。
客戶服務(wù):馬來西亞的一些銀行已經(jīng)安裝了使用人臉識別系統(tǒng)來檢測高價值客戶的系統(tǒng),以便客服人員提供個性化服務(wù)。通過這種方式,銀行可以通過留住這些客戶創(chuàng)造更多收入。
保險承保:許多保險公司正在使用人臉識別系統(tǒng),將客戶真人面部與照片身份證上的人臉相匹配。這樣,客戶的承保過程會變得更快。
總而言之,人臉識別已經(jīng)開始從各個方面服務(wù)社會,雖然某些商業(yè)化應(yīng)用會存在道德風(fēng)險,但這些都不應(yīng)成為阻礙技術(shù)發(fā)展的絆腳石。
原文標(biāo)題:面部識別簡介(使用Python代碼)
文章出處:【微信號:jqr_AI,微信公眾號:論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。