HumanML3D与DeepPhase:运动潜在扩散模型在3D人体动作生成中的代码解析

HumanML3D; motion-latent-diffusion; DeepPhase 代码介绍 一些经典动作生成代码的解读 阅读详情

1. 从零开始:理解HumanML3D与DeepPhase的结合

如果你对3D人体动作生成感兴趣,最近肯定绕不开两个词:HumanML3D 和 DeepPhase。我第一次看到这个组合时,也觉得有点懵,这俩东西放一块儿能干嘛?简单来说,你可以把HumanML3D想象成一个巨大的、标注好的“动作字典”,里面包含了各种人体运动的3D数据。而DeepPhase,则像是一个经验丰富的“动作分析师”,它擅长从复杂的运动数据中,提炼出最核心、最本质的“相位”信息,比如走路时哪只脚着地、挥手时手臂的节奏。

那么,motion-latent-diffusion(运动潜在扩散模型)在这里扮演什么角色呢?它就像一个顶级的“动作生成导演”。导演(扩散模型)拿到了剧本(文本描述,比如“一个人高兴地跳跃”),然后他需要从动作字典(HumanML3D)里找素材,同时听取动作分析师(DeepPhase)的专业意见,最后合成一段全新的、符合剧本要求的流畅动作。我们今天要做的,就是钻进这位“导演”的工作室,看看他的剧本(代码)到底是怎么写的,每一个分镜(函数)是如何实现的。

为什么这个组合值得深究?我自己的体会是,单纯用扩散模型生成动作,很容易得到“飘忽”或者“脚滑”的不自然结果。DeepPhase提供的相位信息,比如脚部接触地面的精确时刻,就像给生成过程加了一个物理锚点,让生成的角色能稳稳地“踩”在地上。而HumanML3D提供了高质量、多样化的数据基础,确保“导演”有足够丰富的素材库进行学习。接下来,我们就一步步拆解这个结合了数据、先验知识和生成模型的复杂系统,我会尽量用我踩过的坑和调试的经验,让你不仅能看懂,还能自己动手复现关键部分。

2. 数据基石:HumanML3D的预处理与运动表示

在让模型学习之前,我们必须把原始的3D动作数据“烹饪”成模型能消化、且喜欢吃的格式。HumanML3D数据集本身已经做了很多清洗工作,但拿到我们手里,还需要经过一系列关键的预处理步骤。这些步骤隐藏在代码里,却是整个流程稳定的基石。

2.1 骨骼对齐与标准化:让人人都从“T-Pose”开始

想象一下,如果数据集里每个人的骨架长短不一、初始站姿(有的朝东,有的朝北),模型直接学肯定会混乱。所以第一步就是骨骼对齐。在 motion_representation.py 的 uniform_skeleton 函数里,这个操作非常直观。

# 代码逻辑示意(非原封不动拷贝)
def uniform_skeleton(positions, tgt_offsets):
    # positions: 原始骨骼关节点位置 [序列长度, 关节点数, 3]
    # tgt_offsets: 一个标准骨架的骨骼朝向和长度信息
    # 1. 计算缩放比例:通常用腿骨长度作为基准
    src_leg_len = np.linalg.norm(positions[0, 左髋] - positions[0, 左膝])
    tgt_leg_len = np.linalg.norm(tgt_offsets[左髋] - tgt_offsets[左膝])
    scale_rt = tgt_leg_len / src_leg_len

    # 2. 缩放所有关节点位置
    positions = positions * scale_rt

    # 3. 将根节点(通常是臀部)平移到原点
    root_pos_init = positions[0, 0]  # 第一帧的根节点位置
    positions = positions - root_pos_init

    # 4. 身体朝向转正:让第一帧的正面朝向Z轴正方向
    # 计算身体正面方向(例如,通过左右髋和左右肩的向量计算)
    forward_init = compute_forward_direction(positions[0])
    target_forward = np.array([0, 0, 1])
    root_quat_init = qbetween_np(forward_init, target_forward) # 计算旋转四元数

    # 5. 将整个序列应用这个旋转,让人物“转正”
    positions = qrot_np(root_quat_init, positions)
    return positions

