天天看點

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

一般來說,人臉識别分三步走:

  1. 找人臉:圖檔中找出含人臉的區域框出來
  2. 對齊人臉:将人臉的眼鏡鼻子嘴巴等标出來,以此作為依據對齊人臉
  3. 識别:将對齊的人臉進行識别,判定這張臉究竟是誰

本篇要介紹的損失函數,用于第三步驟,聚焦于更準确地識别這張臉究竟屬于誰,本質上屬于一個分類問題。

一言以蔽之ArcFace、SphereFace、CosFace三個損失函數相對于前輩們而言,改進的一個核心思路就是:

隻有平常(train)更刻苦的訓練,才有可能在比賽中(test)中得到更好的結果。

它們都對卷積神經網絡提出了更高的目标,在訓練階段更為艱難,也是以讓其成為了一個更好的分類器。

一、從前輩說起

首先談談他們的前輩:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

維基百科介紹:

Softmax函數 ,或稱 歸一化指數函數 [1],是邏輯函數的一種推廣。它能将一個含任意實數的K維向量
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
“壓縮”到另一個K維實向量
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
中,使得每一個元素的範圍都在
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
之間,并且所有元素的和為1。該函數的形式通常按下面的式子給出:
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

簡單來說 softmax 将一組向量進行壓縮,使得到的向量各元素之和為 1,而壓縮後的值便可以作為置信率,是以常用于分類問題。另外,在實際運算的時候,為了避免上溢和下溢,在将向量丢進softmax之前往往先對每個元素減去其中最大值,即:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
想了解更多,可以參考:憶臻:softmax函數計算時候為什麼要減去一個最大值?

再談談一個容易搞混的東西:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

上面我們丢入一個長度為

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

向量,得到

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

,而softmax loss呢,則是:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

其中

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

是一個長度為

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

的one-hot向量,即

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

,隻有ground truth對應的

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

。是以也可以簡寫為:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

到這裡我們不妨在看看交叉熵

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

其中

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

是真實分布,在分類任務中,

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

實際上等價于上面的

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

。而

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

則是預測分布,在分類任務中

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

實際上等價于上面的

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

。這樣一來進行化簡就得到:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

我咋覺得這麼眼熟呢...

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

是以,我們可以得到:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
參考連結: https:// blog.csdn.net/u01438016 5/article/details/77284921

二、SphereFace

論文位址: https:// arxiv.org/pdf/1704.0806 3.pdf

要想增強

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

的分類能力,其實就是要在分布上做到兩點:

  1. 讓同類之間距離更近
  2. 讓不同類之間距離更遠

不妨繼續看看

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

其中

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

代表兩個向量

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

之間的夾角,如果對

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

歸一化,将偏置

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

置為0,即

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

,則有:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

下标

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

表示

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

對于

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

我們乘上一個大于等于1的整數

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

這樣不僅放大了類之間的距離,也因放大了同類

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

之間的間隔而使類内更聚攏。

不過上述公式仍有問題:原來的

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

,如今

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

超出了向量之間的夾角函數

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

定義域範圍

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

咋辦?

那就變個函數呗,把n個cos怼起來變成一個遞減的連續的函數:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

這樣一來:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

如此我們就得到了SphereFace的損失函數

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

原論文則是:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

其中

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

表示第

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

個樣本,

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

表示第

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

個樣本的

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

标簽,

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

表示第

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

和樣本

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

之間的夾角。

論文中的可視化圖檔:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

Pytorch代碼實作:

# SphereFace
           

三、CosFace

論文位址: https:// arxiv.org/pdf/1801.0941 4.pdf

和SphereFace類似,CosFace也是從

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

的餘弦表達形式入手,令

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

。與此同時,作者發現

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

對于分類并沒有啥幫助,是以幹脆将其固定

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

,是以有:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

應該代表歸一化的

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

接下來與上文

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

類似的是也引入了常數

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

,不同的是這裡的

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

是加上去的:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

以上我們就得到了CosFace中提出的

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

代碼實作:

# CosFace
           

四、ArcFace

論文位址: https:// arxiv.org/pdf/1801.0769 8.pdf

話不多說,直接上公式:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

可以看到和CosFace非常類似,隻是将

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

作為角度加上去了,這樣就強行拉大了同類之間的角度,使得神經網絡更努力地将同類收得更緊。

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

僞代碼實作步驟:

  1. pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
    進行歸一化
  2. pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
    進行歸一化
  3. 計算
    pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
    得到預測向量
    pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
  4. pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
    中挑出與ground truth對應的值
  5. 計算其反餘弦得到角度
  6. 角度加上m
  7. 得到挑出從
    pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
    中挑出與ground truth對應的值所在位置的獨熱碼
  8. pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...
    通過獨熱碼放回原來的位置
  9. 對所有值乘上固定值
    pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

代碼實作:

# ArcFace
           

到此ArcFace、SphereFace、CosFace的損失函數就介紹完啦~

參考連結:https://blog.csdn.net/fuwenyan/article/details/79657738

歡迎關注個人微信公衆号:

pytorch如何定義損失函數_人臉識别損失函數簡介與Pytorch實作:ArcFace、SphereFace、CosFace...

歡迎掃碼關注~