Openpose 人體姿態辨識
論文名稱:OpenPose: Realtime Multi-Person 2D Pose Estimation using Part Affinity Fields
這篇主要講解 OpenPose的原理及成果,以下分成幾個段落
- 前言
- 任務目標
- 方法
- 結論
1. 前言
人體姿態辨識在電腦視覺中一直都是重要的分支,在 paperwithcode 的網站上的任務中一直都有在更新許多現有的比賽與模型。
可以參考下列網站:
2. 任務目標
主要的任務目標為
- 在一張2D圖片(或影像中的一個frame)偵測多人的姿態
- 解決多人重疊的問題
- 達成即時偵測(real-time 30fps以上)
主要關鍵字大概是:2D圖片、多人、即時
因為一個畫面中只有一個人與多人的情況下,模型的制定方式會差很多,看完這篇論文大概就會有感覺了,那麼來討論一下多人的情況會遇到什麼些難題吧!
在畫面中只有單人的情況下可以看到 (圖1-a) 中的人體點位都被預測出來了,那只要將這些點位相連就是人的軀幹了,也就是 (圖1-b)
那如果是 (圖2) 呢?
當圖片中有多人的時候,那身體就會有多個候選,在(圖2) 中,每個紅點都要連到其中一個藍點,成為一個軀幹,但是如果是沒有一個良好的策略,每個紅點則有三個藍色的候選,三個人就共有3*3=9種選擇方法。
3. 方法
那圖片怎麼去預測多人呢?本文提出了一種想法,如果每個人都可以預測出身上每個關節點,那只要多預測出這個關節應該如何連到下一個關節,也就是預測該往哪個方向連線,那就可以把肢體預測出來了,見(圖3)。
這種連線的方法在文章中稱為 PAF (Part Affinity Fields),後面會介紹這個向量怎麼得到的。
流程圖:
其中 (圖4.a) 為輸入圖片,接著由模型同時預測(圖4.b)關節點的Confidence Maps和(圖4.c)的PAF向量,接著(圖4.d)將第二步驟的預測做後處理,最後得到整體的姿態(圖4.e)。
Part Affinity Fields for Part Association (PAF):
這張圖中 Xj1,k 及 Xj2,k 為原始圖中label好的關節點,k 代表第k張圖。
V 為Xj1到Xj2的向量,另一個為法向量。
p 為圖上任一點。
假設 p 點在這個手臂之中,那這個點的值為 v, 也就是v向量,
如果 p 點不在手臂中,那這個點的值設定為0。
如何去找到 p 點是否在手臂中呢?先找到 p 點,接著如果滿足(圖6)的不等式,則 p 點的值為 v。
也就是 Xj1,k 到 p 的向量,分別對手臂長及手臂寬做投影的值,要分別小於手臂長及寬。
模型架構:
模型可以分成兩個顏色的區塊
藍色:用來預測 PAF
橘色:用來預測 Confidence Maps
紫色底的為 Convolution Block,借鑑於 Densenet 的架構把權重往前送
另外提一下,網路上有其他圖跟這張架構圖有些不一樣,原因是作者後來更新一次模型架構,目前這版為最新版本。
一開始送進去的 input 為VGG19的前十層產出的 Feature maps,最後箭頭連出來的部分會在連到頭,當作下一次訓練的 input,有種遞迴的感覺。
在這裡分別代表藍底與橘底神經網路都用了L2 Loss,其中的ti, c等等的代表前一段傳進來的stage等等。
從(圖7)可以看得出來,在不同的Stage下,越後面的Stage呈現出來的值會越深。
簡言之,用上述的模型架構,把圖形的PAF算出來,接著設定好loss,就能開始訓練網路,不過還有一個比較難的是(圖4.d)到(圖4.e)的過程,原文說將這些組合起來是一個 NP-hard問題,文章中有提出一個方法來加速這個過程,這部份可以詳細的看原文。
4. 結論
論文中有給了不少預測出來的圖片比較,以及如何擴展,例如加入不同的資料集,就可以增加預測的點,例如(圖8.c)就是從(圖8.a)+(圖8.b)來的,原本的身體關節加上額外的腳底資訊,能夠增加預測的點之外,還能幫助如(圖8.c)右腳關節的部分,預測的更準確了。
同時也可以應用在其他的案例上,例如車子骨架的預測:
論文也很佛心的給了不少他們做出來的失敗案例,例如角度或是遮蔽的時候會出現一些失敗案例:
還有更多的案例可以在原論文中看到,官方的github也有釋出如何訓練及套用,可以到作者群的官網看看唷
github連結:https://github.com/CMU-Perceptual-Computing-Lab/openpose