我在这里踩过一个坑:这个“转正”操作是基于第一帧的朝向。这意味着如果一段动作是以侧身开始的(比如侧向行走的起始帧),那么整个序列都会被旋转,导致全局方向变化。在评估生成动作时,有时需要忽略这个全局旋转,关注动作本身的相对运动。另一个关键点是 amass_to_pose 函数中那个“绕着X轴顺时针旋转90度”的操作。这是因为不同3D软件和数据集(如AMASS)的坐标系(Y-up还是Z-up)不同,这个旋转是为了统一到项目约定的坐标系(通常是Y轴向上,Z轴向前)下。忘记这一步,生成的人可能会“躺”在地上。

2.2 运动特征的精心计算:速度、角速度与脚部接触

对齐骨骼位置只是第一步,模型真正学习的是这些位置变化所蕴含的运动特征。motion_representation.py 后半部分的核心就是计算一系列紧凑而富有表现力的特征。这些特征将被拼接成一个特征向量,作为扩散模型直接处理的对象。

  1. 根节点速度与角速度:这是描述人体整体运动的关键。

    • 根节点线性速度:不是简单地在世界坐标系下计算臀部位置差分。代码里先计算了差分,然后用根节点的旋转 r_rot 对它进行了一次旋转 qrot_np。我最初很不解,后来意识到,这是为了将速度表达在局部坐标系下。也就是说,这个速度特征描述的是“人体自身感觉到的前进/侧移速度”,而不是“世界坐标系下的绝对移动”。这更符合运动生成的直觉,也使得模型更容易学习。
    • 根节点角速度:通过相邻帧根节点旋转四元数的差异 qmul_np(r_rot[1:], qinv_np(r_rot[:-1])) 计算得到。它描述了身体朝向变化的快慢。
  2. 局部关节位置与速度:在根节点特征之外,我们还需要细节。

    • ric_data:这是除根节点外,所有关节点的局部坐标(相对于根节点,并且已经过“转正”)。它去除了全局平移和旋转,只保留姿态信息。
    • local_vel:关节点的局部速度。同样是在局部坐标系下计算,更能反映肢体自身的运动模式。
  3. 脚部接触(Foot Contact):这是DeepPhase思想的一个体现,也是让生成动作不“脚滑”的灵魂。代码里通过计算脚部关节(如脚踝、脚趾)的速度大小,并与一个经验阈值比较,来判断脚是否接触地面。这是一个二值特征(0或1),但它提供了至关重要的物理约束信号。在后续的IK(逆向运动学)处理或损失函数中,这个信号可以强制脚在接触期保持静止。

这些特征最终被拼接成如下的数据结构,成为模型的训练目标:

# 特征维度示意
# B: batch大小, seq_len: 序列长度
‘root_linear_velocity‘: (B, seq_len, 2)      # 根节点局部线性速度 (x,z)
‘root_angular_velocity‘: (B, seq_len, 1)     # 根节点角速度 (y轴旋转)
‘root_y‘: (B, seq_len, 1)                    # 根节点高度 (y坐标)
‘ric_data‘: (B, seq_len, (joint_num-1)*3)    # 局部关节位置
‘rot_data‘: (B, seq_len, (joint_num-1)*6)    # 关节旋转(6D表示)
‘local_velocity‘: (B, seq_len, joint_num*3)  # 局部关节速度
‘foot_contact‘: (B, seq_len, 4)              # 脚部接触状态(例如左脚跟、左脚尖、右脚跟、右脚尖)

3. 网络核心:Motion Latent Diffusion Model 架构拆解

数据准备好后,就该看看模型如何消化并生成它们了。运动潜在扩散模型的核心思想是:不直接在复杂的动作数据上添加噪声去噪,而是先用一个VAE(变分自编码器)把动作压缩到一个低维、平滑的潜在空间,然后在潜在空间里进行扩散和去噪。这样做大大降低了学习难度,提高了生成效率和稳定性。

3.1 动作编码器:MldVae 如何压缩动作

