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