人臉識別之歐氏距離——餘弦距離

最近訓練了一個人臉識別模型,在測試集上的效果較之前的模型相比(lfw,cfp_fp,agedb_30),accucay都有所提升,但是在自己的測試集效果上卻特別差。然後仔細的研讀了相應的測試代碼,先把訓練工程中的代碼貼出來:

diff = np.subtract(embeddings1, embeddings2)#做減法
dist = np.sum(np.square(diff), 1)#計算各元素的平方後加和

InsightFace中的代碼使用的是歐氏距離,使用網絡結構提取的特徵進行歐式距離計算兩個特徵的相似度;

而我的測試代碼使用的是餘弦距離,測試代碼:

regmat = np.array(regfeat) #regfeat特徵
capmat = np.array(capfeat) #capfeat特徵

regmat_T = regmat.T
SimilarityMatrix = np.dot(capmat, regmat_T)#dot()返回的是兩個矩陣的乘積

那在人臉識別當中歐氏距離和餘弦距離是個什麼樣的存在?

歐氏距離是最常見的距離度量,衡量的是多維空間中各個點之間的絕對距離。公式如下:

餘弦相似度用向量空間中兩個向量夾角的餘弦值作爲衡量兩個個體間差異的大小。相比距離度量,餘弦相似度更加註重兩個向量在方向上的差異,而非距離或長度上。公式如下:

Cosine Similarity

歐式距離與餘弦距離區別(以下內容參考:https://blog.csdn.net/wangdong2017/article/details/81302799):

distance and similarity

三維座標中的兩個向量之間的夾角就是餘弦距離cosθ,而歐式距離是dist(A,B),距離度量衡量的是空間各點間的絕對距離,跟各個點所在的位置座標(即個體特徵維度的數值)直接相關;而餘弦相似度衡量的是空間向量的夾角,更加的是體現在方向上的差異,而不是位置。當保持AB兩點的方向不變,而延長B點,則餘弦距離不會改變,但是歐氏距離就會發生變化。這就是歐式距離與餘弦距離區別;

而在人臉識別任務中,歸一化後的向量的餘弦距離和歐氏距離是等價的(以下內容轉載自:https://blog.csdn.net/liuweiyuxiang/article/details/88736615);

å¨è¿éæå¥å¾çæè¿°

(以上的公式轉載自https://www.zhihu.com/question/19640394/answer/207795500

上面的公式可以再推一步:

                                                                    euc_distance=2(1−cos(A,B))​

我們將cos(A,B)cos(A,B)cos(A,B)稱爲餘弦相似度,1−cos(A,B)1-cos(A,B)1−cos(A,B)稱爲餘弦距離,可以看到餘弦距離和cos距離是等價的。推廣到高緯空間可以得到一樣的結論。
現在的人臉識別方法中,會對特徵做歸一化,歸一化後特徵的餘弦距離和cos距離是等價的,所以使用哪個距離都是OK的。

後面內容有提到一般會將人臉識別的餘弦距離轉化成歐式距離來進行計算,這裏是關係到算法的計算複雜度,不太瞭解,感興趣的同學可以查閱以上的參考文獻;

感謝以下內容分享的博主!

https://www.zhihu.com/question/19640394/answer/207795500

https://blog.csdn.net/liuweiyuxiang/article/details/88736615

https://blog.csdn.net/wangdong2017/article/details/81302799

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