关键文件在 mld/models/architectures/mld_vae.py。这个VAE由编码器(Encoder)和解码器(Decoder)组成。

  • 编码器(Encoder):输入是我们上一节计算出的那个长长的运动特征向量。它通常由多个1D卷积层、残差连接和注意力层组成。为什么用1D卷积?因为动作是时间序列数据,1D卷积能很好地捕捉短时依赖关系(比如抬脚后必然落脚)。编码器的最终输出是两个向量:均值(mu)和对数方差(log_var),这代表了潜在空间中一个高斯分布的参数。通过“重参数化技巧”,从这个分布中采样,就得到了动作的潜在编码(latent code),维度通常是256,远小于原始特征。
  • 解码器(Decoder):它的任务是把采样得到的潜在编码,还原成原始维度的运动特征。结构上与编码器对称。训练VAE时,损失函数包含两部分:重建损失(让解码出的特征尽可能接近输入)和KL散度损失(让潜在空间的分布接近标准正态分布,保证其规整性和插值性)。

我实测下来,VAE的重建质量至关重要。如果VAE重建的动作都有明显失真或脚滑,那后续扩散模型学得再好也白搭。一个训练技巧是,可以先用较大的重建损失权重,确保VAE学会“记住”动作;后期再逐步增加KL散度的权重,让潜在空间更平滑。

3.2 文本编码器:让模型听懂你的话

要让模型根据文本生成动作,就必须把文本也变成向量。这部分在 mld/models/architectures/mld_clip.py 的 MldTextEncoder 中实现。它通常基于预训练的语言模型(如CLIP的文本编码器或BERT)。

# 简化流程示意
from transformers import AutoTokenizer, AutoModel
class MldTextEncoder(nn.Module):
    def __init__(self, model_name=‘bert-base-uncased‘):
        super().__init__()
        self.tokenizer = AutoTokenizer.from_pretrained(model_name)
        self.model = AutoModel.from_pretrained(model_name)

    def forward(self, text_list):
        # 1. 分词
        inputs = self.tokenizer(text_list, return_tensors=‘pt‘, padding=True, truncation=True)
        # 2. 通过预训练模型获取词嵌入
        outputs = self.model(**inputs)
        # 3. 通常取[CLS]标记的隐藏状态作为整个句子的表示
        text_embeddings = outputs.last_hidden_state[:, 0, :]  # [batch_size, hidden_dim]
        return text_embeddings

得到的 text_embeddings(例如768维)会被投影到与动作潜在空间相匹配的维度,然后与扩散模型中的时间步嵌入拼接,作为条件信息输入。这里有个细节:在 mld_denoiser 中,时间嵌入和文本嵌入拼接后,有时会只取前一部分参与计算,这是一种常见的特征融合与降维策略,目的是防止条件信息过强而淹没掉动作本身的生成。

3.3 扩散与去噪:在潜在空间中的“绘画”过程

这是最核心的生成部分,位于 mld/models/architectures/mld.py。扩散模型的工作分为两个过程:

  1. 前向扩散过程:这是一个固定的、逐步添加噪声的过程。对于VAE编码后的潜在动作 z_0,我们逐步添加高斯噪声,经过T步后,它会变成一个纯噪声 z_T。这个过程在训练时可以用一个公式直接计算任意步的噪声状态,不需要循环。
  2. 反向去噪过程:这是模型要学习的。它训练一个去噪网络(通常是U-Net结构),输入是第 t 步的带噪声潜在 z_t、时间步 t 和文本条件 c,目标是预测出添加到 z_t 中的噪声 ε。一旦这个网络训练好,我们就可以从纯噪声 z_T 开始,一步步预测并减去噪声,最终得到干净的潜在动作 z_0。

这个去噪网络的设计很有讲究。它需要处理时间序列数据,所以主干是1D U-Net,包含下采样和上采样块,中间还有注意力层来融合文本条件。文本条件 c 通常通过交叉注意力(Cross-Attention)机制注入到U-Net的中间层,让模型在去噪的每一步都能“看到”文本描述。

4. 逆向运动学(IK)与后处理:从数据到可驱动骨骼

模型输出了运动特征,但这还不是最终可用的3D骨骼动画。我们需要通过逆向运动学(IK) 将这些特征(特别是局部关节位置 ric_data)转换回骨骼的旋转角度,并处理脚部接触等物理约束。原始文章和代码中提到了两套IK实现,都值得研究。

4.1 基于标准姿态的IK计算

