論文解讀-Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields


最近需要做視頻分類相關的工作,在做技術調研過程中,瞭解到視頻分類包含了兩種形式,(1)通用的多標籤視頻分類,它的特點是標籤爲靜態的,也即做分類時不需要考慮圖像幀之間的關聯性,因此跟基於圖片的分類沒什麼差異了。(2)行爲識別,因爲是“行爲”,所以這類任務需要考慮圖像幀之間的關聯性,比如“芭蕾舞”、“繪畫”等,包含了3D卷積和Two-stream兩種方法,在看了這方面的綜述文章後發現是全新的方向。因爲筆者之前一直做的2D目標檢測方向,爲了能更好地王行爲識別方向過渡,選擇先從2D的行爲識別啃起,也即人體關鍵點檢測,因此後面的幾篇博文都是圍繞關鍵點檢測展開的。

說起人體關鍵點檢測,就不得不提OpenPose算法了,它因爲速度和精度的權衡在實際中得到了廣泛的應用,它包含了人體骨骼關鍵點檢測和臉部關鍵點檢測。筆者在閱讀它所使用的人體骨骼關鍵點檢測算法後,有了對這個方向新的理解,故這裏記錄下來。

1 “top-down” vs “bottom-up”

人體姿態估計可以分爲兩種思路,(1)“top-down”,它指先檢測人體區域,再檢測區域內的人體關鍵點。(2)“bottom-up”,它指先檢測圖片中所有的人體關鍵點,然後將這些關鍵點對應到不同的人物個體。這裏需要提及一下,第一種方案因爲需要對檢測出的每個人體區域,分別做前向關鍵點檢測,所以速度較慢,而OpenPose採用的則爲第二種方案。

2 動機

2.1 已有"bottom-up"方法缺點

(1)未利用全局上下文先驗信息,也即圖片中其他人的身體關鍵點信息;

(2)將關鍵點對應到不同的人物個體,算法複雜度太高。

2.2 改進點

論文中提出了新的概念“Part Affinity Fields (PAFs)”,筆者將其翻譯成關節聯通區域。每個像素是2D的向量,用於表徵位置和方向信息。基於檢測出的關節點和關節聯通區域,使用greedy inference算法,可以將這些關節點對應到不同人物個體。

3 方案

整個的技術方案爲“two-branch multi-stage CNN”,如下圖,其中一個分支用於預測打分圖SS,另外一個分支用於預測關節聯通區域LL

符號說明:

S=(S1,S2,...,SJ)S=(S_{1}, S_{2}, ..., S_{J}):score maps,其中JJ表示關節點個數,SiRw×hS_{i}\in R^{w\times h}用於表徵第ii個關節點的score map;

L=(L1,L2,...,LC)L=(L_{1}, L_{2}, ..., L_{C}):part affinities,其中CC表示關節連通域(關節點對)的個數,LcRw×h×2L_{c}\in R^{w\times h\times 2}用於表徵第c個關節聯通域的聯通情況,2D表徵像素點的位置和方向,圖像化表示如下,
在這裏插入圖片描述
其中,左圖爲"right elbow"和“right wrist”對應的關節聯通域。右圖爲局部圖像塊放大後的表示;

3.1 Detection 和 Association

論文中所提的多任務網絡架構,能夠同時預測detection confidence maps和affinity fields,前者用於表徵每個像素點是否爲關節點的置信度,後者用於表徵關節點之間的關聯性。
在這裏插入圖片描述
輸入圖像經過VGG-19的backbone網絡,輸出特徵圖FF,然後FF經過Branch 1和Branch 2,分別得到Stage 1對應的confidence map和affinity field。其中,ρtϕt\rho^{t}、\phi^{t}表示Stage t不同分支的推理CNN,公式表示如下,
在這裏插入圖片描述
然後,將Stage 1的輸出S1L1S^{1}、L^{1}​FF​做concate操作,作爲Stage 2的輸入,Stage 2負責對confidence map和affinity field做refinement操作,圖像化表示如下,
在這裏插入圖片描述
關於兩個分支的損失函數,作者均採用了L2L_{2} loss函數。而且,在每個Stage均進行監督,解決了“消失梯度”問題。另外,考慮到有些訓練數據集只標註了圖片中部分人物的關節點,因此對損失函數採用了空域加權操作,公式表示如下,
在這裏插入圖片描述
其中,SjS^{*}_{j}表示groundtruth關節點置信度圖,LcL^{*}_{c}表示groundtruth關節連通域圖,WW表示二值化mask矩陣,當位置pp的標籤缺失時其值爲0,否則值爲1。顯然,對於未被標記的人物關節點,W(p)=0W(p)=0,而被標記的人物關節點和非關節點,W(p)̸=0W(p)\not=0,所以未被標記的人物關節點不會影響模型的學習過程,整個CNN網絡架構的優化目標函數如下,
在這裏插入圖片描述
也即,綜合考慮了所有Stage的關節點和聯通區域檢測。

