前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >人体姿势估计神经网络概述– HRNet + HigherHRNet,体系结构和常见问题解答

人体姿势估计神经网络概述– HRNet + HigherHRNet,体系结构和常见问题解答

作者头像
代码医生工作室
发布2020-06-29 09:55:37
7.6K0
发布2020-06-29 09:55:37
举报
文章被收录于专栏:相约机器人相约机器人

高分辨率网络(HRNet)是用于人体姿势估计的先进神经网络-一种图像处理任务,可在图像中找到对象的关节和身体部位的配置。网络中的新颖之处在于保持输入数据的高分辨率表示,并将其与高分辨率到低分辨率子网并行组合,同时保持有效的计算复杂性和参数计数。

https://arxiv.org/pdf/1902.09212.pdf

在这篇文章中,将介绍:

  • 为什么选择HRNet?
  • HRNet与架构
  • HigherHRNet:用于自下而上的人体姿势估计的规模感知表示学习
  • 示范影片
  • 代码常见问题解答

为什么选择HRNet?

  • 良好的文档记录和维护的开源(链接)。github上有2490颗星–在所有人体姿态估计中评分最高。

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch

  • 它被用作同一研究空间中最新新架构的中坚力量(项目示例)

https://jingdongwang2017.github.io/Projects/HRNet/PoseEstimation.html

  • 在许多姿势估计挑战中的顶级竞争对手(参考):

https://paperswithcode.com/paper/deep-high-resolution-representation-learning

在COCO上排名第一

在COCO上排名第一

在PoseTrack2017上排名第二

在MPII上排名第六

HRNet解释

在处理人的姿势估计时,我们需要能够检测图像中的人并估计其连接(或关键点)的配置。因此,存在两种可能的姿势估计方法:

自上而下和自下而上的姿势估计

自下而上的方法首先找到关键点,然后将其映射到图像中的其他人,而自上而下的方法首先使用一种机制来检测图像中的人,在每个人实例周围放置一个边界框区域,然后估计关键点边界框内的配置。

自上而下的方法依赖于单独的人员检测网络,并且需要为每个人员分别估计关键点,因此,由于它们不是真正的端到端系统,因此通常计算量很大。相比之下,自下而上的方法首先是通过预测不同解剖学关键点的热图来定位输入图像中所有人员的无身份关键点,然后将它们分组为人实例,这实际上使它们更快。

自上而下的方法更普遍,并且目前可以实现更好的预测准确性,因为它将两个任务分开使用为每个人训练的特定神经网络,并且由于自下而上的方法由于不同人群的规模变化而遇到预测关键点的问题在图像中(即,直到HigherHRNet出现- 下方)。自上而下的方法不存在这种比例变化,因为所有人员实例都被标准化为相同的比例。尽管自下而上的方法被认为更快,因为HRNet使用自上而下的方法,该网络用于根据人员边界框来估计关键点,该人员边界框是在推理/测试过程中由另一个网络(FasterRCNN)检测到的。在训练期间,HRNet使用给定数据集的带注释的边界框。

两个数据集用于训练和评估网络

  • COCO –超过20万张图片和25万个人实例,标有17个关键点。COCO数据集评估还需要评估人员边界框,这是使用FasterRCNN网络完成的。评估指标是对象关键点相似度(OKS) –标准关键点检测准确性指标。
  • MPII人类姿势–约25K图像和40K主题。MPII评估是使用数据集中带注释的边界框完成的。

Architecture

以下是基于git项目中的代码的神经网络图,其后是研究论文中描述的网络图。

HRNet网络架构基于已发布的开源

本文介绍的HRNet网络架构

需要注意的重要结构是,网络与较低分辨率的子网(分支2-4)并行计算高分辨率的子网(分支1)。子网通过熔断器层融合在一起,以使每个高到低分辨率表示都一遍又一遍地从其他并行表示中接收信息,从而得到丰富的高分辨率表示。

输入图像为256 x 192或384 x 288,相应的热图输出尺寸为64 x 48或96 x72。前两个卷积根据预期的热图尺寸减小输入尺寸。网络输出热图大小和17个通道-每个关键点(17个关键点)在热图中每个像素的值。

所示的开源体系结构用于32通道配置。对于48个通道,更改从第一过渡层到48的每一层,其乘数乘以2。

本文中的交换块是开源中的模块,交换单元是开源中的保险丝层。在纸本图中,过渡层看起来像是子网的独立融合,而在代码中,当创建较低分辨率(较高通道)的子网时,过渡层是基于导致前一个具有另一个卷积层的最低分辨率子网。同样,在开放源代码中,仅针对高分辨率分支(分支1)计算最后一层的融合,而不是为所有分支(如纸质图中所示)计算。