在 skeleton.py 的 inverse_kinematics_np 函数中,实现了一种基于标准T-Pose偏移的IK方法。它的思路很清晰:

  1. 计算全局朝向:首先,根据臀部(根节点)和肩膀的位置,估算出身体的“正面”方向。这个计算方式对于站立行走等动作有效,但对于躺下、倒立等姿势可能不准,这是该实现的一个局限性。
  2. 计算根节点旋转:计算从第一步得到的“正面”方向,到世界坐标系标准前方 [0,0,1] 的旋转四元数。这个旋转就是根节点(臀部)的全局旋转。
  3. 计算局部关节旋转:这是核心。已知:
    • t2m_raw_offsets:标准T-Pose下,每个子关节相对于父关节的偏移向量(方向+长度)。
    • 当前帧的关节全局位置(从 ric_data 和根节点位置恢复而来)。
    • 当前帧的关节局部位置(通过减去父关节的全局位置并除以父关节的全局旋转得到)。 那么,局部旋转就是:让标准偏移向量 t2m_raw_offsets,旋转到与实际局部位置向量对齐所需要的旋转。这个旋转就是该关节相对于父关节的局部旋转系数,也就是最终要存储的 quat_params。

这种方法本质上是基于稠密关节点位置的IK。它的优点是直接、快速,因为每个关节的位置都是已知的。但缺点是对关节位置误差敏感,且没有考虑骨骼长度约束(因为位置是给定的)。

4.2 DeepPhase中的迭代优化式IK

在DeepPhase的Unity实现中(Assets/Scripts/Tools/UltimateIK/UltimateIK.cs),我们看到了另一种更经典、更灵活的IK解法。它常用于游戏动画中,将手、脚等末端效应器定位到目标位置。

它的核心函数 Optimise 采用了一种从根节点向末端递归优化的策略:

void Optimise(Joint joint) {
    if(joint.Active) {
        Vector3 pos = joint.Transform.position;
        Quaternion rot = joint.Transform.rotation;
        Vector3 forward = Vector3.zero;
        Vector3 up = Vector3.zero;
        int count = 0;

        // 遍历该关节影响的所有目标(通常是末端,如手、脚)
        foreach(int index in joint.Objectives) {
            Objective o = Objectives[index];
            if(o.Active && o.SolvePosition) {
                // 关键计算:计算一个旋转,使得从当前关节到末端关节的向量,转向到目标方向
                Quaternion q = Quaternion.Slerp(
                    rot,
                    Quaternion.FromToRotation(Joints[o.Joint].Transform.position - pos, o.TargetPosition - pos) * rot,
                    GetWeight(joint, o) // 权重,控制调整幅度
                );
                forward += q * Vector3.forward;
                up += q * Vector3.up;
                count += 1;
            }
        }
        if(count > 0) {
            // 综合所有目标的影响,更新当前关节的旋转
            joint.Transform.rotation = Quaternion.LookRotation((forward/count).normalized, (up/count).normalized);
        }
    }
    // 递归优化子关节
    foreach(int index in joint.Childs) {
        Optimise(Joints[index]);
    }
}

这种方法的优点是:

  • 目标驱动:只关心末端位置是否到达目标,不关心中间关节具体路径,更符合“脚踩地”、“手抓物”这类任务。
  • 可加权融合:通过 GetWeight 函数,可以控制不同关节的调整幅度(例如,靠近躯干的关节调整小一些,更自然)。
  • 易于结合脚部接触:正如代码中 ProcessFootIK 所示,可以将计算出的 foot_contact 二值信号作为权重,在目标位置(地面固定点)和上一帧位置之间插值。当脚接触地面时(contact=1),目标位置完全锁定在地面点;当脚抬起时(contact=0),目标位置由网络生成的轨迹自由决定。这是解决“脚滑”问题的关键后处理步骤。

在实际项目中,我通常采用混合策略:先用第一种方法从网络输出快速解算出一个初始的旋转序列,然后对脚部等关键末端,再用第二种迭代IK方法,以 foot_contact 为约束进行微调。这样既能保证整体效率,又能获得物理上合理的足部效果。

5. 训练、推理与Blender渲染全流程

理解了各个模块,我们最后把它们串起来,看看从训练到最终看到动画的完整流程。

5.1 训练流程与损失函数

