論文閱讀筆記 — 人體姿態辨識 Convolutional Pose Machines

Hung-Chih Chiu
6 min readMay 21, 2020

--

這禮拜想要跟大家分享OpenPose人體姿態辨識3部曲中的第2部, Convolutional Pose Machines, 照例放上一段Youtube關於Convolutional Pose Machines的影片.

Convolutional Pose Machines基本上是Pose Machines的延伸, 將Pose Machines中的特徵擷取以及預測器的部分, 改以CNN的架構直接取代掉, 如果對Pose Machines有興趣的可以參照我上一篇文章, 連結如下.

模型主要如下圖, 圖中(a) / (b)就是Pose Machines的模型架構, 是利用gradient boost對人體每個關鍵點進行預測. 而圖中(c) / (d) 則是這篇Convolutional Pose Machines的架構, (e)的部分指的是隨著Convolution的層數加深, 每一個層所得到的receptive field就越來越大, 在論文中作者有提到隨著receptive field的加大, 較大的感受區域可以同時得到不同關鍵點的位置, 可以提升網路針對不同關鍵點的預測精度.

圖1 Convolutional Pose Machines

模型的架構其實看上面的圖示就很清楚, 在Stage1時輸入的原始影像為h x w x 3, 經過5層convolutional layer與兩層1 x 1 convolution最終得到 h’ x w’ x (p+1), p代表p個部位的feature map, 也是Pose Machines中的Confidence Map. 將p+1個 得到的feature map, 以及原始影像再經過5層convolution的結果concatenate之後作為Stage2的輸入. 在Stage2內, 將剛剛輸入的特徵影像, 在經由幾層Convolution layer之後, 得到同樣大小的 h’ x w’ x (p+1) feature maps. 後續的步驟都是重複Stage2, 透過不斷的迭代將可得到更精確的定位.

另外在網路上查找有找到一篇關於Convolutional Pose Machines的模型有做更詳盡的介紹, 連結如下 (https://blog.csdn.net/shenxiaolu1984/article/details/51094959), 原始影像輸入為368 x 368, 經Convolution得到46 x 46 x 15, 15是14個關節點加上1個背景, 不過這邊46 x 46與原始論文中提到的31 x 31有點不同, 不知道是不是作者後來在發表的模型上有做修改. 而且, 在這個介紹中有提到除了影像的feature map, 還會加入一張位於圖像中心點生成的高斯分布特徵, 在Stage2之後與影像產生 的feature concatenate在一起. 這邊會選擇產生高斯分布的中心點, 我認為在於作者在真值(ground truth)影像上面每個關節點標註也以高斯分布做為表示, 因此會希望所產生的預測關鍵點也有高斯分布的特徵.

圖2 Convolutional Pose Machines from https://blog.csdn.net/shenxiaolu1984/article/details/51094959

而為了避免經由多次Convolution導致梯度消失的問題, 在每個Stage結束後都會針對每個Stage的loss進行權重的更新, loss function定義如下, btp代表的是每一t Stage下所得到每一p關節點的位置, 而b*代表的則是ground truth的關節點, 作者在各關節點位置的影像上加入高斯分布作為與預測對照的影像.

作者也列出在訓練過程中觀察每個Stage的梯度變化, 對比每個Stage的結尾都做loss的確認, 或是一次把數個Stage作完整的訓練在最後才有做loss確認並更新的比較. 由下圖中可以看到如果是一次做完數個Stage的訓練, 並且只在最後做loss的確認時在前面幾個Stage就會發生梯度消失的問題 (圖3中紅色曲線). 因此每個Stage都做各自loss確認並對Stage內的參數做更新是有必要的 (圖3中黑色曲線).

圖3 訓練過程中每個stage的梯度

最終的結果就像圖4, 作者列出一般比較容易被誤判的手腕, 手肘的部分, 可以看到在第一階段時還有多個關節點被誤判, 或是左右手關節點分不清楚的情形, 但在經過多次反覆修正後, 關節點與左右手的位置就都正確了.

圖4 關節點在不同Stage下的預測

在資料集的部分, 作者共用了3種資料集, 分別是MPII Human Pose Dataset(http://human-pose.mpi-inf.mpg.de/), Leeds Sports Pose(LSP) Dataset(https://sam.johnson.io/research/lsp.html)以及FLIC Dataset (https://bensapp.github.io/flic-dataset.html), 其中FLIC只有上半身, 因此用了4個Stage進行預測, 其他兩個資料集是全身的, 就用了6個Stage進行預測. 可以看到最終結果在混合不同組dataset下同時進行訓練後可以得到比較高的預測精度如圖5所示, 圖中黑色的曲線就是混合MPII與LSP的資料後預測的結果.

圖5 論文中與其他模型比對結果

相比於這篇論文與Pose Machines, 可以發現他以CNN替代了原始的Pose Machines中的隨機森林, 同時也利用CNN直接擷取每個影像的特徵, 不再需要像在Pose Machines中對影像做各種前處理, 同時各個CNN層數也不複雜, 透過數次的迭代就能將各個部位的關鍵點定位出, 也讓人體會到CNN強大的能力.

--

--