草庐IT

MHformer源码解读

图谋不轨~ 2023-11-11 原文

MHformer 源码学习


(上图转载知乎,侵权删)

1. 数据方面

1.1 下载过来的数据

“data_2d_h36m_cpn_ft_h36m_dbb”压缩包内是 2D关键的数据;“data_3d_h36m”内是3D关节点的数据。

a、3D关节点数据解压查看

读取“data_3d_h36m”压缩包内的 positions_3d.npy 文件;读取数据后,数据的格式是dict类型,第一层含有7个dict的字典,然后中的每一个元素均是含有30个dict的字典,这30个dict的字典中包含元素是一个动作序列维度表示为(动作序列长度,17,3),“S”表示 人物。

-S1

----actions

----------frames

-----------------joints

-----------------------xyz

b、2D关节点数据解压查看

“data_2d_h36m_cpn_ft_h36m_dbb”压缩包内有两个文件,一个是metadata.npy,另一个是positions_2d.npy。

metadata.npy中含有的信息是2D 骨架中左右手边关节的 Index,左边6个,右边6个,没有包括对称中心线。

positions_2d.npy中含有的信息是4台相机的2D骨架数据,和3D数据类似也是层层字典数据嵌套,第一层字典元素表示 ‘S’ 人物,第二次字典嵌套则表示的是该 人物下的 动作类,第三次字典嵌套表示 该人物该动作下的 相机类(哪个相机拍的)。

-S

----actions

----------cameras

---------- ----frames

---------------------joints

----------------------------xyz

1.2 对于数据的处理流程

1.2.1、训练阶段

pytorch的数据需要用data.Dataset的子类,在本项目中,使用的是

①构建自己的Dataset先

②然后将自己构成的Dataset作为实参输入到data.Dataset的子类中从而初始化了一个data.Dataset的子类对象。

①、读取 3D Dataset(Human36mDataset)
a、加载 相机内外参数据

b、加载数据集数据

构建的自己的Dataset 类名叫: Human36mDataset 继承于 MocapDataset(这样的做法应该是为了起到抽象的作用,松耦合的模式)

这处理的过程是在 读取的数据的基础上 加上了4 相机的外参(注意 同一个人下的相同相加下的外参是相同的-代码详,但是不同的相机的同一个人的外参,以及同一个相机的不同人的外参不一样)

c、修改数据为17个关节点(原本的32个)
②、加载2D数据、预处理(prepare_data函数)

目的:1)输出得到 经过了长度对齐于3D数据,并且标准化后的2D数据

​ 2)得到了额外标签position_3D下的处于相机坐标系的3D数据(每个人的动作下有四个)

加载2D数据

a、坐标系转换3D-w2c 并处理真值(除盆骨外均变为相对向量)

训练阶段 我们的目的是 在 相机坐标系下 将2D姿态估计出相机坐标系下的3D姿态来,所以需要将3D的数据转换到 每个人下的 四台相机下(数据量一下翻了4倍)。如下图所示在原本的Dataset上同 “position”,"cameras"下额外加了一个标签“positions_3d”表示这个人四台相机坐标系下的3D关节点。

b、2D 数据与3D数据长度一致化

动作序列长度一致化的前提是:2D动作的序列 大于等于 3D动作的序列

c、2D数据标准化

将2D数据 根据其拍摄的相机内参进行标准化到 [-1,1],这样有利于模型的训练

③、以相机为最小单位制作 序列数据(fetch函数)

输出:out_camera_params, out_poses_3d, out_poses_2d

序列数据就是一个人一个动作下的数据,先从Dataset中取出序列数据,使得可以统一检索,比如检索号是(S_Index,action_Index,camera_Index),则可以找到同一组的信息

a、2D 序列数据

b、序列数据下的相机内参

c、3D序列数据

④、分块生成器-用于DataLoad中的Batch操作(ChunkedGenerator函数)

ChunkedGenerator的主要作用是生成一个 generator的类使得在在DataLoad在调用__getitem__时,可以通过generator产生一个 batch。

a、pairs的形成-ChunkedGenerator中把序列数据处理为单帧

分析:一个pairs的包表示一段序列,单个pair中的元素由五个组成,分别是:((人物、动作类型、相机编号)、这一帧在序列中的Index范围(左闭右开)、augment_vector、reverse_augment_vector)。

通过(人物、动作类型、相机编号) 便可以找到这一个动作序列

b、get_batch的处理

猜想:DataLoad在取数据时随机从 paris中抽出一个其index,通过其index在获得其pair中信息比如(人物、动作类型、相机编号),找到其对应的序列后 然后对该index处于序列中的位置进行 感受野放大(输入、输出都放大)-放大为frames大小,不能放大的index对其进行左padding,右padding。