训练分为两个主要阶段:

  1. VAE训练:使用HumanML3D数据,输入运动特征,训练编码器和解码器。损失是重建损失和KL散度的加权和。
  2. 扩散模型训练:固定训练好的VAE编码器。对于每个训练样本:
    • 用VAE编码器得到潜在动作 z_0。
    • 随机采样一个时间步 t (1到T)。
    • 根据公式计算 z_t(即 z_0 加上了 t 步噪声后的状态)。
    • 将 z_t、时间步 t 的嵌入、文本条件嵌入一起输入去噪U-Net。
    • 计算U-Net预测的噪声与真实添加噪声之间的均方误差(MSE)。这就是扩散模型的核心损失。

在 models/losses/utils.py 中,你可能会看到更复杂的损失组合,比如对速度、脚部接触的额外约束损失,这些都是为了进一步提升生成动作的物理真实性和与文本的对齐度。

5.2 推理(生成)流程

当模型训练完成后,我们就可以用文本来生成动作了:

  1. 文本编码:输入描述文本(如“一个人慢慢走路”),通过文本编码器得到条件向量 c。
  2. 潜在空间采样:从标准正态分布中采样一个随机噪声 z_T。
  3. 迭代去噪:对于 t 从 T 到 1:
    • 将当前的 z_t、时间步 t 和条件 c 输入训练好的去噪U-Net。
    • U-Net预测出噪声 ε_θ。
    • 根据扩散模型的采样公式(如DDPM或DDIM),计算 z_{t-1}。
  4. VAE解码:经过T步去噪后,得到干净的潜在动作 z_0。将其输入VAE的解码器,得到重建的运动特征向量。
  5. 后处理与IK:
    • 调用 recover_from_ric 等函数,将运动特征(局部坐标、速度等)还原为全局3D关节位置序列。
    • 应用IK算法(如4.2节所述),将关节位置转换为骨骼旋转序列,并利用 foot_contact 信息进行脚部锁定修正。
  6. 输出:最终得到每一帧每个关节的旋转四元数,可以保存为FBX、BVH等标准动画格式,或直接用于游戏引擎。

5.3 使用Blender进行可视化渲染

代码库中通常包含用Blender进行渲染的脚本(如 mld/render/blender/render.py)。它的原理并不复杂:

  1. 导入骨骼数据:将生成的关节旋转数据(或位置数据)导入Blender。
  2. 创建骨架:在Blender中创建一个对应关节层级的骨架(Armature)。
  3. 关键帧绑定:将每一帧的关节数据(旋转或位置)设置为对应骨骼的变换属性,并插入关键帧。
  4. 网格蒙皮与渲染:可以创建一个简单的人体网格(如圆柱和球体拼接的简模),将其绑定到骨架上(蒙皮)。然后,Blender会在每一帧根据骨骼驱动网格变形,并渲染出图像或视频序列。

这个流程虽然自动化,但在调试时非常有用。你可以直观地看到生成动作的质量,检查脚滑、关节扭曲等问题。我在实际使用中,经常需要根据Blender渲染的结果,回头调整IK权重或损失函数,这是一个迭代优化的过程。

整个项目通过 OmegaConf 库来管理配置,这非常方便。你可以在一个YAML文件里定义模型结构、训练参数、数据路径等所有设置,代码通过 $ 引用这些值,使得实验管理和复现变得清晰。从数据预处理到模型训练,再到IK后处理和可视化,这条流水线上的每一个环节都充满了工程细节和调优技巧,希望这次的代码解析能帮你打通任督二脉,在实际动手时少走些弯路。

HumanML3D动作生成实战:从DeepPhase到motion-latent-diffusion的完整流程解析 本文深入解析HumanML3D动作生成技术栈,从DeepPhase特征提取到motion-latent-diffusion模型的完整流程。涵盖Unity数据预处理、VAE隐空间构建等关键环节,并提供Blender渲染调试技巧,助力开发者掌握三维人体运动生成的前沿技术。 阅读详情

相关推荐

HumanML3D与Motion-Latent-Diffusion:DeepPhase代码解析与实战应用

本文深入解析了基于HumanML3D数据集与Motion-Latent-Diffusion模型的动作生成技术,通过剖析DeepPhase项目代码,详细阐述了从3D动作数据预处理、潜空间编码到条件扩散模型生成的全流程。文章结合实战应用,指导读者如何搭建环境、训练模型并生成符合文本描述的3D人体动画,为AI驱动的内容创作提供了清晰的技术路径。

