PFLD:簡單高效的實用人臉關鍵點檢測演算法

PaperWeekly發表於2019-04-17

PFLD:簡單高效的實用人臉關鍵點檢測演算法

研究背景

人臉關鍵點檢測,在很多人臉相關的任務中,屬於基礎模組,很關鍵。比如人臉識別、人臉驗證、人臉編輯等等。想做人臉相關的更深層次的應用,人臉關鍵點是繞不過去的點。正是因為它是一個基礎模組,所以對速度很敏感,不能太耗時,否則影響了系統整體的效率。所以對人臉關鍵點檢測的要求是,又準又快。

研究問題

人臉關鍵點目前存在的問題(不能又準又快)的原因如下:

1. 區域性變化:表情、區域性特殊光照、部分遮擋,導致一部分關鍵點偏離了正常的位置,或者不可見了; 

2. 全域性變化:人臉姿態、成像質量;

3. 資料不均衡在人臉資料裡面,資料不均衡體現在,大部分是正臉資料,側臉很少,所以對側臉、大角度的人臉不太準;

4. 模型效率:在 CNN 的解決方案中,模型效率主要由 backbone 網路決定。 

在實際使用中,人臉關鍵點的問題主要有兩個:1)對“點是否遮擋”判斷是否準確;2)對大角度人臉(+-60 度以內)點位置預測的準確性和穩定性。

解決思路

1. 修改 loss,增加關鍵點的空間約束項(三個姿態角)和資料均衡項;

2. backbone 採用 MobileNet(常規操作); 

3. 用 auxiliary network,讓點位置預測更穩定和魯棒(常規操作)。

復現指南

PFLD:簡單高效的實用人臉關鍵點檢測演算法

模型

損失函式

PFLD:簡單高效的實用人臉關鍵點檢測演算法

損失函式的意義在於表示差異,而且能表示真正的距離。特別是當物件本身具備 3D 屬性,而僅在 2D 上表示的時候,這樣的距離表示就是不準確的。本文作者認為,對於人臉這種物件,人臉 pose(更簡單的說是 3 個尤拉角)可以彌補一些人臉 3D 到 2D 的資訊損失。具體怎麼彌補? 

希望是網路可以學到 3D 姿態的資訊,最容易想到的方法是讓網路去預測三個角度,這麼做是可以的。進一步還能怎麼做?把預測的角度損失和點位置損失組合起來,具體的組合方式,比如相加,或者相乘。相加的方式比較類似多工損失,相乘的方式可以理解為一種加權,因為角度損失一般會歸一化到 0-1 之間。 

在實際中又發現,這個角度分佈,存在樣本不均衡的問題,所以又增加了樣本均衡項。

PFLD:簡單高效的實用人臉關鍵點檢測演算法

綠色框是預測的角度和 gt 的差值,通過 cos 變成 0-1 之間,通過 (1-x) 操作變成單調增。 

紅色框是樣本均衡項,作者把人臉分成六類(側臉,正臉,抬頭,低頭,有表情,有遮擋),統計了訓練集中這六類的數量分佈,計算對應的數量比例,比如 1/10,用它的倒數,作為均衡項(用倒數是否合理?是否有點糙?可以考慮 focal loss 和 class-balance loss 的處理方法)。

網路

PFLD:簡單高效的實用人臉關鍵點檢測演算法

上面是 auxiliary 網路,預測三個角度,infernce 不參與,和下面的網路,共用一些層。角度預測的 gt,是用一個平均正臉上預先定義的 11 點,和 gt 中的 11 點估計出的旋轉角度,作為角度的 gt。

下面是 backbone + head:

PFLD:簡單高效的實用人臉關鍵點檢測演算法

紅框是 head,用了多尺度預測,類似 SSD 的做法。

實驗

SOTA 比較:和去年的 LAB 方法(Look at Boundary)相比,NME 提升 0.1 個點。 

速度:ARM845 上,一張人臉只要 7ms。backbone 優化,另外一個原因是直接回歸位置座標,而不是常規的 heatmap + offsetr 的方式,無後處理耗時。

Ablation:

PFLD:簡單高效的實用人臉關鍵點檢測演算法對於直接回歸位置座標,本文提出的改進 loss 提升略明顯(存疑)。

PFLD:簡單高效的實用人臉關鍵點檢測演算法

個人評價

應用決定演算法對什麼更敏感。人臉關鍵點終究是一個耗時敏感的問題,為了效率,本文的考慮有如下:

  • backbone 採用 MobileNet 

  • 直接回歸點座標,省去後處理耗時 

  • 用 auxiliary 網路,這個網路再怎麼搞,都不會影響 inference 耗時 

  • 對 loss 的優化,再怎麼玩,都不會影響 inference 耗時 

什麼會影響耗時:

  • 輸入大小 

  • inference 涉及的 backbone 和 head 

  • target_to_label 的耗時 

所以,像什麼對抗損失、模仿學習、加資料訓等等方法,都是可以在不改變算力的情況提升模型效能的手段,在工業界常常使用。 

三點想法:

  • 如果模型的角度預測分支,放在和位置預測一起出,效果會怎麼樣?

  • 如果人臉的角度不是預測的,是標註的,效果會怎麼樣?

  • 考慮效率的話,輸入大小和模型算力配比,是最佳的均衡麼?

如果有大神復現了本方法,求分享交流,想知道上面三個問題的答案。

相關文章