下采样是在融合部分(或交换单元)从高分辨率分支转移到较低分辨率分支的stride = 2卷积,对于两次和三次下采样仅在最后一次下采样中才增加了通道数。这要么是代码中的错误,要么是本文未明确解释。很有可能是代码错误,因为对于第一个下采样,信息不是从较深的通道中的较高分辨率解析而来的-git中的Open issue。

如有疑问,请使用基于开源的图表-这是在运行经过训练的网络时使用的图表。

网络训练

  • 对于权重初始化,作者使用ImageNet分类数据集上的不同输出层训练了相同的网络,并将权重值用作姿势估计训练的初始化值。
  • 上COCO数据集训练HRNet-W32 210个历元需要约约50-60小时,4分P100的GPU - 参考。

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch/issues/3

HigherHRNet:用于自下而上的人体姿势估计的规模感知表示学习

https://arxiv.org/abs/1908.10357

这是同一研究团队使用HRNet作为骨干用于自下而上的姿势跟踪的新网络。作者解决了自底向上姿势估计中比例尺变化的问题(如上所述),并指出他们能够通过输出多分辨率热图并使用HRNet提供的高分辨率表示来解决该问题。

HigherHRNet优于COCO数据集上的所有其他自下而上的方法,对于中型人员而言尤其如此。HigherHRNet还可以在CrowdPose数据集上获得最新的结果。作者指出,这表明自下而上的方法比起自上而下的方法对拥挤的场景更健壮,但在同一数据集上没有与常规自上而下的HRNet结果进行比较。

该网络的骨干是常规的HRNet,但最后增加了一部分,用于输出更高分辨率的热图:

说明拟议的High-HRNet的体系结构

架构的右侧部分输出两个热图-一个用于低分辨率,一个用于高分辨率-分辨率为128 x 128和256 x256。在推论期间,两个热图均被汇总为更高的分辨率,并且为关键点选择了最高值的点。检测。梯形是一个反卷积层,其输出分辨率高2倍,其后跟随4个残差块。而且,对于每个关键点,计算输出标量标签,接近标签值形成属于特定人物的一组关键点,而遥远标签值指示属于不同人物的关键点组。标记根据在所述的“缔合嵌入”方法计算本文。标签值仅针对最低分辨率的热图进行训练和预测,因为作者发现,经验上更高分辨率的热图的标签值无法学会预测,甚至无法收敛。

在训练过程中,损失函数是热图预测损失和标签值损失的加权平均值(根据关联嵌入方法,同一组标签之间的距离越小,损失就越小,不同组标签之间的距离就越远) 。每个热图分辨率损失均根据基本情况独立计算,并进行总和运算。

在检查HigherHRNet的开源代码之后,尚无可用的推理代码来基于受过训练的网络创建演示姿态估计视频。

https://github.com/HRNet/HigherHRNet-Human-Pose-Estimation

演示版

该演示视频基于HRNet中的推理脚本(这是一个经过修改的脚本,在连接之间绘制了图符,并且在运行时不打开弹出图像- 脚本链接)。

视频特征

  • 1920X1080像素,每秒25帧,56秒(1400帧)。
  • 多人示例,具有挑战性的场景的典范–均质和异质背景,不断变化的背景,不同的摄影机角度(包括放大和缩小)以及令人敬畏的姿势中的矮人。

运行时信息

  • 具有Resnet50的FasterRCNN用于人员检测
  • HRNet具有48个通道和384 x 288分辨率的输入图像。
  • 使用Dell笔记本电脑Core i5-7200、32GB RAM,GeForce 940MX,Ubuntu 18.04。在推理过程中,GPU的利用率达到了100%。
  • 跟踪帧中所有边界框的平均时间:1.14秒
  • 一帧中所有姿势估计的平均时间:0.43秒
  • 一帧解析的平均总时间:1.62秒
  • 代码在整个视频上进行推理的总时间:2586.09秒

演示中的问题

在评估图像处理算法的结果时,重要的是要注意该算法在哪些地方表现不佳,这为它的固有问题提供了线索:

  1. 在FasterRCNN中无法很好地检测出具有木背景的赤膊人士–这可能是FasterRCNN网络的训练数据问题,没有足够的赤膊样本或背景色类似于人色的样本
  2. 黄色的大蹦床被检测为人(00:11分钟)–这可能表明FasterRCNN具有同质场景并存在固有的问题。
  3. 即使在框内没有人或者不是所有关节都在显示,仍在边界框中检测到17个关键点– HRNet的构建方式是必须预测所有17个关节,即使它们不是可见的。
  4. 值得一提的是,即使在视频模糊的地方,也有不错的姿势估计。处理由于模糊而导致图像中的信息丢失是很棘手的,HRNet能够很好地解决这一问题。
  5. 还值得一提的是,矮人所握的棍棒没有被估计为四肢之一,这也是一个积极的信号。