weixin_29054399的博客 49

探索HumanML3D:3D人体动作学习与重建的新里程

在数字化时代,3D人体动作捕捉和理解正成为虚拟现实、游戏开发、体育分析和医疗康复等领域的重要技术。而今天我们要介绍的开源项目——,正是一个以机器学习为核心,致力于3D人体运动捕捉数据处理和动作识别的工具库。 ## **项目简介** _HumanML3D_是一个基于Python的库,它利用深度学习模型对3D人体骨骼数据进行建模和预测。这个项目的目标是为开发者提供一个易用且高效的平台,以便他们能够...

gitblog_00020的博客 1696

【motion】标签体系设计与检索 1:HumanML3D 和 KIT Motion-Language(KITML)

HumanML3D与KITML数据集对比与应用建议 摘要 HumanML3D和KIT Motion-Language(KITML)是动作-语言关联研究领域的两大关键数据集。KITML作为2016年发布的奠基性数据集,首次提出3D动作-文本关联标准化方法,包含3,911段动作和6,278条描述,采用MMM统一格式和困惑度筛选机制。2022年发布的HumanML3D则在规模上实现突破,包含14,616段动作和44,970条多视角描述,采用SMPL标准化骨骼,成为当前文本到3D动作生成的主流基准。两个数据集共同构

突围 7370

HumanML3D 完整数据集下载

9.得到完整 HumanML3D 数据集 ./HumanML3D 下,(解压 ./HumanML3D/tests.zip)注册并进入 Downloads,下载下面所有文件并解压到 amass_data/ 下。解压并放入 创建 body_models/ 文件夹下 dmpls、smplh。8.执行 motion_representation.ipynb 文件。注册并进入 Downloads,下载。2.安装conda环境,并进入安装依赖。注册并进入 Downloads,下载。5.进入 jupyter。

qq_53930200的博客 6369

HumanML3D数据集下载[项目源码]

HumanML3D是一个大型且多样化的3D人类动作-语言数据集,结合了HumanAct12和Amass数据集,涵盖了广泛的人类动作,包括日常活动、体育运动、杂技和艺术等。文章提供了该数据集的百度网盘下载链接,并分享了预处理代码运行过程中遇到的问题及解决方法。网盘链接为:https://pan.baidu.com/s/1x5VRKkVQz5ybtHi421Agsw?pwd=1234,提取码为1234。

网格聚类 Grid Clustering/Grid-based Clustering

本文主要简单介绍了网格聚类的基本概念,优缺点,应用场景,建模时的注意事项,评价指标,实现方法,python示例和模型参数等。

JasonH2021的博客 4829

【免费下载】 HumanML3D 项目常见问题解决方案

HumanML3D 是一个开源的3D人类运动-语言数据集,它结合了 HumanAct12 和 Amass 数据集。这个项目涵盖了广泛的人类动作,包括日常活动(如行走、跳跃)、运动(如游泳、打高尔夫)、杂技(如翻滚)以及艺术表演(如跳舞)。HumanML3D 的每个运动片段都带有3-4个通过 Amazon Mechanical Turk 注释的单句描述。这些运动以每秒20帧的速度下采样,每个片段持续...

gitblog_00273的博客 1312

【短路计算篇】短路电流计算详解:从理论到实践

短路电流是指在正常电路中电势不同的两点之间发生阻抗极小的故障而引起的过电流。短路时电流强度很大,可能达到额定电流的10-15倍,大容量电力系统中短路电流可达数万安。简单比喻:短路就像水管突然爆裂,水流瞬间增大很多倍,对管道系统造成巨大冲击。短路电流计算是电气系统设计中的基础性工作,关系到整个系统的安全运行。通过本文介绍的各种计算方法,工程师可以根据具体情况选择合适的方法进行准确计算。

2301_81299416的博客 3972

MDM配置

普普通通的mdm配置

livalica的博客 1253

Unity3D用c#脚本调用前端javascript函数:H5获取unity - webgl 加载并初始化完成的消息

unity3d发布的Webgl 可以作为静态文件加载到H5页面中,并通过javascript 调用unity内置的C#脚本函数,详见Webgl调用unity api。而往往我们需要知道Webgl ready的消息,本文将给出unity 内部调用javascript函数的方案加以解决。

