深度學習—從入門到放棄(八)使用CNN進行人臉識別
問題重述
假設我們需要進行面部識別系統的開發,我們的思路如下:
- 有一個有K個人的人臉資料的資料集
- 進行人臉識別時我們先有一個輸入影像
- 輸出影像為輸入影像在資料集里的分類標簽
針對整個思路我們又面臨著如下的挑戰:
- 人的個數多但是資料集里每一個人對應的影像又很少,即資料量小,我們需要在給定較少輸入影像的情況下進行人臉識別
鑒于以上,我們不選擇簡單的分類器,而是選擇CNN,讓CNN去學習相似度(類似于聚類)
使用 CNN 進行人臉識別
大型 CNN 的一種應用是面部識別,面部識別中的問題表述與我們目前看到的影像分類略有不同,在面部識別中,我們不希望模型可以學習固定數量的個體,如果是這種情況,那么要學習一個新人,就需要修改架構的輸出部分并重新訓練以適應新人,
相反,我們訓練一個模型來學習嵌入,其中來自同一個人的影像在嵌入空間中彼此靠近,而不同人對應的影像相距很遠,當模型被訓練時,它將影像作為輸入并輸出與影像對應的嵌入向量,
查看資料
import requests, zipfile, io, os
# original link: https://github.com/ben-heil/cis_522_data.git
url = 'https://osf.io/2kyfb/download'
fname = 'faces'
if not os.path.exists(fname+'zip'):
print("Data is being downloaded...")
r = requests.get(url, stream=True)
z = zipfile.ZipFile(io.BytesIO(r.content))
z.extractall()
print("The download has been completed.")
else:
print("Data has already been downloaded.")
一個訓練有素的面部識別系統應該能夠將同一個人的不同影像相對靠近地映射在一起,我們將加載三個人的 15 張影像

預處理
現在我們已經加載了影像,我們需要對它們進行預處理,為了使網路更容易學習影像,我們將它們裁剪為僅包含人臉,
MTCNN檢測人臉并在人臉周圍裁剪影像,然后我們將所有影像堆疊在一個張量中,

嵌入預訓練網路
我們加載了一個名為FaceNet的預訓練面部識別模型,它在VGGFace2資料集上進行了訓練,該資料集包含 9131 個人的331萬張影像,
我們使用預訓練模型來計算所有輸入影像的嵌入,
resnet = InceptionResnetV1(pretrained='vggface2').eval().to(DEVICE)
在這里我們計算了我們資料集里這三個人各自的嵌入向量,并且在通過PCA降維后進行展示,
# Calculate embedding
resnet.classify = False
bruce_embeddings = resnet(bruce_tensor.to(DEVICE))
neil_embeddings = resnet(neil_tensor.to(DEVICE))
pam_embeddings = resnet(pam_tensor.to(DEVICE))

由上圖我們可以發現每個個體對應的影像在嵌入空間中相互分離,并且呈現一種聚類的趨勢,
總結

上圖顯示了在人臉識別系統中,我們是如何通過嵌入向量的歐幾里得距離去衡量影像和影像之間相似度的程序,
歡迎大家關注公眾號奇趣多多一起交流!

深度學習—從入門到放棄(一)pytorch基礎
深度學習—從入門到放棄(二)簡單線性神經網路
深度學習—從入門到放棄(三)多層感知器MLP
深度學習—從入門到放棄(四)優化器
深度學習—從入門到放棄(五)正則化
深度學習—從入門到放棄(六)CNN入門
深度學習—從入門到放棄(七)CNN進階,遷移學習
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299598.html
標籤:AI
下一篇:核磁共振重建演算法綜述
