三步走解析人臉識別套路


????計算機視覺作為人工智能領(lǐng)域一個最火的應(yīng)用點,最近幾年被媒體宣傳的沸沸揚揚,像商湯伶唯、曠視、壕屙铮康威視等等基于計算機視覺技術(shù)的公司都是各種投資者的寵兒抵怎。上個月曠視科技獲得了微軟舉辦的COCO Challenge 2017的冠軍更是讓“計算機視覺”重新成為了媒體報道的熱點奋救。

????人臉識別作為計算機視覺中的一個已經(jīng)很成熟的應(yīng)用點,在很多行業(yè)外的人眼中往往披了一層神秘的面紗反惕。那么“人臉識別”真的很困難嗎尝艘?其實未必,以一種稍微抽象點的方式理解的話姿染,“人臉識別”就如同小品里說的將大象裝進冰箱一樣簡單:1)將冰箱打開背亥;2)把大象裝進去;3)把冰箱門關(guān)上

????同樣的悬赏,“人臉識別”也能分三步實現(xiàn)

????1)將圖片中的人臉找出來狡汉;2)對找出來的人臉進行特征轉(zhuǎn)換(可以簡單理解為轉(zhuǎn)換成計算機能更好理解的格式);3)對轉(zhuǎn)換后的特征進行識別闽颇,看看是誰的臉盾戴。這其中每一步都能使用不同的機器學(xué)習(xí)算法來進行處理

????下邊我將針對開源人臉識別框架 openface 中的源碼進行解析幫助大家更好的理解人臉識別背后的分析邏輯到底是什么。openface的安裝過程請參照Mac上開源人臉識別軟件OPENFACE安裝全流程教程




????OpenFace開源框架提供了許多的 demo 腳本兵多,這能幫助我們更好的理解如何使用這個框架尖啡。下邊是調(diào)用demo腳本進行一個人臉識別的具體過程:

mkdir -p classify-test/raw/{lennon,clapton}

cp images/examples/lennon-* classify-test/raw/lennon

cp images/examples/clapton-* classify-test/raw/clapton

./util/align-dlib.py classify-test/raw align outerEyesAndNose classify-test/aligned --size96

./batch-represent/main.lua -outDir classify-test/features -data classify-test/aligned

./demos/classifier.py train classify-test/features

./demos/classifier.py infer ./classify-test/features/classifier.pkl images/examples/{carell,adams,lennon}*

????下邊我將通過分別解析上邊的openface使用語句,幫助大家理解openface是如何“將大象裝進冰箱里”的:

? ? 0)準備訓(xùn)練樣本

mkdir -p classify-test/raw/{lennon,clapton}

cp images/examples/lennon-* classify-test/raw/lennon

cp images/examples/clapton-* classify-test/raw/clapton

????這里作者在 classify-test/raw 文件目錄下放置好訓(xùn)練數(shù)據(jù)剩膘,將要進行訓(xùn)練的數(shù)據(jù)按照類別在 raw 下分別創(chuàng)建子目錄衅斩。這里我創(chuàng)建了 Lennon 和 clapton 兩個類別,然后將這兩個人的照片分別放進子文件夾中

????1)利用dlib開源包怠褐,對圖片中的人臉進行識別

./util/align-dlib.py classify-test/raw align outerEyesAndNose classify-test/aligned --size96

????這里 align-dliv.py 從 classify-test/raw 原始圖片文件夾中對里邊的每個圖片進行識別畏梆,然后將識別出來的人臉放入 classify-test/aligned 文件夾中。這里 align-dlib.py 很智能奈懒,對 raw 文件夾下的所有子文件夾都會對應(yīng)的在 aligned 下進行創(chuàng)建

????2)對識別出來的人臉進行抽象

./batch-represent/main.lua -outDir classify-test/features -data classify-test/aligned

????這里 main.lua 對 aligned 文件夾下的人臉進行特征轉(zhuǎn)化奠涌,形成兩個文件 reps.csv 和 labels.csv。reps.csv 中的每一行代表 aligned 文件夾下的一張圖片的特征值磷杏,而 labels.csv 中的每一行對應(yīng)的是每一張圖片的類別標簽(這個案例只有 lennon 和 clapton 兩類溜畅,各位可以根據(jù)自己需要放置數(shù)據(jù))

????3)對抽象出的特征進行分類

????第一步,用 ?2)中提取的特征值和標簽對模型進行訓(xùn)練茴丰,并將訓(xùn)練好的模型存在 classify-test/features 文件夾下达皿,一般存為 classifier.pkl天吓。值得注意的是這里特征提取使用的是一個已經(jīng)訓(xùn)練好了的神經(jīng)網(wǎng)絡(luò)模型贿肩,其置于 models/openface/nn4.small2.v1.t7

