人臉匹配學習記錄

論文FaceNet: A Unified Embedding for Face Recognition and Clustering

代碼:https://github.com/davidsandberg/facenet

需要注意的地方:

源碼中的facenet裏面最後輸出直接是全連接輸出,但是論文中卻說使用的是模爲1的輸出,因此train_tripletloss.py文件中在網絡預測以後,又對預測的logits後面加上了:

tf.nn.l2_normalize(x, dim, epsilon=1e-12, name=None) 
上式: 
x爲輸入的向量; 
dim爲l2範化的維數,dim取值爲0或0或1; 
epsilon的範化的最小值邊界;

然後再進行訓練。因此訓練中存儲的模型結構最後的輸出也加上了這個操作,因此在預測時結果直接就是被歸一化的。

大體思路

訓練一個將人臉抽象成128維向量的神經網絡,不是一個人臉那麼歐氏距離就大,否則就小。

流程

準備好人臉圖片,調整爲220大小,白化操作。

源碼中,網絡正確預測tf.subtract(pos_dist, neg_dist)是小於0,因此讓loss等於0。

網絡錯誤預測tf.subtract(pos_dist, neg_dist)是大於0,因此最小化這個值,這個值當然是越小越好。

增加了一個偏移量alpha,這個值找了半天沒找到,應該是大於0的但也不能太大的一個數。

pos_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, positive)), 1)
neg_dist = tf.reduce_sum(tf.square(tf.subtract(anchor, negative)), 1)

basic_loss = tf.add(tf.subtract(pos_dist, neg_dist), alpha)
loss = tf.reduce_mean(tf.maximum(basic_loss, 0.0), 0)

然後就可以正常訓練了,就是從訓練數據中隨機抽出來三個這種組合,然後直接就可以訓練了。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章