深度学习学习笔记(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.mzph.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;同时结合张量并行计算&…