近幾年來(lái),興起了一股人工智能熱潮,讓人們見(jiàn)到了AI的能力和強(qiáng)大,比如圖像識(shí)別,語(yǔ)音識(shí)別,機(jī)器翻譯,無(wú)人駕駛等等??傮w來(lái)說(shuō),AI的門檻還是比較高,不僅要學(xué)會(huì)使用框架實(shí)現(xiàn),更重要的是,需要有一定的數(shù)學(xué)基礎(chǔ),如線性代數(shù),矩陣,微積分等。
幸慶的是,國(guó)內(nèi)外許多大神都已經(jīng)給我們?cè)旌?ldquo;輪子”,我們可以直接來(lái)使用某些模型。今天就和大家交流下如何實(shí)現(xiàn)一個(gè)簡(jiǎn)易版的人臉對(duì)比,非常有趣!
整體思路:
- 預(yù)先導(dǎo)入所需要的人臉識(shí)別模型
- 遍歷循環(huán)識(shí)別文件夾里面的圖片,讓模型“記住”人物的樣子
- 輸入一張新的圖像,與前一步文件夾里面的圖片比對(duì),返回最接近的結(jié)果
使用到的第三方模塊和模型:
模塊:os,dlib,glob,numpy
模型:人臉關(guān)鍵點(diǎn)檢測(cè)器,人臉識(shí)別模型
1.導(dǎo)入需要的模塊和模型
這里解釋一下兩個(gè)dat文件:
它們的本質(zhì)是參數(shù)值(即神經(jīng)網(wǎng)絡(luò)的權(quán)重)。人臉識(shí)別算是深度學(xué)習(xí)的一個(gè)應(yīng)用,事先需要經(jīng)過(guò)大量的人臉圖像來(lái)訓(xùn)練。所以一開(kāi)始我們需要去設(shè)計(jì)一個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),來(lái)“記住”人類的臉。
對(duì)于神經(jīng)網(wǎng)絡(luò)來(lái)說(shuō),即便是同樣的結(jié)構(gòu),不同的參數(shù)也會(huì)導(dǎo)致識(shí)別的東西不一樣。在這里,這兩個(gè)參數(shù)文件就對(duì)應(yīng)了不同的功能(它們對(duì)應(yīng)的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)也不同):
shape_predictor.dat這個(gè)是為了檢測(cè)人臉的關(guān)鍵點(diǎn),比如眼睛,嘴巴等等;dlib_face_recognition.dat是在前面檢測(cè)關(guān)鍵點(diǎn)的基礎(chǔ)上,生成人臉的特征值。
所以后面使用dlib模塊的時(shí)候,其實(shí)就是相當(dāng)于,調(diào)用了某個(gè)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),再把預(yù)先訓(xùn)練好的參數(shù)傳給我們調(diào)用的神經(jīng)網(wǎng)絡(luò)。順便提一下,在深度學(xué)習(xí)領(lǐng)域中,往往動(dòng)不動(dòng)會(huì)訓(xùn)練出一個(gè)上百M(fèi)的參數(shù)模型出來(lái),是很正常的事。
2.對(duì)訓(xùn)練集進(jìn)行識(shí)別
在這一步中,我們要完成的是,對(duì)圖片文件夾里面的人物圖像,計(jì)算他們的人臉特征,并放到一個(gè)列表里面,為了后面可以和新的圖像進(jìn)行一個(gè)距離計(jì)算。關(guān)鍵地方會(huì)加上注釋,應(yīng)該不難理解,具體實(shí)現(xiàn)為:
當(dāng)你做完這一步之后,輸出列表descriptors看一下,可以看到類似這樣的數(shù)組,每一個(gè)數(shù)組代表的就是每一張圖片的特征量(128維)。然后我們可以使用L2范式(歐式距離),來(lái)計(jì)算兩者間的距離。
舉個(gè)例子,比如經(jīng)過(guò)計(jì)算后,A的特征值是[x1,x2,x3],B的特征值是[y1,y2,y3], C的特征值是[z1,z2,z3],
那么由于A和B更接近,所以會(huì)認(rèn)為A和B更像。想象一下極端情況,如果是同一個(gè)人的兩張不同照片,那么它們的特征值是不是應(yīng)該會(huì)幾乎接近呢?知道了這一點(diǎn),就可以繼續(xù)往下走了。
3.處理待對(duì)比的圖片
其實(shí)是同樣的道理,如法炮制,目的就是算出一個(gè)特征值出來(lái),所以和第二步差不多。然后再順便計(jì)算出新圖片和第二步中每一張圖片的距離,再合成一個(gè)字典類型,排個(gè)序,選出最小值,搞定收工!
4.運(yùn)行看一下
這里我用了一張“斷水流大師兄”林國(guó)斌的照片,識(shí)別的結(jié)果是,果然,是最接近黎明了(嘻嘻,我愛(ài)黎明)。但如果你事先在訓(xùn)練圖像集里面有放入林國(guó)斌的照片,那么出來(lái)的結(jié)果就是林國(guó)斌了。
為什么是黎明呢?我們看一下輸入圖片里的人物***與每個(gè)明星的距離,輸出打印一下:
沒(méi)錯(cuò),他和黎明的距離是最小的,所以和他也最像了!