一 寫在前面
未經允許唉地,不得轉載耗啦,謝謝~~
最近在學圖像檢索這一方面的內容嗅骄,所以挑了兩篇比較經典的論文來學習:
- 論文:Learning visual similarity for product design with convolutional neural networks
- 論文:FaceNet: A Unified Embedding for Face Recognition and Clustering
兩篇論文分別是contrastive loss和triplet loss的應用半夷。
之前已經寫了第一篇文章的總結論文 | 圖像檢索經典論文解讀《Learning visual similarity for product design with convolutional neural networks》婆廊,現在把FaceNet這篇也看掉了,所以趁熱整理一下巫橄。
二 文章簡介
1 整體介紹
- 首先看題目就可以知道淘邻,文章提出了一個FaceNet結構,可以用于臉部識別和聚類的統一嵌入網絡湘换。
- 簡單來說就是可以學習每張人臉的歐幾里德距離宾舅,取兩張人臉圖像歐幾里德距離的L2范式的平方就可以直接對應于這兩張人臉圖像之間的相似性统阿。
- L2的平方小,相似度高筹我;
- L2的平方大扶平,相似度低;
- 得到嵌入距離之后就可以很快的解決一下問題:
- face verification: 人臉驗證蔬蕊,設置一個閾值结澄,距離小于閾值即可;
- face recognition: 人臉識別岸夯,可以用k-NN鄰近算法麻献;
- face clustering:人臉聚類,可以用k-means等算法猜扮;
跟之前那篇論文一樣勉吻,本質在于學習到圖像的表示,所以論文題目稱之為統一的嵌入網絡旅赢。
如下圖展示的是人臉驗證
得到2張人臉的相似度餐曼,小于閾值1.1即判定為同一個人。
2 文章主要貢獻
文章主要完成了FaceNet這樣一個用于學習人臉圖像特征的模型鲜漩,主要有以下幾點:
- 直接用CNN網絡進行端到端的訓練源譬;
- 使用了triplet loss,并提出了比較好的triplet 樣本挖掘方法孕似;
- 僅僅用128字節(jié)的大小表示人臉就達到state-of-art 水平踩娘。
這里我主要總結了網絡結構部分的內容,其他的內容感興趣的小伙伴可以再點擊最下面的參考文獻閱讀原文~~~
三 網絡結構介紹
1 模型結構
如上圖所示即為模型的整體結構喉祭。
假設我們先不管中間
DEEP ARCHITECTURE
的具體結構养渴,還是將其作為一個黑盒子f(x)。輸入人臉圖像數據x泛烙,通過深度CNN之后就會得到一個f(x),再對其做L2歸一化之后就可以得到對這張人臉的表示
embedding
理卑。然后用triplet loss(anchor, positive, negative)方法對這整個模型進行端到端的訓練。
接下來我會具體介紹網絡模型中的各個部分蔽氨。
2 triplet loss
1. 宏觀理解
對于一組triplet sample(anchor, positive, negative)藐唠;
我們旨在通過神經網絡的訓練與學習讓(anchor,positive)的距離變小,讓(abchor,negative)的距離變大鹉究;
2. 函數建模
- 我們用(Xa,Xp,Xn)來表示一組數據宇立;
-
我們希望滿足以下條件:
- 對于任意一組數據,我們都希望(anchor,positive)之間的距離+margin < (anchor,negative)之間的距離自赔;
3. loss function
-
根據上面的式(1), (2)妈嘹,我們可以得到如下的損失函數:
我們的目標就轉變?yōu)橛柧毦W絡模型使得上式(3)的loss function不斷變小。
3 triplet 樣本選擇
1. 目標
- 如何選擇triplet sample對于模型的訓練以及最后的結構都非常重要绍妨;
- 因此本文提出了 一種用于尋找較好triplet sample的方法润脸,旨在讓triplet的難度隨著網絡的訓練而逐漸增加柬脸;
2. hard triplet
hard triplet
指的就是那些比較難判斷的sample,體現在anchor與正樣本的距離較大毙驯,anchor與負樣本的距離較械苟椤;這樣能夠訓練網絡模型識別的難度尔苦;
所以用數學表示涩馆,即我們希望能夠找到這樣的postive與negative:
3. 難點
- 對于每一個anchor,都想選擇一個hard triplet是有難處的允坚;
- 首先在所有的訓練集合內是選擇最難的positive與negative是不現實的魂那,需要耗費大量的時間與計算;
- 其次這樣選出來的很可能是錯誤標記或者是不良成像的圖像稠项,反而會導致training的過程并不好涯雅;
4. 解決方法
我們直觀可以想到以下兩種策略:
- 每n步線下生成:用最近一次訓練好的網絡在訓練集的自己種選擇argmax的positive以及argmin的negative
- 線上生成:在mini-batch中選擇hard positive/nagative;
- 本文做了兩部分的實驗,但是文中展示出的用的是線上生成的方式展运,線下生成的沒有給出結果展示活逆。
4 CNN網絡結構
文章一共探索了兩種神經網絡:
- zeiler & Fergus model (NN1)
- GoogleNet Style Inception model (NN2)
- 兩個網絡都能接受[220,220,3]的輸入,輸出[1,1,128]維的輸出拗胜;
- 這邊的細節(jié)就不再說了蔗候,反正就是一個特征提取網絡的選擇問題;
5 其他細節(jié)補充
1. 關于batch內樣本分配
- 為了保證合理性埂软,一定要保證每個triplet sampl都是正負樣本的锈遥;
- 先保證每個minibatch中每個identity都有40張positive人臉圖像;
- 再隨機將neagtive faces放到minibatch中勘畔;
2. 關于batch_size
- 在深度神經網梯度下降中所灸,我們希望
batch_size
不能太大; - 在triplet section中我們又希望
batch_size
不能太徐牌摺爬立; - 最后文章中取了1800/batch;
3. 關于網絡參數
- 使用SGD優(yōu)化;
- 初始learning_rate=0.05
- margin:α=0.2
4. 關于semi-hard
- 如果全部都用hardest sample的話會導致模型坍塌, f(x)趨于0万哪;
- 訓練難度可以由難到簡侠驯;
-
也可以選擇semi-hard:
四 寫在最后
就寫到這里吧,嘻嘻~~~~~~~~
ヾ(?°?°?)??
希望自己能一直保持寫博客的習慣壤圃,保持記錄的習慣陵霉,保持分享的習慣。