3.2 detection confidence map

論文中,使用2D高斯分佈建模groundtruth關節點置信度圖。記第kk個人的第jj個關節點的置信度圖爲Sj,kS^{*}_{j, k},第kk個人的第jj個關節點的groundtruth位置爲xj,kR2x_{j, k} \in R^{2},那麼Sj,kS^{*}_{j, k}中位置pR2p\in R^{2}的像素值定義如下,
在這裏插入圖片描述
然後在channel維度做max pooling操作,得到Branch1網絡的輸出,公式如下,
在這裏插入圖片描述
所以,輸出channels個數等於關節點個數,每一個feature map表示某一類關節點的confidence map。

在inference階段,考慮到一張圖片中不同人的相同關節點距離較大,作者對網絡輸出結果使用了non-maximum suppression操作,過濾掉距離較近的關節點。

3.3 Part Affinity Fields

上面3.2的內容給出了每類關節點的confidence map,那麼問題來了,怎麼把這些檢測出來的關節點進行重組,得到不同的人體骨骼結構呢?

設想一下,如果我們知道了每一對關節點的相關性,也即每一對關節點是否屬於同一個人,那麼問題就解決了?。

怎麼知道每一對關節點是否屬於同一個人呢?比較直接的方法是,檢測人體所有骨骼的midpoint,比如手腕和肘部之間的midpoint,然後校驗其它關節點,若某一對關節點位於midpoint兩側,則它們是一對,也即對應了同一個人。這種思路是有問題的,比如下圖(b),紅色和藍色分別表示人體骨骼點,黃色表示midpoint,對於每一條黑線,滿足這裏的約束,然而對於綠線,是因爲中間的黃點帶來的歧義,所以這種方案不可行

不可行的原因:(1)只對骨骼(limb)的位置編碼,而忽略了方向信息;(2)只用了一個點表徵骨骼區域,信息量不充分。
在這裏插入圖片描述
第二種解決辦法,也即原論文中的最大創新,使用part affinity fields(PAF)建模骨骼區域,對於骨骼區域內的每一個像素,使用2D向量同時表徵位置和方向信息,這裏的方向指代當前骨骼對應的關節點對的連接方向。
以下圖的骨骼區域爲例,
在這裏插入圖片描述
其中,xj1,kx_{j_{1}, k}xj2,kx_{j_{2}, k}分別表示關節點j1,j2j_{1}, j_{2}的groundtruth位置。k,ck, c分別表示原始大圖中的人物索引關節點對索引,位置pp處的groundtruth關節聯通域向量定義如下,
在這裏插入圖片描述
其中,
在這裏插入圖片描述
也即vv表示位置j1j_{1}指向位置j2j_{2}的單位向量。

點集pp定義成上圖中綠色虛線內的區域,數學公式表示如下,
在這裏插入圖片描述
其中,lc,k=xj2,kxj1,k2l_{c, k}=||x_{j_{2}, k} - x_{j_{1}, k}||_{2}表示骨骼長度,σl\sigma_{l}衡量了骨骼的粗細。這裏大家可以對照本文的第一張圖來理解,就比較容易懂了。

然後,在channels維度做average pooling操作,得到Branch2網絡的輸出,用於表徵不同關節點對的特徵圖,公式表達如下,
在這裏插入圖片描述
其中,nc(p)n_{c}(p)表示所有人中位置pp處非0向量的個數。

