深度學習學習筆記(34周)

目錄

摘要

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模塊進行對比實驗,結果如下所示:

首先,為了探索堆疊沙漏設計的效果,必須證明性能的變化是架構形狀的函數,而不是更大、更深網絡容量的增加導致的。為了做出比較,作者將八個沙漏模塊堆疊在一起組成基準網絡,每個沙漏僅有一個殘差塊。通過打亂層的順序來改變網絡排列。減少沙漏的數量將導致每個沙漏容量的增加。比如,一個網絡堆疊了四個沙漏,那么每個分辨率下將有兩個連續的殘差塊(或者兩個沙漏以及四個殘差塊)。如圖所示。所有網絡具有相同數量的參數和層數,只有在使用更多中間監督時才有些微差別。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/70621.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/70621.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/70621.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

JVM類文件結構深度解析:跨平臺基石與字節碼探秘

目錄 一、類文件&#xff1a;Java生態的通用語言 1.1 字節碼的橋梁作用 1.2 類文件核心優勢 二、類文件二進制結構剖析 2.1 整體結構布局 2.2 魔數與版本控制 2.3 常量池&#xff1a;類文件的資源倉庫 2.4 訪問標志位解析 三、核心數據結構詳解 3.1 方法表結構 3.2 …

wps中zotero插件消失,解決每次都需要重新開問題

參考 查看zotero目錄 D:\zotero\integration\word-for-windows 加載項點擊 dotm即可 長期解決 把dom 復制到 C:\Users\89735\AppData\Roaming\kingsoft\office6\templates\wps\zh_CN還是每次都需要重新開的話 重新加載一下

如何設計合理的樹狀結構表:平衡查詢效率與維護效率

樹狀結構廣泛應用于數據建模中&#xff0c;例如 商品分類、組織架構、權限管理 等場景。合理設計樹形結構的數據庫表&#xff0c;能夠有效提升 查詢效率 和 維護效率。本文將探討如何在設計時平衡這兩者&#xff0c;詳細介紹常用的幾種樹狀結構存儲方式及其適用場景。 一、樹狀…

List 接口中的 sort 和 forEach 方法

List 接口中的 sort 和 forEach 方法是 Java 8 引入的兩個非常實用的函數&#xff0c;分別用于 排序 和 遍歷 列表中的元素。以下是它們的詳細介紹和用法&#xff1a; sort 函數 功能 對列表中的元素進行排序。 默認使用自然順序&#xff08;如數字從小到大&#xff0c;字符…

深度學習驅動的車牌識別:技術演進與未來挑戰

一、引言 1.1 研究背景 在當今社會&#xff0c;智能交通系統的發展日益重要&#xff0c;而車牌識別作為其關鍵組成部分&#xff0c;發揮著至關重要的作用。車牌識別技術廣泛應用于交通管理、停車場管理、安防監控等領域。在交通管理中&#xff0c;它可以用于車輛識別、交通違…

GitCode 助力至善云學:構建智慧教育平臺

項目倉庫&#xff1a; 前端&#xff1a;https://gitcode.com/Fer_Amiya/vue-ZhiShanYunXue-Client 后端&#xff1a;https://gitcode.com/Fer_Amiya/go-ZhiShanYunXue-Server 突破傳統教學困境&#xff0c;探索教育新解法 傳統教學的習題講評環節&#xff0c;教師面臨著難以…

系統架構設計師備考策略

一、備考痛點 系統架構設計師考試以 知識體系龐雜、實踐性強 著稱&#xff0c;官方教材《系統架構設計師教程&#xff08;第2版&#xff09;》厚達 700 余頁&#xff0c;若盲目通讀耗時費力。根據近三年考情分析&#xff0c;“抓重點 分層突破 實戰輸出” 是高效通關的核心策…

nnUNet V2修改網絡——加入MultiResBlock模塊

更換前,要用nnUNet V2跑通所用數據集,證明nnUNet V2、數據集、運行環境等沒有問題 閱讀nnU-Net V2 的 U-Net結構,初步了解要修改的網絡,知己知彼,修改起來才能游刃有余。 MultiRes Block 是 MultiResUNet 中核心組件之一,旨在解決傳統 U-Net 在處理多尺度醫學圖像時的局…

verilog基礎知識

一,Verilog和VHDL區別 全世界高層次數字系統設計領域中,應用Verilog和VHDL的比率是80%和20%;這兩種語言都是用于數字電路系統設計的硬件描述語言, 而且都已經是 IEEE 的標準。 VHDL 是美國軍方組織開發的,VHDL1987年成為標準;Verilog 是由一個公司的私有財產轉化而來,…

HarmonyOS 開發套件 介紹——下篇

