目錄
摘要
Abstracts
簡介
Hourglass Module(Hourglass 模塊)
網絡結構
Intermediate Supervision(中間監督)
訓練過程細節
評測結果
摘要
本周閱讀了《Stacked Hourglass Networks for Human Pose Estimation》,作者在人體姿態估計問題上提出了一種沙漏型的網絡結構。特征在所有尺度上進行處理,并整合,以最有效地捕捉與身體相關的各種空間關系。作者展示了,重復進行自底向上和自頂向下的處理,并配合中間監督對提升網絡的性能至關重要。作者將該架構稱為 “堆疊沙漏” ,該網絡連續執行池化和上采樣的步驟,最終產生一組預測。該方法在FLIC 數據集和MP Ⅱ數據集上的實現了當時最優的結果。
Abstracts
Reading "Stacked Hourglass Networks for Human Pose Estimation" this week, the authors propose an hourglass-type network architecture on the problem of human pose estimation. Features are processed at all scales and integrated to most effectively capture the various spatial relationships associated with the body. The authors show that repeated bottom-up and top-down processing, combined with intermediate supervision, is critical to improving the performance of the network. The authors refer to this architecture as a "stacked hourglass". The network performs the steps of pooling and upper envelope continuously, resulting in a set of predictions.
This method achieves the best results on FLIC data set and MP ⅱ data set.
簡介
理解人類的姿態對于一些高級的任務比如行為識別來說特別重要,而且也是一些人機交互任務的基礎。作者提出了一種新的網絡結構Stacked Hourglass Networks來對人體的姿態進行識別,這個網絡結構能夠捕獲并整合圖像所有尺度的信息。之所以稱這種網絡為Stacked Hourglass Networks,主要是它長得很像堆疊起來的沙漏,如下圖所示:
這種堆疊在一起的Hourglass模塊結構是對稱的,bottom-up過程將圖片從高分辨率降到低分辨率,top-down過程將圖片從低分辨率升到高分辨率,這種網絡結構包含了許多pooling和upsampling的步驟,pooling可以將圖片降到一個很低的分辨率,upsampling可以結合多個分辨率的特征。
下面介紹具體的網絡結構。
Hourglass Module(Hourglass 模塊)
Hourglass模塊設計的初衷就是為了捕捉每個尺度下的信息,因為捕捉像臉,手這些部分的時候需要局部的特征,而最后對人體姿態進行預測的時候又需要整體的信息。為了捕獲圖片在多個尺度下的特征,通常的做法是使用多個pipeline分別單獨處理不同尺度下的信息,然后再網絡的后面部分再組合這些特征,而作者使用的方法就是用帶有skip layers的單個pipeline來保存每個尺度下的空間信息。
在Hourglass模塊中,卷積和max pooling被用來將特征降到一個很低的分辨率,在每一個max pooling步驟中,網絡產生分支并在原來提前池化的分辨率下使用更多的卷積,當到達最低的分辨率的時候,網絡開始upsample并結合不同尺度下的特征。這里upsample(上采樣)采用的方法是最鄰近插值,之后再將兩個特征集按元素位置相加。
當到達輸出分辨率的時候,再接兩個1×1的卷積層來進行最后的預測,網絡的輸出是一組heatmap,對于給定的heatmap,網絡預測在每個像素處存在關節的概率。
網絡結構
Residual Module
Fig.3中的每個方框都由下面這樣的殘差塊組成:
Residual Module
上圖的殘差塊是論文中的原圖,描述的不夠詳細,自己看了下源代碼之后,畫出了如下圖所示的Residual Module:
貼出一段作者提供的關于Residual Module的源代碼:
local conv = nnlib.SpatialConvolution
local batchnorm = nn.SpatialBatchNormalization
local relu = nnlib.ReLU-- Main convolutional block
local function convBlock(numIn,numOut)return nn.Sequential():add(batchnorm(numIn)):add(relu(true)):add(conv(numIn,numOut/2,1,1)):add(batchnorm(numOut/2)):add(relu(true)):add(conv(numOut/2,numOut/2,3,3,1,1,1,1)):add(batchnorm(numOut/2)):add(relu(true)):add(conv(numOut/2,numOut,1,1))
end-- Skip layer
local function skipLayer(numIn,numOut)if numIn == numOut thenreturn nn.Identity()elsereturn nn.Sequential():add(conv(numIn,numOut,1,1))end
end-- Residual block
function Residual(numIn,numOut)return nn.Sequential():add(nn.ConcatTable():add(convBlock(numIn,numOut)):add(skipLayer(numIn,numOut))):add(nn.CAddTable(true))
end
Hourglass Module
Hourglass Module由上面的Residual Module組成,由于它是一個遞歸的結構,所以可以定義一個階數來表示遞歸的層數,首先來看一下一階的Hourglass Module:
上圖中的Max pool代表下采樣,Res代表上面介紹的Residual Module,Up Sample代表上采樣。多階的Hourglass Module就是將上圖虛線框中的塊遞歸地替換為一階Hourglass Module,由于作者在實驗中使用的是4階的Hourglass Moudle,所以我們畫出了4階的Hourglass Module的示意圖:
整體結構
網絡輸入的圖片分辨率為256×256,在hourglass模塊中的最大分辨率為64×64,整個網絡最開始要經過一個7×7的步長為2的卷積層,之后再經過一個殘差塊和Max pooling層使得分辨率從256降到64。下面貼出作者提供的整個網絡結構的源代碼:
paths.dofile('layers/Residual.lua')local function hourglass(n, f, inp)-- Upper branchlocal up1 = inpfor i = 1,opt.nModules do up1 = Residual(f,f)(up1) end-- Lower branchlocal low1 = nnlib.SpatialMaxPooling(2,2,2,2)(inp)for i = 1,opt.nModules do low1 = Residual(f,f)(low1) endlocal low2if n > 1 then low2 = hourglass(n-1,f,low1)elselow2 = low1for i = 1,opt.nModules do low2 = Residual(f,f)(low2) endendlocal low3 = low2for i = 1,opt.nModules do low3 = Residual(f,f)(low3) endlocal up2 = nn.SpatialUpSamplingNearest(2)(low3)-- Bring two branches togetherreturn nn.CAddTable()({up1,up2})
endlocal function lin(numIn,numOut,inp)-- Apply 1x1 convolution, stride 1, no paddinglocal l = nnlib.SpatialConvolution(numIn,numOut,1,1,1,1,0,0)(inp)return nnlib.ReLU(true)(nn.SpatialBatchNormalization(numOut)(l))
endfunction createModel()local inp = nn.Identity()()-- Initial processing of the imagelocal cnv1_ = nnlib.SpatialConvolution(3,64,7,7,2,2,3,3)(inp) -- 128local cnv1 = nnlib.ReLU(true)(nn.SpatialBatchNormalization(64)(cnv1_))local r1 = Residual(64,128)(cnv1)local pool = nnlib.SpatialMaxPooling(2,2,2,2)(r1) -- 64local r4 = Residual(128,128)(pool)local r5 = Residual(128,opt.nFeats)(r4)local out = {}local inter = r5for i = 1,opt.nStack dolocal hg = hourglass(4,opt.nFeats,inter)-- Residual layers at output resolutionlocal ll = hgfor j = 1,opt.nModules do ll = Residual(opt.nFeats,opt.nFeats)(ll) end-- Linear layer to produce first set of predictionsll = lin(opt.nFeats,opt.nFeats,ll)-- Predicted heatmapslocal tmpOut = nnlib.SpatialConvolution(opt.nFeats,ref.nOutChannels,1,1,1,1,0,0)(ll)table.insert(out,tmpOut)-- Add predictions backif i < opt.nStack thenlocal ll_ = nnlib.SpatialConvolution(opt.nFeats,opt.nFeats,1,1,1,1,0,0)(ll)local tmpOut_ = nnlib.SpatialConvolution(ref.nOutChannels,opt.nFeats,1,1,1,1,0,0)(tmpOut)inter = nn.CAddTable()({inter, ll_, tmpOut_})endend-- Final modellocal model = nn.gModule({inp}, out)return modelend
畫個圖吧:
圖中的4階Hourglass Module就是前面講的4階Hourglass Module,可以看到整個網絡還是挺龐大的,圖中的漸變紅色塊就是加入了中間監督的地方,即在此處使用loss函數,下面講一下中間監督。
注意,上面的整體網絡結構圖中中間監督的地方輸出的通道數為16是針對于MPII Human Pose這個數據集,因為該數據集將人體劃分為16個關節點,具體參見 人體姿態估計數據集整理(Pose Estimation/Keypoint)
Intermediate Supervision(中間監督)
作者在整個網絡結構中堆疊了許多hourglass模塊,從而使得網絡能夠不斷重復自底向上和自頂向下的過程,作者提到采用這種結構的關鍵是要使用中間監督來對每一個hourglass模塊進行預測,即對中間的heatmaps計算損失。
關于中間監督的位置,作者在文中也進行了討論。大多數高階特征僅在較低的分辨率下出現,除非在上采樣最后。如果在網絡進行上采樣后進行監督,則無法在更大的全局上下文中重新評估這些特征;如果我們希望網絡能夠進行最佳的預測,那么這些預測就不應該在一個局部范圍內進行。
由于hourglass模塊整合了局部和全局的信息,若想要網絡在早期進行預測,則需要它對圖片有一個高層次的理解即使只是整個網絡的一部分。最終,作者將中間監督設計在如下圖所示位置:
The network splits and produces a set of heatmaps (outlined in blue) where a loss can be applied. A 1x1 convolution remaps the heatmaps to match the number of channels of the intermediate features. These are added together along with the features from the preceding hourglass.
在整個網絡中,作者共使用了8個hourglass模塊,需要注意的是,這些hourglass模塊的權重不是共享的,并且所有的模塊都基于相同的ground truth添加了損失函數。下面介紹訓練過程的細節。
關于中間監督loss的計算,論文中是這么說的:
Predictions are generated after passing through each hourglass where the network has had an opportunity to process features at both local and global contexts. Subsequent hourglass modules allow these high level features to be processed again to further evaluate and reassess higher order spatial relationships.
所以,每個Hourglass Module的loss是單獨計算的,這樣使得后面的Hourglass Module能夠更好地再評估。
訓練過程細節
作者在FLIC和MPII Human Pose數據集上進行了訓練與評估。這篇論文只能用于單人姿態檢測,但是在一張圖片中經常有多個人,解決辦法就是只對圖片正中心的人物進行訓練。將目標人物裁剪到正中心后再將輸入圖片resize到256×256。為了進行數據增量,作者將圖片進行了旋轉(+/-30度)、scaling(.75-1.25)。
網絡使用RMSprop進行優化,學習率為2.5e-4. 測試的時候使用原圖及其翻轉的版本進行預測,結果取平均值。網絡對于關節點的預測是heatmap的最大激活值。損失函數使用均方誤差(Mean Squared Error,MSE)來比較預測的heatmap與ground truth的heatmap(在節點中心周圍使用2D高斯分布,標準差為1)
為了提高高精度閾值的性能,在轉換回圖像的原始坐標空間之前,預測在其下一個最高鄰居的方向上偏移四分之一像素。
評測結果
評測指標采用的是標準的PCK指標(Percentage of Correct Keypoints),這個指標指出了檢測結果關鍵點落在ground truth的標準化距離之內的比例。對于FLIC數據集來說,距離按軀干大小標準化,對于MPII數據集來說,距離按頭的大小標準化。
FLIC上的評測結果
MPII上的評測結果
關于中間監督的位置,作者也進行了對比實驗,結果如下圖所示:
可以看到結果最好的是HG-Int,即在最終輸出分辨率之前的兩個最高分辨率上進行上采樣后應用中間監督。
關于hourglass模塊使用的個數,作者也進行了對比實驗,分別采用2、4、8個堆疊的hourglass模塊進行對比實驗,結果如下所示:
首先,為了探索堆疊沙漏設計的效果,必須證明性能的變化是架構形狀的函數,而不是更大、更深網絡容量的增加導致的。為了做出比較,作者將八個沙漏模塊堆疊在一起組成基準網絡,每個沙漏僅有一個殘差塊。通過打亂層的順序來改變網絡排列。減少沙漏的數量將導致每個沙漏容量的增加。比如,一個網絡堆疊了四個沙漏,那么每個分辨率下將有兩個連續的殘差塊(或者兩個沙漏以及四個殘差塊)。如圖所示。所有網絡具有相同數量的參數和層數,只有在使用更多中間監督時才有些微差別。