(ps:爲什麼關節點定位使用max pooling操作,而骨骼定位卻使用average pooling操作呢?歡迎大家留言討論?)。

在推理的時候,對於任意兩個關節點位置dj1d_{j_{1}}dj2d_{j_{2}},通過計算PAF聯通區域的線性積分來表徵骨骼點對的相關性,也即表徵了骨骼點對的置信度,公式表示如下,

其中,p(u)p(u)是對兩個關節點位置dj1d_{j_{1}}dj2d_{j_{2}}做插值操作得到的,公式如下,
在這裏插入圖片描述
因爲計算機不支持積分運算,所以在實際運算過程中,將公式(10)分解成對uu的均勻採樣,近似計算出這兩個關節點之間的相關性。

3.4 Multi-Person Parsing using PAFs

3.4.1 動機

由於圖片中可能有多個人,或者算法預測的false positive點,導致每個關節點feature map中可能存在多個預測點的位置,使用公式(1)計算點對的置信度,只能保證局部最優,那麼如何保證全局最優呢?這裏的全局指人體整個骨骼結構。

3.4.2 論文中方案

在原論文中,作者採用了greedy relaxation的思想生成全局較優的搭配。

具體來說,引入如下數學符號,

(1)DJ={djm:forj1...J,m{1,...,Nj}}D_{J}=\{d_{j}^{m}: for j \in {1... J}, m \in \{1, ..., N_{j}\}\},其中,NjN_{j}表示關節點j對應的預測位置個數,djmR2d_{j}^{m}\in R^{2}表示第j類關節點對應的第m個預測candidate,DJD_{J}表示所有類關節點對應的所有預測candidate;

(2)zj1j2mn{0,1}z_{j_{1}j_{2}}^{mn}\in\{0, 1\}表示兩個預測candidate dj1mdj2nd_{j_{1}}^{m}和d_{j_{2}}^{n}的連通狀態;

因此,優化目標爲:針對所有可能的連接,Z={zj1j2mn:forj1,j2{1...,J},m{1...,Nj1},n{1...,Nj2}}Z = \{z_{j_{1}j_{2}}^{mn}: for j_{1}, j_{2} \in \{1...,J\}, m\in \{1...,N_{j_{1}}\}, n\in \{1...,N_{j_{2}}\}\},尋找全局最優解。

3.4.3 關節點對

比較簡單的情況,先考慮一對關節點類型j1j_{1}j2j_{2},對應了第c個骨骼,那麼尋找最優連接等價於求解加權二分圖匹配最大化問題。

讓筆者來更加形象地解釋待優化的問題,網絡結構中的Branch 1會輸出多個feature map圖,每一個feature map表示某一個關節點的所有預測candidates,因此包含了圖片上所有人的該關節點預測結果。以肘部和手腕這兩個feature map爲例,這裏要解決的問題就是,將同一個人的肘部和手腕位置構成一個match,如果這樣的match越多,那麼匹配成功的人數就越多,也就意味這對肘部和手腕連接情況的預測效果越好

爲了求解Graph匹配問題,這裏以論文中插圖5b爲例,圖中的node表示預測關節點Dj1D_{j_{1}}Dj2D_{j_{2}},edge表示預測關節點對的連通性,這裏的連通性用公式(10)中的骨骼點對置信度來衡量,在公式(12)中用EmnE_{mn}表示。匹配最優化問題就轉換成新的問題,即尋找edge子集合,且滿足子集合中任意兩條edge無共享node,公式表示如下,
在這裏插入圖片描述在這裏插入圖片描述
其中,EcE_{c}表徵了關節點對(骨骼)cc總的匹配置信度,這個優化問題可以使用Hungarian算法來求解。

4 實驗結果

在這裏插入圖片描述
在這裏插入圖片描述

5 總結

(1)採用了coarse-to-fine的逐階段思路;
(2)採用了“bottom-up”的思想,算法耗時跟圖片中人物數量基本無關,速度快;
(3)開源軟件OpenPose採用該方法定位人體,可以在服務器端做到實時,在工業場景中得到廣泛應用。



6 參考資料

https://arxiv.org/abs/1611.08050
https://github.com/CMU-Perceptual-Computing-Lab/openpose

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章