HarmonyOS 開發套件 介紹——下篇 在HarmonyOS的生態中&#xff0c;開發套件作為支撐整個系統發展的基石&#xff0c;為開發者提供了豐富而強大的工具和服務。本文將深入繼續介紹HarmonyOS SDK、ArkCompiler、DevEco Testing、AppGallery等核心組件&#xff0c;幫助開發者全面掌…

小懌學習日記(七) | Unreal引擎燈光架構

燈光的布局對于HMI場景中車模的展示效果有著舉足輕重的地位。本篇內容將簡單介紹ES3.1的相關知識&#xff0c;再深入了解Unreal引擎中車模的燈光以及燈光架構。 一、關于ES3.1 1.1 什么是ES3.1 ES3.1這個概念對于美術的同學可能比較陌生&#xff0c;ES3.1指的是OpenGL ES3.1&…

【洛谷排序算法】P1012拼數-詳細講解

這道題本質上是通過確定數字的拼接順序來得到最大拼接數&#xff0c;雖然主要思路是利用字符串及其比較規則來實現&#xff0c;但也可以基于數組結合一些轉換操作來解決&#xff0c;以下是大致思路和代碼示例&#xff1a; 【算法思路】 首先將輸入的數字存儲在數組中。然后自…

2025前端框架最新組件解析與實戰技巧:Vue與React的革新之路

作者&#xff1a;飛天大河豚 引言 2025年的前端開發領域&#xff0c;Vue與React依然是開發者最青睞的框架。隨著Vue 3的全面普及和React 18的持續優化&#xff0c;兩大框架在組件化開發、性能優化、工程化支持等方面均有顯著突破。本文將從最新組件特性、使用場景和編碼技巧三…

基于YOLO11深度學習的運動鞋品牌檢測與識別系統【python源碼+Pyqt5界面+數據集+訓練代碼】

《------往期經典推薦------》 一、AI應用軟件開發實戰專欄【鏈接】 項目名稱項目名稱1.【人臉識別與管理系統開發】2.【車牌識別與自動收費管理系統開發】3.【手勢識別系統開發】4.【人臉面部活體檢測系統開發】5.【圖片風格快速遷移軟件開發】6.【人臉表表情識別系統】7.【…

Docker 部署AnythingLLM

兩個指令搞定 1.下載鏡像 docker pull mintplexlabs/anythingllm 2.運行容器 export STORAGE_LOCATION$HOME/anythingllm mkdir -p $STORAGE_LOCATION chmod -R 777 $STORAGE_LOCATION touch "$STORAGE_LOCATION/.env" docker run -d -p 3001:3001 \ --cap-add SY…

java開發——為什么要使用動態代理?

舉個例子&#xff1a;假如有一個殺手專殺男的&#xff0c;不殺女的。代碼如下&#xff1a; public interface Killer {void kill(String name, String sex);void watch(String name); }public class ManKiller implements Killer {Overridepublic void kill(String name, Stri…

Moonshot AI 新突破:MoBA 為大語言模型長文本處理提效論文速讀

前言 在自然語言處理領域&#xff0c;隨著大語言模型&#xff08;LLMs&#xff09;不斷拓展其閱讀、理解和生成文本的能力&#xff0c;如何高效處理長文本成為一項關鍵挑戰。近日&#xff0c;Moonshot AI Research 聯合清華大學、浙江大學的研究人員提出了一種創新方法 —— 混…

Linux中的查看命令

路徑分為相對路徑&#xff08;行相對當前工作目錄開始的路徑&#xff09;和絕對路徑&#xff08;不管是&#xff09;#&#xff1a;命令提示符&#xff0c;從這個位置可以開始輸入命令&#xff0c;另一個提示符為$&#xff0c;如果是root&#xff0c;則提示為#&#xff1b;如果是…

如何用校園內網遠程連接服務器

注&#xff1a;本機家庭版windows11&#xff0c;要連接校園網&#xff0c;windows10/11一般都內置openssh&#xff0c;找到后安裝&#xff0c;被連服務器是linux 一、先查看是否安裝openssh&#xff0c;沒有的話安裝 方法一&#xff1a; -> 1.1 按下winR按鍵&#xff0c;…

AI客服-接入deepseek大模型到微信(本地部署deepseek集成微信自動收發消息)

1.本地部署 1.1 ollama Ollama軟件通過其高度優化的推理引擎和先進的內存管理機制&#xff0c;顯著提升了大型語言模型在本地設備上的運行效率。其核心采用了量化技術&#xff08;Quantization&#xff09;以降低模型的計算復雜度和存儲需求&#xff0c;同時結合張量并行計算&…