論文閱讀筆記 — 3D人體姿態辨識 Camera Distance-aware Top-down Approach for 3D Multi-person Pose Estimation from a Single RGB Image

Hung-Chih Chiu
10 min readDec 8, 2020

--

這周要跟大家分享的3D人體動作辨識論文連結如下:

而作者github兩個連結分別如下, 第一個連結ROOTNET為尋找人體根節點在3維空間中的位置, 第2個連結POSENET則是每個關鍵點相對於根節點的位置.

模型辨識的3維動作模型如圖1.

圖1 模型辨識結果

本篇模型參照了Top-down的方式, 將整個模型的架構分為3個步驟, 分別為在影像中找出人所在位置的DetectNet, 接著將涵蓋人物位置的定界框影像送入RootNet, 尋找人體中心點的3維座標, 以及最後將各別關鍵點相對於人體中心點計算出來的PoseNet, 整個流程如圖2所示

圖2 本篇論文模型架構

經由模型我們能夠找出每個人身上關鍵點的座標, 這些座標是以攝影機中心為原點的絕對座標定義如下, 式中J代表識別出的每個人共有J個關鍵點.

前面提到RootNet會由DetectNet裁剪出個人影像, 並從這個影像中找出人體的中心點, 論文中定義為R如下式, 其中xR, yR的座標是影像的像素, ZR是絕對的深度值.

接著再經由PoseNet計算出各別關鍵點相較於中心點的座標如下, 其中Zjrel是第j個關鍵點相較於中心點的深度, 加上前一個網路所得的ZR就可以得到最終關鍵點的深度Zjabs, 另外xj, yj則是關鍵點在裁減影像第j個關鍵點的像素座標, 同樣透過還原裁減影像的座標可以還原以相機中心為座標的關鍵點x, y值.

網路架構的部分, DetectNet採用的是Mask R-CNN的架構, 透過裡面Region Proposal Network輸出人體的定界框, 並因為使用了RoI Alignment, 消除了計算中取整數的動作, 讓定界框的位置更正確.

RootNet則是將DetectNet得到的定界框影像進一步算出影像中的人物中心, 這裡要藉由一個距離參數得到相關的中心距離如下所式,

上式的推導可以參閱圖3相機針孔成像的圖形, αx與αy分別為焦距f乘上在x方向與y方向像素對應長度的比例, 這樣說明可能大家可能不太清楚意思, 我們直接看下面的推導.

圖3 相機成像模型

依據圖3, 我們可以得到夾角θx如下

上式中d為相機到人體的距離, 單位為mm, f為相機焦距, 單位同樣為mm, lx,real為人體實際上在x座標下的距離, 單位為mm, lx,sensor為人體在影像平面上x方向的距離, 單位一樣為mm. 上式左右兩邊0.5消除, 我們可以得到d與f的關係如下:

上式中第一個等號為經由那個式子我們得到d與f的關係, 接著我們需要將單位從mm轉換到pixel, 因此分子與分母同乘以px, px的單位為pixel/mm, 也就是每mm涵蓋幾個像素pixel. 而lx,sensor原本為影像上x方向人體的距離mm, 乘上px之後同樣為影像上x方向人體的距離, 只是單位轉換為像素pixel. 而前面提到的αx為焦距f乘上px, 也就是把焦距的單位mm換算成以x方向像素pixel為單位.

同樣在y方向也是同樣的概念, 式子如下

最終我們可以把上面兩個分別以x與y表示的d相成並開更號如下:

上式中Areal為lx,real與ly,real相乘, 單位為mm平方, Aimg為lx,img與ly,img相乘, 單位為pixel平方. 也就是我們在一開始所得到的一個距離參數k, 它隱含的就是物體到相機的絕對距離.

