論文閱讀筆記 — 人體姿態辨識 Stacked Hourglass Networks for Human Pose Estimation

Hung-Chih Chiu
6 min readJun 11, 2020

--

Stacked Hourglass Network (https://arxiv.org/pdf/1603.06937.pdf)重複使用了Top-Down與Bottom-Up的方式, 讓模型重複提取影像特徵, 最後達成各個關節點的預測. 而名為Stacked Hourglass就是因為搭建出來的網路形狀就像是將數個沙漏重複堆疊在一起, 網路架構如圖1所示.

圖1 Stacked Hourglass Network

在整組網路中, 其實是由許多小的residual block所組成. 這個residual block輸入與輸出的尺寸大小不變, 只有將擷取的特徵數量進行更改, 是要透過這個residual block提取更具代表的特徵. 但是因為原始論文的說明實在很不清楚, 這邊參考網路上(https://zhuanlan.zhihu.com/p/45002720). 作者在讀過github上原始程式碼後畫出來的residual block如圖2所示. 圖中綠色方塊代表Batch normalization, 紅色是做Relu, 藍色則是進行convolution layer. 藍色方塊中第一列代表的是input channel數, 最後一列是output channel數, 中間則是convolution中使用filter的大小. 在residual block中有兩條路徑, 下路就是一般我們熟知的residual path, 將原始輸入經由1x1的filter轉換成輸出numOut channel數, 再與上路convolution出來的結果相加. 上路則有經過3層Convolution, 其中輸入channel先透過1x1將channel變成輸出channel的一半, numOut/2, 中間經過一組3x3 stride1的convolution, 最後再用1x1擴增回numOut channel數. 每次看到這樣的網路設計, 就像是Autoeconder的架構, 透過encoder將原始特徵往下縮, 讓網路學習到較有代表性的特徵後, 再透過decoder將這些比較有代表性的特徵還原成為原始特徵大小.

圖2 Residual Block from https://zhuanlan.zhihu.com/p/45002720

圖3是單階Hourglass的架構, 圖中綠色的區塊是做Max Pooling將原始影像尺寸縮一半, 紅色的區塊則是利用Nearest Neighbor 的方式做up sampling回到原始輸入影像大小.

圖3 單階Hourglass from https://zhuanlan.zhihu.com/p/45002720

Neaest neighbor的方式就是在up sampling的過程都都將需要擴充的像素都填入原始的像素值, 如圖4所示.

圖3中藍色的區塊就是圖2 的residual block, 每個block都有上下兩個數字, 上面代表輸入的feature channel數, 下面代表是輸出feature channel數. 另外在圖3中間的一個residual block有用一個虛線的方塊圈起來, 可以透過將虛線方塊內插入一組新的單階Hourglass架構, 讓Hourglass變成多階的架構.

圖4 Nearest Neighbor up sampling

因為在單階的Hourglass運行會將原始影像尺寸pooling成一半(圖3中綠色方塊), 之後再做up sampling放大(圖3中紅色方塊), 所以如果將虛線中的residual block置換成單階Hourglass並進行多揭堆疊, 每次新加入的Hourglass所接受到的影像尺寸都是前一階的一半, 在離開至一階之後才將影像放大, 所以串接多階模型就會形成影像逐階縮小, 後面再逐階放大的結果, 形狀就像是一個沙漏一般, 圖5就是串了 4 階Hourglass的架構.

圖5 4階Hourglass from https://zhuanlan.zhihu.com/p/45002720

最終將這4階Hourglass的架構前後堆疊8層, 形成的完整網路架構如圖6. 圖中每一個深藍色的部分就是圖5的4階 Hourglass架構, 淺藍色的是單組residual block, 紫色的區塊則是1x1 convolution, 黃色的部分是經過batch normalization與relu運算, 紅色的部分是為了要能達到每層都做loss確認, 所以會有一層1x1的convolution layer將256層channel縮成16層 channel輸出(16個關鍵點), 以與關鍵點的ground truth進行比對. 每層都做loss可以避免網路太深導致梯度消失的問題.

圖6 完整網路架構 from https://zhuanlan.zhihu.com/p/45002720

另外作者論文中有提到這8層的Hourglass網路中的權重都不是share, 每層都有各自的權重, 而這篇論文所用的資料集分別為FLIC(上半身)與MPII.

作者也針對網路架構的設計進行確認, 比對了不同網路架構對預測的結果差異, 結果如圖7所示, 為了確保使用相同大小的參數數量, 如果將堆疊的次數減少, 例如原本8層的Hourglass堆疊降低為4層, 則每個Hourglass架構中網路層數就會加深, 以確保整體網路相近的層數與參數數量.

從圖7結果可以看到多層的堆疊(理解成將特徵由大到小重複做比較多次)的確會協助將前面層所預測的錯誤進行修正, 而8次的堆疊較只有2次的堆疊可以提升大約1%的精確度.

圖7 不同Hourglass設計架構與精度

以上就是Stacked hourglass的介紹.

--

--