論文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)
然後就可以正常訓練了,就是從訓練數據中隨機抽出來三個這種組合,然後直接就可以訓練了。