Bravo 2477

04-协议基础03:USB 2.0信号与电气特性

USB 2.0使用两根差分信号线D+/D-进行数据传输,支持低速(1.5Mbps)、全速(12Mbps)和高速(480Mbps)三种速率。USB总线为主从模式,所有事务由Host发起。端电阻值作用HostRpd(D+)15KΩ±5%下拉,默认低电平HostRpd(D-)15KΩ±5%下拉,默认低电平全速设备Rpu(D+)1.5KΩ±5%上拉到3.3V,标识全速低速设备Rpu(D-)1.5KΩ±5%上拉到3.3V,标识低速USB 2.0硬件要点。

内核笔记 105

HumanML3D与DeepPhase:从运动潜在扩散到局部速度特征解析

本文深入探讨了如何利用HumanML3D数据集与运动潜在扩散模型,结合DeepPhase技术对局部速度特征进行解析,以实现高质量、可控的3D人体动作生成。文章详细解析了从数据预处理、特征工程到模型生成的核心流程,揭示了局部速度特征在捕捉运动本质、提升动作自然度方面的关键作用,为AI理解与创造人体运动提供了完整的技术路径。

v6b7n8m9q0的博客 706

Ros入门 (十)----激光雷达避障 简易实现

本篇文章通过订阅/scan话题获取障碍物的距离信息,达到避障目的,提供部分代码,仅供参考。

weixin_51157015的博客 1万+

3D动作生成避坑指南:HumanML3D中的DeepPhase与motion-latent-diffusion常见问题解析

本文深入解析了基于HumanML3D数据集进行3D动作生成时,在DeepPhase数据处理与motion-latent-diffusion模型训练中遇到的关键问题与解决方案。重点探讨了全局旋转处理、速度计算、脚部接触标签生成等数据预处理细节,并分享了VAE潜空间调优、文本条件融合及IK后处理等模型调试与优化经验,旨在帮助开发者避开常见陷阱,构建更稳定、高质量的文本驱动3D动作生成流程。

yyy34的博客 472

手把手教你学Simulink——基于电机驱动系统的场景实例:轮毂电机在电动汽车中的分布式驱动控制仿真

本文详细介绍了基于MATLAB/Simulink和Simscape Electrical的电动汽车轮毂电机分布式驱动控制系统建模方法。内容包括系统结构设计(轮毂电机、逆变器、控制器等模块)、完整的建模过程(从基础模块导入到车辆动力学建模)、控制器设计与转矩分配策略实现,以及仿真参数设置与结果分析。通过仿真验证了该分布式驱动系统在速度跟踪、转弯性能等方面的优异表现,为电动汽车驱动系统的研究与开发提供了有效的仿真验证平台。文中还提供了相关代码示例和资料推荐,是学习Simulink电机控制系统建模的实用指南。

MHD0815的博客 4914

手把手教你从入门到精通C# Modbus通信

本文是《Modbus通信从入门到精通》的导读,本专栏将会详细介绍ModusRTU 、ModbusASCII、ModbusTCP这三种协议的C#实现,由一个高级工程师多年实战经验总结而成,绝对干货!

qq_34059233的博客 1万+

HumanML3D 完整数据集下载,百度网盘链接

是一个大型且多样化的3D人类动作-语言数据集,结合了HumanAct12和Amass数据集,涵盖了广泛的人类动作,如日常活动(如“走路”、“跳跃”)、体育运动(如“游泳”、“打高尔夫”)、杂技(如“侧手翻”)和艺术(如“跳舞”)。根据官方文档下载并运行预处理代码得到的结果像这样,中间也遇到了报错,不过也顺利解决了。

qq_74349310的博客 915

【YOLOv11改进 - 特征融合】SDI:多层次特征融合模块,替换contact操作

【YOLOv11改进 - 特征融合】SDI:多层次特征融合模块,替换contact操作

专注于图像领域,主要研究内容包括计算机视觉和深度学习,特别是在图像分类、目标检测和图像生成等方面有深入的研究和实践经验。 1771

【论文笔记】DeepPhase: Periodic Autoencoders for Learning Motion Phase Manifolds (SIGGRAPH, 2022)

