天天看點

人臉關鍵點檢測-遞歸編解碼網絡

本次介紹一篇關于人臉關鍵點檢測(人臉對齊)的文章:

《ECCV16 A Recurrent Encoder-Decoder Network for Sequential Face Alignment》.

作者首頁:https://sites.google.com/site/xipengcshomepage/project/face-alignment, 代碼和預訓練模型後面會放出來。

Introduction

目前,采用神經網絡直接進行回歸的的人臉關鍵點檢測方法越來越多。雖然性能越來越好,但還是很容易受到大的人臉姿态變化以及嚴重遮擋的影響。

So,作者考慮,基于視訊連續幀建構一個 recurrent encoder-decoder DNN模型。(PS. 個人覺得基于視訊會使得應用場景受限,其次是即時速度)

encoder-decoder:即編碼階段先做特征學習,然後解碼階段做關鍵點回歸。

recurrent: 即利用視訊連續幀的資訊,完成由粗到細的回歸。

Recurrent Encoder-Decoder Network

首先給出方法的整體流程圖,我們簡單分析下包含哪幾個子產品。

人臉關鍵點檢測-遞歸編解碼網絡

1. \(f_{ENC}\)-編碼 & \(f_{DENC}\)-解碼

首先從整體上來看一下編解碼階段,ENC:encode,DENC:decode.

下圖是文章中使用到的編解碼網絡,是一個全卷積網絡:前半部分卷積表示編碼,後半部分反卷積表示解碼。作者提到使用全卷積,是因為可以得到同樣尺寸的輸出,這樣便于進行遞歸操作。

人臉關鍵點檢測-遞歸編解碼網絡

由圖可以看出,input是3通道彩色圖,label是圖樣大小的單通道圖(假設L個關鍵點,則取值{0,…L},0表示背景)。output與input大小相同但通道數變為\(L+1\),即第一個通道表示背景,後續的 \(L\) 個通道依次表示 \(L\) 個關鍵點的pixel級别的置信度。之是以采用 \(L+1\) 個通道是為了保留關鍵點的整體性。

文中作者使用的是VGG網絡,不過去掉了所有的全連接配接并利用現有的卷積層參數初始化網絡,是以模型大小隻有14.8M,編碼階段最後的輸出為 \(4\times4\times256\)。

此外,編碼階段使用了5個stride=2的 \(2\times2\) max-pooling, 為了在解碼階段可以有效地還原出原來的空間資訊,作者這裡為每一個激活值花費2bit來記錄max-pooling的選擇位置。還有一點,作者在網絡中加入了BN來加速收斂(PS. 在我的實驗中,對于小網絡和回歸問題,BN經常會帶來反效果。)

2. \(f_{REG}\)-回歸

REG:Regression。上面的編解碼階段最終的輸出是一個 \(L+1\) 通道的feature map,而我們最終需要的輸出則是一組L個坐标([x,y],共2L個數值),是以我們還需要一步非線性映射,

這裡的Loss就是常見的歐氏距離:

人臉關鍵點檢測-遞歸編解碼網絡

其中,\(y^*\) 為ground truth,所有的坐标都是減去mean shape的值。

具體的映射網絡如下:

人臉關鍵點檢測-遞歸編解碼網絡

由圖可知,input是 \(128\times128\times(L+1)\),output是 \(2L\times1\)。網絡結構類似于編解碼階段,但規模稍小。

此外,由于輸入是高度抽象的缺少細節資訊,是以會影響性能。So,作者從編碼階段拿到conv2_2 和 conv4_3的特征和目前網絡對應階段的特征拼接起來,進而利用起來全局和局部的資訊。

(PS. 這已經很複雜了模型已經很大了啊T_T,實際還怎麼實時啊)

3. \(f_{sRNN}\)- Spatial Recurrent Learning

空間遞歸學習是為了實作由粗到細的關鍵點定位,而以前的由粗到細方法往往是級聯多個網絡,這裡則隻使用一個網絡。

示意圖如下:

人臉關鍵點檢測-遞歸編解碼網絡

這個示意圖其實描述的就是下面這樣一個遞歸公式:

人臉關鍵點檢測-遞歸編解碼網絡

輸入是 \((L+1)\) 通道的response map,輸出則是一個單通道的label map。具體的處理過程主要有兩步:

(1) 将((L+1)\) 通道的response map融合為一個單通道圖,該圖上的數值為\(0,…L\)。 融合的方法為選取置信度最大的label,即按照下式:

人臉關鍵點檢測-遞歸編解碼網絡

(2) 這裡主要實作将(1)的結果怎樣處理成一個label map,方法是:在(1)的每個關鍵點分布中心處劃定一個小的正方形,在3次遞歸時舉行尺寸依次是7pixels、5pixels和3pixels。

遞歸采用了LSTM結構,示意圖如下(具體結構可參照原文):

人臉關鍵點檢測-遞歸編解碼網絡

4. \(f_{tRNN}\)- Temporal Recurrent Learning

本文的方法中,遞歸學習不僅存在于之前的空間上,還有時間上的遞歸學習。

編碼階段,通過輸入連續多幀視訊,我們可以得到多個編碼的特征 \(\{C^t,t=1,…T\}\)。每一個特征都可以被分為兩塊:一塊是身份碼字 \(C_id\),該項時不變,因為連續輸入的都是同一個人;一塊是姿态表情碼字 \(C_pe\),該項時變,因為随着時間變化人臉的姿态和表情都是有變化的。

示意圖如下:

人臉關鍵點檢測-遞歸編解碼網絡

5. \(f_{CLS}\)- Supervised Identity Disentangling

這裡講最後一個子產品,身份識别輔助子產品。

前面講到 \(f_{ENC}\)的輸出為 \(4\times4\times512\), 該輸出被分割為兩個\(4\times4\times256\)的特征,分别用來描述身份和姿态表情變化。

之是以添加身份識别部分,作用類似于湯曉鷗的MultiTask,據說可以收斂到更好魯棒性也更好。(PS. 據說啊,反正我的實驗裡面MultiTask, 沒有明顯的積極作用)

識别部分的網絡結構如下,使用的是分類Loss:

人臉關鍵點檢測-遞歸編解碼網絡

Result

最後添加一個實驗結果圖:

(PS. 我覺得對比試驗是不合理的,因為對比方法都是基于靜态圖像做的檢測,而本文方法使用的是多幀視訊。)

人臉關鍵點檢測-遞歸編解碼網絡