代码常见问题解答

1.姿势跟踪在RGB中完成,而人员检测基线训练的网络在BGR

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch/issues/41

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch/issues/15

2.使用coco数据集API pycocotools与python 3不兼容。HRNet通常可以工作,但是一旦您开始使用pycocotools,可能会有例外。

https://github.com/cocodataset/cocoapi/issues/49

3.必须使用numpy 1.17:

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch/issues/177

4.如何使用自己的数据集训练网络:

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch/issues/68

5.在推论中,请考虑使用model.no_grad来提高性能并降低内存使用量(我尚未测试过)

6.第三个关节参数似乎始终为零,对于joints_3d_vis对象,前两个参数始终具有相同的生存能力标志,而第三个参数也为零,来自coco.py-> _ load_coco_keypoint_annotation_kernal()。在JoinsDataset-> getitem()-> affine_transform中,关节的大小为3,以进行仿射变换,但是从不使用第三个参数(可能是旧参数,或者已将其放置在以后供HigherHRNet使用)。MPII数据集似乎也发生了同样的事情。

7.在验证\测试期间,不使用带注释的关节(即使它们已保存在数据加载器管道中)–因此,在测试运行期间打印的精度结果不正确。在测试运行期间,精度计算的整个流程都是多余的。在运行结束时,他们使用coco api计算正确的精度度量

8.推理配置为384X288(但自述文件说使用256X192)

图像和关节变形

  • 演示/推论– box_to_center_scale()根据方框缩放图像,但不清楚pixel_std = 200的作用。关于它有几个未解决的问题:

https://github.com/microsoft/human-pose-estimation.pytorch/issues/26

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch/issues/23

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch/issues/9

https://github.com/microsoft/human-pose-estimation.pytorch/issues/94

“ 我认为它只是一个超级参数,代表边界框的默认w / h。别管它。“

  • 中心和比例是根据原始图像中检测到的带注释的bbox的位置确定的。Center是原始图像上bbox的中心,比例应该是bbox相对于原始图像的大小–来自coco.py-> _ load_coco_person_detection_results()。bbox由x,y,w,h = box [:4](x,y,width,height)构造。在计算比例时,将基于预配置的pixel_std和1.25比例进行长宽比和归一化。
  • 推论-> get_pose_estimation_prediction返回原始图像上的坐标(没有旋转,只有每个边界框的中心和比例)
  • JointsDataset-> getitem-> get_affine_transform得到一个转换,该转换根据原始图像的缩放比例大于bbox,然后将图像居中于bbox的中心。
  • 然后,warpAffine将原始图像转移到中间并提供比例尺,这意味着我们应该在输出图像中看到bbox的区域。裁剪输出图像,其“ 0,0点”对应于原始图像上的点,该点在转移到达0,0坐标后,从该点开始向右和向下移动。
  • 在训练期间,仿射变换还具有随机旋转缩放和翻转类JointsDataset –> __getitem __()
  • JointsDataset中self.db中的对象通过引用进行更改。在类COCODataset-> _load_coco_person_detection_results()的第246行中填充self.db。
  • 转换计算为:x_new(x_old的),y_new(y_old的),z = T *(x_old,y_old,1)
  • 观看示例的好地方:

https://docs.opencv.org/master/dd/d52/tutorial_js_geometric_transformations.html

  • 变换后,关节位置可以为负-它们以与图像相同的变换矩阵进行传输,并且由于根据边界框向中心进行变换并放大比例,因此某些关节可以位于框外。
  • MPII的中心和比例注释不完全清楚–

https://github.com/leoxiaobin/deep-high-resolution-net.pytorch/issues/51

推荐阅读

CVPR2020 Oral | 动态多尺度图表达3D人体骨架运动,实现精准预测效果超SOTA

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-19,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 相约机器人 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
GPU 云服务器
GPU 云服务器(Cloud GPU Service,GPU)是提供 GPU 算力的弹性计算服务,具有超强的并行计算能力,作为 IaaS 层的尖兵利器,服务于深度学习训练、科学计算、图形图像处理、视频编解码等场景。腾讯云随时提供触手可得的算力,有效缓解您的计算压力,提升业务效率与竞争力。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档