研究背景
人臉關鍵點檢測,在很多人臉相關的任務中,屬於基礎模組,很關鍵。比如人臉識別、人臉驗證、人臉編輯等等。想做人臉相關的更深層次的應用,人臉關鍵點是繞不過去的點。正是因為它是一個基礎模組,所以對速度很敏感,不能太耗時,否則影響了系統整體的效率。所以對人臉關鍵點檢測的要求是,又準又快。
研究問題
人臉關鍵點目前存在的問題(不能又準又快)的原因如下:
1. 區域性變化:表情、區域性特殊光照、部分遮擋,導致一部分關鍵點偏離了正常的位置,或者不可見了;
2. 全域性變化:人臉姿態、成像質量;
3. 資料不均衡:在人臉資料裡面,資料不均衡體現在,大部分是正臉資料,側臉很少,所以對側臉、大角度的人臉不太準;
4. 模型效率:在 CNN 的解決方案中,模型效率主要由 backbone 網路決定。
在實際使用中,人臉關鍵點的問題主要有兩個:1)對“點是否遮擋”判斷是否準確;2)對大角度人臉(+-60 度以內)點位置預測的準確性和穩定性。
解決思路
1. 修改 loss,增加關鍵點的空間約束項(三個姿態角)和資料均衡項;
2. backbone 採用 MobileNet(常規操作);
3. 用 auxiliary network,讓點位置預測更穩定和魯棒(常規操作)。
復現指南
模型
損失函式
損失函式的意義在於表示差異,而且能表示真正的距離。特別是當物件本身具備 3D 屬性,而僅在 2D 上表示的時候,這樣的距離表示就是不準確的。本文作者認為,對於人臉這種物件,人臉 pose(更簡單的說是 3 個尤拉角)可以彌補一些人臉 3D 到 2D 的資訊損失。具體怎麼彌補?
希望是網路可以學到 3D 姿態的資訊,最容易想到的方法是讓網路去預測三個角度,這麼做是可以的。進一步還能怎麼做?把預測的角度損失和點位置損失組合起來,具體的組合方式,比如相加,或者相乘。相加的方式比較類似多工損失,相乘的方式可以理解為一種加權,因為角度損失一般會歸一化到 0-1 之間。
在實際中又發現,這個角度分佈,存在樣本不均衡的問題,所以又增加了樣本均衡項。
綠色框是預測的角度和 gt 的差值,通過 cos 變成 0-1 之間,通過 (1-x) 操作變成單調增。
紅色框是樣本均衡項,作者把人臉分成六類(側臉,正臉,抬頭,低頭,有表情,有遮擋),統計了訓練集中這六類的數量分佈,計算對應的數量比例,比如 1/10,用它的倒數,作為均衡項(用倒數是否合理?是否有點糙?可以考慮 focal loss 和 class-balance loss 的處理方法)。
網路
上面是 auxiliary 網路,預測三個角度,infernce 不參與,和下面的網路,共用一些層。角度預測的 gt,是用一個平均正臉上預先定義的 11 點,和 gt 中的 11 點估計出的旋轉角度,作為角度的 gt。
下面是 backbone + head:
紅框是 head,用了多尺度預測,類似 SSD 的做法。
實驗
SOTA 比較:和去年的 LAB 方法(Look at Boundary)相比,NME 提升 0.1 個點。
速度:ARM845 上,一張人臉只要 7ms。backbone 優化,另外一個原因是直接回歸位置座標,而不是常規的 heatmap + offsetr 的方式,無後處理耗時。
Ablation:
對於直接回歸位置座標,本文提出的改進 loss 提升略明顯(存疑)。
個人評價
應用決定演算法對什麼更敏感。人臉關鍵點終究是一個耗時敏感的問題,為了效率,本文的考慮有如下:
backbone 採用 MobileNet
直接回歸點座標,省去後處理耗時
用 auxiliary 網路,這個網路再怎麼搞,都不會影響 inference 耗時
對 loss 的優化,再怎麼玩,都不會影響 inference 耗時
什麼會影響耗時:
輸入大小
inference 涉及的 backbone 和 head
target_to_label 的耗時
所以,像什麼對抗損失、模仿學習、加資料訓等等方法,都是可以在不改變算力的情況提升模型效能的手段,在工業界常常使用。
三點想法:
如果模型的角度預測分支,放在和位置預測一起出,效果會怎麼樣?
如果人臉的角度不是預測的,是標註的,效果會怎麼樣?
考慮效率的話,輸入大小和模型算力配比,是最佳的均衡麼?
如果有大神復現了本方法,求分享交流,想知道上面三個問題的答案。