c、最后

这样 输入的是 一帧2D 图像=>感受野放大为 frames,输出的也是 放大的感受野为frames的3D骨架,且均处于该相机坐标系下。

1.2.2、Demon阶段

–通过 Yolov3框出图像中的人

–将框中人进行2D人体姿态估计,并将数据保存

–读取训练好的模型与2D关节点数据

–输入一帧2D,预处理2D数据

–输出前预处理3D数据,输出一帧3D

–画图

①、2D数据的预处理与输出

1、2D的数据进行感受野放大

2、2D数据标准化到 [-1,1]

3、对称骨架数据 并重新创建一个维度

4、将2D的数据 分两次放入 模型中(第一次是没有对称的,第二次放入是对称了的)

5、3D数据输出处理

输出的也是两个带有感受野的数据,将对称的与没对称进行取均值,然后压缩维度取感受野中的那帧即为 最终的输出,这样就是实现了端到端了,输入是一帧,输出是一帧(虽然输入后进行了预处理padding)

2、模型方面

模型输入:的是2D关节点(归一化为[-1,1]带有画面纵横比的,像素坐标系下)

loss对比的真值是:其相机坐标系下 进行 人体平移后,除盆骨外所有关节点向量以盆骨为起点了(注意没有RT变换的,仅仅是平移),但是在 训练时,取DataLoad时把 盆骨关节点 置为 0.这样一来获得的3D人体姿态就是全是相对对于盆骨向量的,没法获得其与相机坐标系之间的信息了

模型的输出则是:盆骨的位置 为0, 而其他关节点向量则是相对于盆骨的

进行 人体平移后,除盆骨外所有关节点向量以盆骨为起点了(注意没有RT变换的,仅仅是平移),但是在 训练时,取DataLoad时把 盆骨关节点 置为 0.这样一来获得的3D人体姿态就是全是相对对于盆骨向量的,没法获得其与相机坐标系之间的信息了

模型的输出则是:盆骨的位置 为0, 而其他关节点向量则是相对于盆骨的

待更新…

