人臉識別之FaceNet

這是一篇2015年的cvpr,FaceNet: A UnifiedEmbedding for Face Recognition and Clustering,取得了當時人臉識別的state-of-the-art,論文主要提出了tripletloss這一思想。

如上圖所示,簡單的說,triplet就是一個由(Anchor ,Positive,Negative)組成的三元組。其中,Anchor(表示為Xa)為錨,表示從資料集中隨機選擇的一個樣本,Positive(表示為Xp)表示和Anchor屬於同一類別的樣本,Negative(表示為Xn)表示和Anchor屬於不同類別的樣本。

         我們分別用下面的三個元素來表示其學習到的特徵向量:

tripletloss的作用就是訓練的過程中,使得Xa與Xp之間的距離儘可能小,Xa與Xn之間的距離儘可能大,為了絕對的區分開,真正做到discriminative,還要使得Xa與Xp的距離比Xa與Xn的距離小一個間隔,類似svm中的幾何間隔。

triplet loss相應的目標函式為

即目標函式取0或者上面式子的最大值,當上面式子有值的時候,表示會產生損失,為0的時候表示沒有產生損失。

在逆向傳播的過程中,梯度按下面的公式計算:

具體在caffe中,triplet loss的實現,可以參考happynear在github上分享的他自己維護的caffe,裡面有相應的實現。https://github.com/happynear/caffe-windows

另外CMU開源的openface中也用到了基於torch的tripletloss。

基於TensorFlow的facenet的實現,目前lfw識別率已經更新到了99.4%,https://github.com/davidsandberg/facenet