一般來說,人臉識别分三步走:
- 找人臉:圖檔中找出含人臉的區域框出來
- 對齊人臉:将人臉的眼鏡鼻子嘴巴等标出來,以此作為依據對齊人臉
- 識别:将對齊的人臉進行識别,判定這張臉究竟是誰
本篇要介紹的損失函數,用于第三步驟,聚焦于更準确地識别這張臉究竟屬于誰,本質上屬于一個分類問題。
一言以蔽之ArcFace、SphereFace、CosFace三個損失函數相對于前輩們而言,改進的一個核心思路就是:
隻有平常(train)更刻苦的訓練,才有可能在比賽中(test)中得到更好的結果。 它們都對卷積神經網絡提出了更高的目标,在訓練階段更為艱難,也是以讓其成為了一個更好的分類器。
一、從前輩說起
首先談談他們的前輩:
維基百科介紹:
Softmax函數 ,或稱 歸一化指數函數 [1],是邏輯函數的一種推廣。它能将一個含任意實數的K維向量 “壓縮”到另一個K維實向量 中,使得每一個元素的範圍都在 之間,并且所有元素的和為1。該函數的形式通常按下面的式子給出:
簡單來說 softmax 将一組向量進行壓縮,使得到的向量各元素之和為 1,而壓縮後的值便可以作為置信率,是以常用于分類問題。另外,在實際運算的時候,為了避免上溢和下溢,在将向量丢進softmax之前往往先對每個元素減去其中最大值,即:
想了解更多,可以參考:憶臻:softmax函數計算時候為什麼要減去一個最大值?
再談談一個容易搞混的東西:
上面我們丢入一個長度為
的
向量,得到
,而softmax loss呢,則是:
其中
是一個長度為
的one-hot向量,即
,隻有ground truth對應的
。是以也可以簡寫為:
到這裡我們不妨在看看交叉熵
:
其中
是真實分布,在分類任務中,
實際上等價于上面的
。而
則是預測分布,在分類任務中
實際上等價于上面的
。這樣一來進行化簡就得到:
我咋覺得這麼眼熟呢...
是以,我們可以得到:
參考連結: https:// blog.csdn.net/u01438016 5/article/details/77284921
二、SphereFace
論文位址: https:// arxiv.org/pdf/1704.0806 3.pdf
要想增強
的分類能力,其實就是要在分布上做到兩點:
- 讓同類之間距離更近
- 讓不同類之間距離更遠
不妨繼續看看
:
其中
代表兩個向量
之間的夾角,如果對
歸一化,将偏置
置為0,即
,則有:
下标
表示
。
對于
我們乘上一個大于等于1的整數
:
這樣不僅放大了類之間的距離,也因放大了同類
與
之間的間隔而使類内更聚攏。
不過上述公式仍有問題:原來的
,如今
超出了向量之間的夾角函數
定義域範圍
咋辦?
那就變個函數呗,把n個cos怼起來變成一個遞減的連續的函數:
這樣一來:
如此我們就得到了SphereFace的損失函數
原論文則是:
其中
表示第
個樣本,
表示第
個樣本的
标簽,
表示第
和樣本
之間的夾角。
論文中的可視化圖檔:
Pytorch代碼實作:
# SphereFace
三、CosFace
論文位址: https:// arxiv.org/pdf/1801.0941 4.pdf
和SphereFace類似,CosFace也是從
的餘弦表達形式入手,令
。與此同時,作者發現
對于分類并沒有啥幫助,是以幹脆将其固定
,是以有:
應該代表歸一化的
。
接下來與上文
類似的是也引入了常數
,不同的是這裡的
是加上去的:
以上我們就得到了CosFace中提出的
代碼實作:
# CosFace
四、ArcFace
論文位址: https:// arxiv.org/pdf/1801.0769 8.pdf
話不多說,直接上公式:
可以看到和CosFace非常類似,隻是将
作為角度加上去了,這樣就強行拉大了同類之間的角度,使得神經網絡更努力地将同類收得更緊。
僞代碼實作步驟:
- 對 進行歸一化
- 對 進行歸一化
- 計算 得到預測向量
- 從 中挑出與ground truth對應的值
- 計算其反餘弦得到角度
- 角度加上m
- 得到挑出從 中挑出與ground truth對應的值所在位置的獨熱碼
- 将 通過獨熱碼放回原來的位置
- 對所有值乘上固定值
代碼實作:
# ArcFace
到此ArcFace、SphereFace、CosFace的損失函數就介紹完啦~
參考連結:https://blog.csdn.net/fuwenyan/article/details/79657738
歡迎關注個人微信公衆号:
歡迎掃碼關注~