./demos/classifier.py train classify-test/features

????第二步,用訓(xùn)練好的分類模型 classifier.pkl 對新的圖片進行分類

./demos/classifier.py infer ./classify-test/features/classifier.pkl images/examples/{carell,adams,lennon}*



????理解了人臉識別的套路龄寞,那么如何一站式的實現(xiàn)人臉識別呢汰规?比如利用攝像頭對人臉進行捕捉,然后動態(tài)的進行人臉識別物邑。這樣的話溜哮,我們就能將它應(yīng)用在門禁系統(tǒng)滔金、安檢系統(tǒng)中了。

????不用擔心茂嗓,openface 的 demo/classifier_webcam.py 就是這個場景的一個簡單實踐餐茵,讓我們過一遍

????首先,將人臉識別所需要的模型準備好:

align = openface.AlignDlib(args.dlibFacePredictor) ?# 人臉檢測模型 dlib

net = openface.TorchNeuralNet(?? ??? ??? ??? ??? ??? ??? ?? ?# 特征抽象模型 神經(jīng)網(wǎng)絡(luò)

????args.networkModel,

????imgDim=args.imgDim,

????cuda=args.cuda)

????其次述吸,調(diào)用 opencv 的視頻流接口來使用攝像頭攝取的圖形進行實時監(jiān)測

# Capture device. Usually 0 will be webcam and 1 will be usb cam.

video_capture = cv2.VideoCapture(args.captureDevice)

video_capture.set(3, args.width) ? ? ? ? # 設(shè)定視頻窗口的長和寬

video_capture.set(4, args.height)

confidenceList = []

whileTrue: ? ?# 不斷循環(huán)讀取視頻流中的圖像

????ret, frame = video_capture.read() ? ?# 循環(huán)讀取圖片

????……

????然后忿族,對每張讀取到的圖像進行人臉識別:

persons, confidences = infer(frame, args)

????這里程序調(diào)用了函數(shù) infer,將讀取到的圖像 frame 和程序設(shè)定的參數(shù) args(主要是分類模型的位置)作為參數(shù)輸入函數(shù)中蝌矛,返回分類預(yù)測結(jié)果和結(jié)果的置信度

????接著道批,讓我們進入 infer 函數(shù)中,看看其到底做了什么吧

????[1] 將分類標簽和分類器讀入內(nèi)存

with open(args.classifierModel,'r') as f:

????(le, clf) = pickle.load(f)# le - label and clf - classifer

????[2] 進行圖像預(yù)處理

????—> 將輸入圖像進行顏色轉(zhuǎn)換

rgbImg = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)

????—> 調(diào)用之前準備好的 dlib 模型 align 將圖像進行對圖像中的人臉進行識別入撒,并截取出來

bb = align.getAllFaceBoundingBoxes(rgbImg)

alignedFaces = []

for box in bb:

????alignedFaces.append(

????????align.align(

????????????args.imgDim,

????????????rgbImg,

????????????box,

????????????landmarkIndices=openface.AlignDlib.OUTER_EYES_AND_NOSE))

????—> 對識別出來的人臉隆豹,使用之前準備好的神經(jīng)網(wǎng)絡(luò)模型 net 進行特征轉(zhuǎn)換

reps = []

for alignedFace in alignedFaces:

????reps.append(net.forward(alignedFace))

[3] 對處理好的圖像特征值進行分類預(yù)測

for rep in reps:

????try:

????????rep = rep.reshape(1, -1) ?# 對特征值的形式進行轉(zhuǎn)換,將其轉(zhuǎn)換成一行

????except:?? ??? ??? ??? ??? ??? ??? ?? ?# 當 rep 為空時茅逮,跳出

????????print("No Face detected")

????????return(None,None)

????predictions = clf.predict_proba(rep).ravel() ? ? # 對 rep 進行預(yù)測

????maxI = np.argmax(predictions)?? ??? ??? ??? ??? ?? ?# 找出預(yù)測概率最大的那個結(jié)果的下標

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # max index

????persons.append(le.inverse_transform(maxI)) ?# 找到這個最大預(yù)測值所對應(yīng)的人名

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?#(類別)璃赡,并放入 persons 數(shù)組中

????confidences.append(predictions[maxI])?? ?? ? ? # 將最大預(yù)測概率的值放入

? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? # confidences 數(shù)組中




????最后我們來總結(jié)一下,人臉識別的邏輯十分簡單氮唯,即將人臉從圖片中識別出來鉴吹,抽象轉(zhuǎn)換為計算機更容易理解的結(jié)構(gòu),并通過分類算法對訓(xùn)練數(shù)據(jù)進行訓(xùn)練惩琉,然后用訓(xùn)練好的模型進行分類豆励。