有关MHformer源码解读的更多相关文章

  1. UE4 源码阅读:从引擎启动到Receive Begin Play - 2

    一、引擎主循环UE版本:4.27一、引擎主循环的位置:Launch.cpp:GuardedMain函数二、、GuardedMain函数执行逻辑:1、EnginePreInit:加载大多数模块int32ErrorLevel=EnginePreInit(CmdLine);PreInit模块加载顺序:模块加载过程:(1)注册模块中定义的UObject,同时为每个类构造一个类默认对象(CDO,记录类的默认状态,作为模板用于子类实例创建)(2)调用模块的StartUpModule方法2、FEngineLoop::Init()1、检查Engine的配置文件找出使用了哪一个GameEngine类(UGame

  2. elasticsearch源码关于TransportSearchAction【阶段三】 - 2

    1.回顾.TransportServicepublicclassTransportServiceextendsAbstractLifecycleComponentTransportService:方法:1publicfinalTextendsTransportResponse>voidsendRequest(finalTransport.Connectionconnection,finalStringaction,finalTransportRequestrequest,finalTransportRequestOptionsoptions,TransportResponseHandlerT>

  3. (附源码)vue3.0+.NET6实现聊天室(实时聊天SignalR) - 2

    参考文章搭建文章gitte源码在线体验可以注册两个号来测试演示图:一.整体介绍  介绍SignalR一种通讯模型Hub(中心模型,或者叫集线器模型),调用这个模型写好的方法,去发送消息。  内容有:    ①:Hub模型的方法介绍    ②:服务器端代码介绍    ③:前端vue3安装并调用后端方法    ④:聊天室样例整体流程:1、进入网站->调用连接SignalR的方法2、与好友发送消息->调用SignalR的自定义方法 前端通过,signalR内置方法.invoke()  去请求接口3、监听接受方法(渲染消息)通过new signalR.HubConnectionBuilder().on

  4. Cesium源码解析一(terrain文件的加载、解析与渲染全过程梳理) - 2

    快速导航(持续更新中…)Cesium源码解析一(terrain文件的加载、解析与渲染全过程梳理)Cesium源码解析二(metadataAvailability的含义)Cesium源码解析三(metadata元数据拓展中行列号的分块规则解析)Cesium源码解析四(Quantized-Mesh(.terrain)格式文件在CesiumJS和UE中加载情况的对比)目录1.前言2.本篇的由来3.terrain文件的加载3.1更新环境3.2更新和执行渲染命令3.3数据优化3.4结束当前帧4.总结1.前言  目前市场上三维比较火的实现方案主要有两种,b/s的方案主要是Cesium,c/s的方案主要是u

  5. 论文解读OTA: Optimal Transport Assignment for Object Detection - 2

    CSDN优秀解读:https://blog.csdn.net/jiaoyangwm/article/details/1266387752021https://arxiv.org/pdf/2103.14259.pdf关键解读在目标检测中标签分配的最新进展主要寻求为每个GT对象独立定义正/负训练样本。在本文中,我们创新性地从全局的角度重新审视标签分配,并提出将分配程序制定为一个最优传输(OT)问题——优化理论中一个被充分研究的课题。具体来说,我们将每个需求方(锚框)和供应商(GT标签)的单位传输成本定义为他们的分类和回归损失加权之和。在公式化后,找到最好的分配方案即为最小传播成本解决最优传输方案,

  6. 停车系统源码-基于springboot+uniapp开源项目 - 2

    Iparking停车收费管理系统-可商用介绍Iparking是一款基于springBoot的停车收费管理系统,支持封闭车场和路边车场,支持微信支付宝多种支付渠道,支持多种硬件,涵盖了停车场管理系统的所有基础功能。技术栈Springboot,MybatisPlus,Beetl,Mysql,Redis,RabbitMQ,UniApp功能云端功能序号模块功能描述1系统管理菜单管理配置系统菜单2系统管理组织管理管理组织机构3系统管理角色管理配置系统角色,包含数据权限和功能权限配置4系统管理用户管理管理后台用户5系统管理租户管理多租户管理6系统管理公众号配置租户公众号配置7系统管理操作日志审计日志8系统

  7. 打通源码,高效定位代码问题|云效工程师指北 - 2

    大家好,我叫胡飞虎,花名虎仔,目前负责云效旗下产品Codeup代码托管的设计与开发。代码作为企业最核心的数据资产,除了被构建、部署之外还有更大的价值。为了帮助企业和团队挖掘更多源代码价值以赋能日常代码研发、运维等工作,云效代码团队在大数据和智能化方向进行了一系列的探索和实践(例如代码搜索与推荐),本文主要介绍我们如何通过直接打通源代码来提高研发与运维效率。随着微服务架构的流行,一个业务流程需要多个微服务共同完成。一旦出现问题,运维人员在面对数量多、调用链路复杂的情况下,很难快速锁定导致问题发生的罪魁祸首:代码。为了提高排查效率,目前常见的解决方案是:链路跟踪+日志分析工具相结合。即通过链路跟踪

  8. Android Studio开发之使用内容组件Content获取通讯信息讲解及实战(附源码 包括添加手机联系人和发短信) - 2

    运行有问题或需要源码请点赞关注收藏后评论区留言一、利用ContentResolver读写联系人在实际开发中,普通App很少会开放数据接口给其他应用访问。内容组件能够派上用场的情况往往是App想要访问系统应用的通讯数据,比如查看联系人,短信,通话记录等等,以及对这些通讯数据及逆行增删改查。首先要给AndroidMaifest.xml中添加响应的权限配置 下面是往手机通讯录添加联系人信息的例子效果如下分成三个步骤先查出联系人的基本信息,然后查询联系人号码,再查询联系人邮箱代码 ContactAddActivity类packagecom.example.chapter07;importandroid

  9. java 版本企业电子招投标采购系统源码之登录页面 - 2

    ​ 信息数智化招采系统服务框架:SpringCloud、SpringBoot2、Mybatis、OAuth2、Security前端架构:VUE、Uniapp、Layui、Bootstrap、H5、CSS3涉及技术:Eureka、Config、Zuul、OAuth2、Security、OSS、Turbine、Zipkin、Feign、Monitor、Stream、ElasticSearch等企业电子化采购系统企业电子化采购系统是明理公司在多家大、中、小型企业采购需求的分析与实际应用的基础上,结合企业采购流程优化再造理念开发的一体化电子招标采购平台,对于招标项目提供交易过程的全流程电子化、规范化管

  10. 若依框架解读(微服务版)——2.模块间的调用逻辑(ruoyi-api模块)(OpenFeign)(@innerAuth) - 2

    模块之间的关系我们可以了解到一共有这么多服务,我们先启动这三个服务其中rouyi–api模块是远程调用也就是提取出来的openfeign的接口ruoyi–commom是通用工具模块其他几个都是独立的服务ruoyi-api模块api模块当中有几个提取出来的OpenFeign的接口分别为文件,日志,用户服务我们以RemoteUserService接口为例子:其中contextId="remoteUserService"为bean的名称,value=ServiceNameConstants.SYSTEM_SERVICE为接口的描述,fallbackFactory=RemoteUserFallback

随机推荐