作者提出了一种称为周期性自动编码器(Periodic Autoencoder)的新型神经网络架构,它可以以无监督的方式从大型非结构化运动数据集中学习周期性特征。具体而言,角色的动作被降维分解为多个潜在特征(Latent Embedding),不同特征捕获不同身体部位随时间变化的非线性周期性。同时从Latent Embedding提取的多维相空间可以有效地对不同动作进行聚类并生成相比原始运动空间更好的流形。最后,模型学到的周期性latent可以显着帮助改善许多任务中的神经运动合成,甚至包括舞蹈动作生

Jurio的博客 2046

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

python项目body-visualizer==1.1.0、configer==1.4.1和psbody-mesh==0.4爆红问题

最近在跑动作生成项目的时候用到了HumanML3D相关的数据集,其中需要将HumanML3D跑出来的结果另外项目的训练集使用。在跑HumanML3D的过程中发现body-visualizer、configer和psbody-mesh库均不可以直接下载,同时在python的官方库中也没有找到相应版本的whl包以及源码包。

qq_46051851的博客 1907

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

从零开始使用HumanML3D:数据结构、文件格式与标注规范详解

HumanML3D是一个大型多样化的3D人体运动-语言数据集,为研究人员和开发者提供了丰富的人体运动与文本描述配对数据。本文将详细介绍该数据集的核心数据结构、文件格式规范以及标注体系,帮助新手快速上手使用这一强大资源。 ## 📊 数据集核心组成 HumanML3D数据集主要包含运动数据、文本描述和辅助文件三大类核心资源,通过科学的组织方式实现运动与语言的精准对齐。 ### 运动数据文件

gitblog_00092的博客 387

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

HumanML3D终极指南:从零开始掌握3D运动-语言数据集

HumanML3D 3D运动数据集是当前最全面的3D人类动作与文本描述数据集,包含14,616个运动序列和44,970个文本描述。无论你是计算机视觉研究者还是动作生成爱好者,这份指南都将帮你快速上手并深度应用这个强大的数据集。 ## 🚀 5分钟快速上手:环境配置与数据获取 ### 第一步:项目克隆与环境搭建 首先获取项目代码并创建虚拟环境: ```shell git clone http

gitblog_00678的博客 1181

HumanML3D完全指南:解锁3D人体运动与语言的完美结合

探索HumanML3D这个开创性的3D人体运动-语言数据集,它将彻底改变你对人机交互的理解。作为结合HumanAct12和AMASS数据集的杰作,HumanML3D为研究人员和开发者提供了一个前所未有的平台,让计算机能够真正理解人类的运动意图。 ## 🎯 数据集核心价值解析 HumanML3D数据集的核心魅力在于其丰富的多样性和精确的标注。想象一下,一个包含14,616个运动序列和44,97

gitblog_00023的博客 773

HumanML3D终极指南:从入门到精通的3D人体运动-语言数据集

HumanML3D是一个大规模、多样化的3D人体运动-语言数据集,结合了HumanAct12和AMASS数据集,为文本到动作生成研究提供了重要基础。本指南将带您深入了解这个数据集的核心特性、技术架构和实际应用。 ## 数据集核心亮点 HumanML3D数据集以其丰富的内容和高质量标注而著称,具有以下突出特点: | 特性 | 数值 | 说明 | |------|------|------| |

gitblog_00680的博客 477

LLM日报-6.27-ChatPaperDaily-(1)

论文简介: 大型多模态模型:CVPR 2023教程笔记(1): 本文研究背景是近期用于视觉与语言建模的大型GPT模型,为了构建和超越多模态GPT-4,引出了对大型多模态模型(LMMs)进行指导调整的研究。(2): 过去的方法主要是基于图像到文本的生成模型,但存在一些问题,因此需要对大型多模态模型进行改进。本文提出了指导调整的方法,并在多模态空间进行扩展,以解决这些问题。(3): 本文介绍了如何使用开源资源构建多模态GPT-4的最小原型,并回顾了最近出现的相关主题。创新点在于将指导调整方法应用于多模态模型,并

hehedadaq的博客 1838
上一篇: Zotero双平台同步优化:PC与iPad内置阅读器无缝协作指南
下一篇: Cellranger实战指南:从数据比对到表达矩阵生成
lambda
博客等级 码龄23年 49粉丝 1303原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值