--- tags: Deep learning --- # 論文閱讀:Stacked Hourglass Networks for Human Pose Estimation ## Introduction 這篇論文主要是在討論對於人類姿態的研究,對於人機互動或者行為識別等等任務來說,這是十分重要的主題 對此主題的任務為:給定一個RGB的圖片,我們希望可以精準的捕抓到肢體中重要的keypoint(頭部、關節......) 論文中提出一種稱為**Stacked Hourglass Networks**的架構,如下圖所示,像是把許多個沙漏堆在一起似的。重複著pooling和upsampling的過程,透過pooling可以將圖片降到一个很低的resolution,upsampling則可以結合不同resolution的特徵。藉此,通過去分析各種resolution的圖片來分析人類的姿態  ## Network Architecture ### Hourglass module 原本的的code使用的是torch,但因為只是學習性質,因此我自己運行的是其他人整合的pytorch版本。 以下是論文中的核心架構"Hourglass" * Bottleneck: hourglass使用Bottleneck作為block的架構,其實這也就是現今deep learning中知名的ResNet中的residual module  事實上,residual module有下面兩種,而Bottleneck為下方右圖所示  根據ResNet的論文: [Deep Residual Learning for Image Recognition](https://arxiv.org/pdf/1512.03385.pdf),左邊和右邊的架構有相近的時間複雜度,使用的總參數量也相同,但右邊可以input的維度更高。在需要訓練更深的網路時,使用Bottleneck可以節省GPU RAM的使用。如下圖可以看到通過bottleneck的使用,34層的resnet和50層的resnet並不會有差距太大的時間複雜度。  我們可以來比較一下左邊的原始架構,與右邊的residual module的架構差異  對左邊架構來說,假設input為x,output為H(x),我們必須要去Fit整個H() 對右邊架構來說,假設input為x,output為x+F(x),我們只要去Fit F()就可以了 舉例來說 input x = 2.9 假設經過第一層convolution layer H1(x) = 3 則F(x) = 3 - 2.9 = 0.1 假設經過第二層convolution layer H1(x) = 3.1 則F(x) = 3.1 - 2.9 = 0.2 因此左邊架構的變化率為 3.1-3/3 = 0.033 右邊架構的變化率為 0.2-0.1/0.1 = 1 根據ResNet的論文,他們認為residual module的優勢在於,mapping這個殘餘值比起mapping主體來得更為容易 * Hourglass: hourglass是論文中重要的架構,這個架構的思路是:透過堆疊達到連續的down-sampling跟up-sampling, 從不同解析度的角度下locally去找出keypoint(頭、關節......等),透過skip layer把每一層抓到的keypoint傳遞到後面,最後再globally去把這些keypoint整合起來,組合出人類的姿態。  如下圖,這是一階的stackhourglass,而更多階的stackhourglass就是把虛線框中的stackhour glass替換一個新的一階stackhourglass   在此架構中,Convolution 和 maxpooling層用來down-sampling直到達低解析度。達到最低之後,開始做up-sampling,並且結合前面在各種解析度下抓到的特徵。 * 結合兩個鄰近解析度的圖片方法參考[Joint Training of a Convolutional Network and a Graphical Model for Human Pose Estimation](https://papers.nips.cc/paper/5573-joint-training-of-a-convolutional-network-and-a-graphical-model-for-human-pose-estimation),對低解析度的圖片做upsampling後,再對兩組feature做elementwise的相加 upsampling到network的output解析度之後,兩個接續的1*1convolution用來做最後的預測,最後的output會是數張heatmap,顯示關節在每個pixel的機率。  (PS.輸出的16個channel是因為在mpii資料集中將人類劃分成16個關節點) ### Layer Implementation * 近期的研究指出,小的filter更能重要的空間特徵,因此論文的模型架構最大只用到3 * 3的filter * 透過將原本的convolution block 換成 residual block,模型的表現得到了提升,並且使用了Intermediate Supervision也得到了不錯的效果 #### Intermediate Supervision  透過Intermediate Supervision,可以避免vanishing gradient(loss隨著不斷的傳播而被縮小)。在中間階段就計算loss,可以保證weight的更新不會出現太大的異常 大多數的高階特徵只會在圖片被downsampling到最低解析度時被截取出來。對於關節globally的關係是十分重要的,雖然我們也可以選擇在早期就開始做supervision,但此時對於globally的線索還不夠 但是如果upsampling時才開始做supervision,我們所看到的全局也會被縮小 因此,論文中採用Intermediate Supervision的方式(上圖的藍色區域),在模型對預測目標有一定了解後,去評估這個模型的好壞。 Intermediate Supervision會把在模型中間就透過convolution layer產生出heatmap,並將預測結果mapping回feature space,加回原本extract的feature 整個network中,一共使用了8個hourglass module,且這些module的weight並不共享,也因此每個hourglass module的loss會單獨計算 *(這部分理解的有點模糊,如果之後有時間可以把它弄懂)* ### Training Detail * 使用FLIC 和 MPII Human Pose兩種資料集 * FLIC: 5003 從電影中擷取的圖片 (3987 training, 1016 testing),圖片通常只有面向鏡頭的上半身 * MPII Human Pose: 大約 25k 張圖片 + 對應多人的annotations(40k annotated samples, 28k training, 11k testing) * test的annotation並沒有被提供,因此所有paper都會利用trainning set被標記為validation的部分來評估模型的好壞(大約3000左右的sample) * MPII提供許多種類的姿體動作(並且全身性的圖片) * 由於模型只能做single person的姿態預測,因此模型會找到正中心的後進行crop,並且resize到256 * 256後輸入模型 * 損失函數的計算是預測的heatmap與實際結果heatmap的MSE ### Result * 使用PCK指標評估預測結果(Percentage of Correct Keypoints),計算實際的關節位置與預測位置的標準化偏差距離 * FLIC使用軀幹長度做標準化 * MPII使用頭的尺寸做標準化(頭頂到頸部距離),此指標又被稱PCKh * FLIC:  * MPII:   ### Practice [pose-hg-demo](https://github.com/princeton-vl/pose-hg-demo) 這是原本paper的source code,但因為需要搭建torch7,有一些技術上的困難 [PyTorch-Pose](https://github.com/bearpaw/pytorch-pose) 因此使用了這個pytorch版本試跑看看,code中提供了1層、2層及8層的stackhourglass pre-trained model,可以看到下圖的測試結果 *  模型主要預測的部位有頭、肩、肘、手腕、腰部、膝蓋、及腳踝,可以看到8層的架構在各關節的預測上都優於其他 也可以稍微看一下不同模型的預測結果(雖然粗淺的看大同小異) * s1  * s2  * s8  ### Reference [给妹纸的深度学习教学(4)——同Residual玩耍](https://zhuanlan.zhihu.com/p/28413039) [论文笔记Stacked Hourglass Networks](https://zhuanlan.zhihu.com/p/45002720)
×
Sign in
Email
Password
Forgot password
or
By clicking below, you agree to our
terms of service
.
Sign in via Facebook
Sign in via Twitter
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
New to HackMD?
Sign up