在上式中, 如果我們有Areal, αx與αy, 我們再帶入人物影像定界框大小Aimg, 我們就可以計算出人物距離相機的深度, 因為只考量到人體的預測, 因此假設Areal為2000mm x 2000mm, 而αx與αy為焦距轉換到x與y方向的像素表示, 可以從資料集中得到, 而Aimg為經模型得到定界框後, 再將邊框的長寬比延伸成為1:1, 有上述參數後, 我們就可以計算出人體的深度d. 作者也將參數k與人體中心點深度的關係畫出如圖4所示, 由圖中可以發現k值與中心深度呈現正相關的關係.

圖4 k值對應人體中心深度

雖然從圖4中我們可以發現k值與人體中心深度有正相關的關係, 仍有幾種情形可能導致k值的誤判, 如圖5所示, 圖5(a)是一個棒球的場景, 其中捕手與打擊者站在距離相機差不多遠的位置, 但是因為兩個人的姿態不同, 導致定界框的大小有差異, 這部分就會造成在深度計算時的誤判, 另外5(b)則是家長在場邊觀看小朋友踢球的場景, 雖然兩個定界框的大小差不多, 但實際上是場景中小朋友距離鏡頭較近, 所以即便實際上小朋友的身長較短, 但是產生的定界框與遠端的大人差不多大.

圖5 幾種k值會誤判的情形, (a)為同樣深度但不同大小的定界框, (b)為近似大小的定界框, 但人物在影像中的深度不同

而為了解決上述這個因為姿態不同或是人體身長與遠近的關係, 作者重新訓練了一個RootNet, 用以學習姿態, 影像與年紀的特徵與身長的關係, RootNet的架構如圖6所示, RootNet藉由預測一個校正參數γ將k值校正為正確的深度.

圖6 RootNet架構

由圖6中可以知道RootNet有兩個輸入, 一個是經DetectNet所擷取出的影像, 另一個則是藉由擷取影像的大小找出的k值, 而RootNet所採用的骨幹網路是ResNet-50, 2D part的部分是經由3層de-convolutional layer最終接1x1的filter輸出2維座標的Heatmap. 而Depth part則是將ResNet的feature map採global average pooling之後再經由1x1最終得到校正參數γ, 最終的深度是k除以開根號的校正參數γ, 而RootNet模型的訓練是透過下列的loss function, 將模型預測出的中心點位置R與ground truth R*做L1 loss.

在得到人體中心點的3維位置之後, 就進入最後的PoseNet由網路預測其他關鍵點相對於中心點的位置如下式所示.

而這邊作者參考的是Integral human pose regression的方法, 詳細方法可以參閱我先前介紹的文章:

骨幹網路同樣是用ResNet-50直接回歸出關鍵點相對於中心點的位置, 而loss function是用下式. 同樣採用L1 loss, *代表ground truth.

訓練的資料集的部分分別有Human3.6m與MuCo-3DHP, MuPoTS-3D, 後面兩個資料集是Single-Shot Multi-Person 3D Pose Estimation From Monocular RGB所建立的, 可以參閱先前介紹:

Human3.6m裡面主要使用的評估方式是MPJPE (mean per joint position error), 是針對每個關鍵點與ground truth之間的L2差異.

因為本文章有針對中心點做預測, 因此作者也參考了MPJPE, 定義了MRPE (mean of the root position error)如下, R為中心點, R*為ground truth, N代表測試的數目.

在Human3.6m下面我們重複說過了好多次不同文獻採用些許不同的訓練方式, 方法分為Protocol 1與Protocol 2, Protocol 1採用的是6個受試者進行模型訓練(S1, S5, S6, S7, S8, S9), S11每64個frame作為測試, 評量的方式是先經過generalized procrustes analysis做剛性座標轉換對齊的MPJPE(mean per joint position error)誤差. Protocol 2採用的是5個受試者進行模型訓練(S1, S5, S6, S7, S8), S9與S11每64個frame作為測試, 評量方式則是直接使用MPJPE, Protocol 1與2的結果如表1與2所示, 可以看到都有最佳的結果.

表1 Human3.6m使用Protocol 1推論結果
表2 Human3.6m使用Protocol 2推論結果

--

--