FaceNet人臉識別(一)
與其他的深度學(xué)習(xí)方法在人臉上的應(yīng)用不同,F(xiàn)aceNet并沒有用傳統(tǒng)的softmax的方式去進行分類學(xué)習(xí),然后抽取其中某一層作為特征,而是直接進行端對端學(xué)習(xí)一個從圖像到歐式空間的編碼方法,然后基于這個編碼再做人臉識別、人臉驗證和人臉聚類等。
FaceNet算法有如下要點:
?
去掉了最后的softmax,而是用元組計算距離的方式來進行模型的訓(xùn)練。使用這種方式學(xué)到的圖像表示非常緊致,使用128位足矣。
元組的選擇非常重要,選的好可以很快的收斂。
?
對于整個FaceNet結(jié)構(gòu),這里的特征提取可以當(dāng)作一個黑盒子,可以采用各式各樣的網(wǎng)絡(luò)。最早的FaceNet采用兩種深度卷積網(wǎng)絡(luò):經(jīng)典Zeiler&Fergus架構(gòu)和Google的Inception v1。最新的FaceNet進行了改進,主體模型采用一個極深度網(wǎng)絡(luò)Inception ResNet -v2,由3個帶有殘差連接的Inception模塊和1個Inceptionv4模塊組成。
FaceNet 結(jié)構(gòu)

從上面的圖中可以看到,整個FaceNet分為5個部分,具體表示如下:
batch :是指輸入的人臉圖像樣本,這里的樣本是已經(jīng)經(jīng)過人臉檢測找到人臉并裁剪到固定尺寸(例如160x160)的圖片樣本。
?Deep architecture:指的是采用一種深入學(xué)習(xí)架構(gòu)例如imagenet歷年冠軍網(wǎng)絡(luò)中的VGG,GoogleNet等,本文中我們將使用MoblieNetv2 作為主要的特征提取網(wǎng)絡(luò)。
L2 :是指特征歸一化(使其特征的||f(x)||2=1,這里是2次方的意思。這樣所有圖像的特征都會被映射到一個超球面上)
Embeddings:就是前面經(jīng)過深度學(xué)習(xí)網(wǎng)絡(luò),L2歸一化后生成的特征向量(這個特征向量就代表了輸入的一張樣本圖片)
Triplet Loss:就是有三張圖片輸入的Loss(之前的都是Double Loss或者 是 SingleLoss)。直接學(xué)習(xí)特征間的可分性:相同身份之間的特征距離要盡可能的小,而不同身份之間的特征距離要盡可能的大
主體網(wǎng)絡(luò)更改
這里我們需要提及兩個比較重要的點,我們將使用MoblieNet替換原本的網(wǎng)絡(luò),這是是谷歌在2017年提出,是一款專注在移動設(shè)備和嵌入式設(shè)備上的輕量級CNN神經(jīng)網(wǎng)絡(luò),并迅速衍生了V1 V2以及V3版本,它相比于傳統(tǒng)的CNN網(wǎng)絡(luò),在準確率小幅減低的前提下,大大減少模型參數(shù)的運算量。模型結(jié)構(gòu)如下:

Triplet Loss
另一個是Triplet Loss,在深度學(xué)習(xí)中,很多度量學(xué)習(xí)的方法都是使用成對成對的樣本進行l(wèi)oss計算的,這類方法被稱為 pair-based deep metric learning。例如,在訓(xùn)練模型的過程,我們隨意的選取兩個樣本,使用模型提取特征,并計算他們特征之間的距離。如果這兩個樣本屬于同一個類別,那我們希望他們之間的距離應(yīng)該盡量的小,甚至為0;如果這兩個樣本屬于不同的類別,那我們希望他們之間的距離應(yīng)該盡量的大,甚至是無窮大。正是根據(jù)這一原則,衍生出了許多不同類型的pair-based loss,使用這些loss對樣本對之間的距離進行計算,并根據(jù)生成的loss使用各種優(yōu)化方法對模型進行更新。
?
其中,使用最為廣泛的就當(dāng)屬三元組損失了(Triplet loss),Triplet Loss的思想是讓負樣本對之間的距離大于正樣本對之間的距離,在訓(xùn)練過的過程中同時選取一對正樣本對和負樣本對,且正負樣本對中有一個樣本是相同的。以狗、狼、貓數(shù)據(jù)為例,首先隨機選取一個樣本,此樣本稱之為anchor 樣本,假設(shè)此樣本類別為狗,然后選取一個與anchor樣本同類別的樣本(另一個狗狗),稱之為positive,并讓其與anchor樣本組成一個正樣本對(anchor-positive);再選取一個與anchor不同類別的樣本(貓),稱之為negative,讓其與anchor樣本組成一個負樣本對(anchor-negative)。這樣一共選取了三個樣本,這也是為什么叫triplet的原因了。

Triplet Loss 的公式如下,通過公式可以看出,當(dāng)負樣本對之間的距離比正樣本對之間的距離大m的時候,loss為0 ,認為當(dāng)前模型已經(jīng)學(xué)的不錯了,所以不對模型進行更新。

Triplet Loss最先被用于人臉識別中,如下圖,輸入一個triplet對(三張圖像),使用同一個網(wǎng)絡(luò)對這個三張圖像進行特征提取,得到三個embedding向量,三個向量輸入到Triplet Loss中得到loss,然后根據(jù)loss值使用反向傳播算法對模型進行更新。

對于FaceNet的網(wǎng)絡(luò)結(jié)構(gòu)解析就到這里了,下個推文中我們將對數(shù)據(jù)進行解析,并進行處理,喜歡的可以繼續(xù)關(guān)注哦!