????由于人臉識別的應(yīng)用已經(jīng)很多年了,第一步中的人臉提取算法十分成熟瞒渠,我們甚至都不需要知道其中的具體細節(jié)良蒸,只要懂得如何調(diào)用 dlib 工具對人臉進行提取即可,而要在人臉識別上獲得很好的效果伍玖,除了需要足夠的訓(xùn)練數(shù)據(jù)之外嫩痰,就在于第二步和第三步模型算法的選擇和調(diào)優(yōu)上了。但這不是這篇的重點窍箍,我們下次再說

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末串纺,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子椰棘,更是在濱河造成了極大的恐慌纺棺,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,682評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件邪狞,死亡現(xiàn)場離奇詭異祷蝌,居然都是意外死亡,警方通過查閱死者的電腦和手機帆卓,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,277評論 3 395
  • 文/潘曉璐 我一進店門巨朦,熙熙樓的掌柜王于貴愁眉苦臉地迎上來米丘,“玉大人,你說我怎么就攤上這事糊啡≈舨椋” “怎么了?”我有些...
    開封第一講書人閱讀 165,083評論 0 355
  • 文/不壞的土叔 我叫張陵棚蓄,是天一觀的道長靶累。 經(jīng)常有香客問我,道長癣疟,這世上最難降的妖魔是什么挣柬? 我笑而不...
    開封第一講書人閱讀 58,763評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮睛挚,結(jié)果婚禮上邪蛔,老公的妹妹穿的比我還像新娘。我一直安慰自己扎狱,他們只是感情好侧到,可當我...
    茶點故事閱讀 67,785評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著淤击,像睡著了一般匠抗。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上污抬,一...
    開封第一講書人閱讀 51,624評論 1 305
  • 那天汞贸,我揣著相機與錄音,去河邊找鬼印机。 笑死矢腻,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的射赛。 我是一名探鬼主播多柑,決...
    沈念sama閱讀 40,358評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼楣责!你這毒婦竟也來了竣灌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,261評論 0 276
  • 序言:老撾萬榮一對情侶失蹤秆麸,失蹤者是張志新(化名)和其女友劉穎初嘹,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蛔屹,經(jīng)...
    沈念sama閱讀 45,722評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡削樊,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年豁生,在試婚紗的時候發(fā)現(xiàn)自己被綠了兔毒。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片漫贞。...
    茶點故事閱讀 40,030評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖育叁,靈堂內(nèi)的尸體忽然破棺而出迅脐,到底是詐尸還是另有隱情,我是刑警寧澤豪嗽,帶...
    沈念sama閱讀 35,737評論 5 346
  • 正文 年R本政府宣布谴蔑,位于F島的核電站,受9級特大地震影響龟梦,放射性物質(zhì)發(fā)生泄漏隐锭。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,360評論 3 330
  • 文/蒙蒙 一计贰、第九天 我趴在偏房一處隱蔽的房頂上張望钦睡。 院中可真熱鬧,春花似錦躁倒、人聲如沸荞怒。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,941評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽褐桌。三九已至,卻和暖如春象迎,著一層夾襖步出監(jiān)牢的瞬間荧嵌,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,057評論 1 270
  • 我被黑心中介騙來泰國打工砾淌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留完丽,地道東北人。 一個月前我還...
    沈念sama閱讀 48,237評論 3 371
  • 正文 我出身青樓拇舀,卻偏偏與公主長得像逻族,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子骄崩,可洞房花燭夜當晚...
    茶點故事閱讀 44,976評論 2 355

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理聘鳞,服務(wù)發(fā)現(xiàn),斷路器要拂,智...
    卡卡羅2017閱讀 134,659評論 18 139
  • 人臉識別抠璃,基于人臉部特征信息識別身份的生物識別技術(shù)。攝像機脱惰、攝像頭采集人臉圖像或視頻流搏嗡,自動檢測、跟蹤圖像中人臉,...
    利炳根閱讀 1,886評論 0 1
  • 本章學(xué)習(xí)應(yīng)該回答的三個問題: 1. 怎樣識別用于分類文章的顯著特征采盒? 2. 怎樣構(gòu)建語言模型旧乞,用于自動語言處理? ...
    shashaslife閱讀 547評論 0 0
  • 十七、weex 1.實現(xiàn)原理 2.熱更新技術(shù)烦租,JSPatch
    MethodSwizzling閱讀 168評論 0 0
  • AMD 是 RequireJS 在推廣過程中對模塊定義的規(guī)范化產(chǎn)出延赌。 CMD 是 SeaJS 在推廣過程中對模塊定...
    Man僵小魚閱讀 233評論 0 0