- 数据集
- 人工智能
- 具身智能
- 计算机视觉
- 多模态
- 机器人
【免费下载链接】humanplus-1000
HumanPlus-1000 是一个大规模多模态人类行为数据集,同步包含第一视角视觉、全身/手部运动、IMU 惯性测量与 SLAM 相机轨迹。本文将带你从零编写一个针对 HumanPlus-1000 的DataLoader,搭建完整的多模态训练管线:扫描 session 索引 → 读取 HDF5 标注 → 时间戳对齐 → PyTorch Dataset/DataLoader 封装 → 质量过滤,新手也能跟着跑通。
先认识数据:一个 session 长什么样
HumanPlus-1000 以session(会话)为基本单位组织数据。仓库预览版在data/目录下提供了 30 多个示例 session,每个 session 目录包含 4 类文件:
| 文件 | 内容 | 示例路径 |
|---|---|---|
annotation.hdf5 | 时间对齐的多模态标注(运动、IMU、SLAM、标定) | annotation.hdf5 |
fisheye_left.mp4/fisheye_right.mp4 | 立体鱼眼视频(1920×1200,30fps) | fisheye_left.mp4 |
metadata.json | 会话元信息:场景、参与者、设备、模态可用性与质量指标 | metadata.json |
打开任意一份 metadata.json,你会看到 5 大板块,它们是写 DataLoader 时的"筛选依据":
session:session_id、时长(duration_sec)、场景类型(scene_type,如 residential / bedroom / bathroom)capture:视频帧率、分辨率、IMU 数量、是否有立体相机availability:各模态是否可用的布尔开关(rgb、imu、body_motion、hand_motion等)processing:处理方法信息,如 SLAM 用droid、人体重建用CLOTHO、手部估计用HaMeRquality:质量指标,如hand_valid_ratio(手部标注有效帧占比)、slam_success
💡 写索引前先看
availability和quality,可以避免在训练中途读到缺失模态。
获取数据集与依赖准备
如果本地还没有数据,克隆仓库即可(仓库地址:https://gitcode.com/hf_mirrors/humanplus-ai/humanplus-1000):
git clone https://gitcode.com/hf_mirrors/humanplus-ai/humanplus-1000 cd humanplus-1000视频和 HDF5 文件通常由 Git LFS 托管,若文件只有几百字节,请补装 LFS 后拉取:
git lfs install git lfs pullPython 侧只需要两个核心依赖:h5py(读 HDF5)和opencv-python(读视频帧),PyTorch 用于 Dataset/DataLoader 封装。
第 1 步:扫描 data 目录,建立 session 索引
DataLoader 的第一步不是读数据,而是建索引。遍历data/下所有 session 目录,解析每份metadata.json,得到一张轻量索引表:
import json, glob, os def build_session_index(root="data"): index = [] for meta_path in sorted(glob.glob(os.path.join(root, "session_*/metadata.json"))): meta = json.load(open(meta_path)) index.append({ "path": os.path.dirname(meta_path), "session_id": meta["session"]["session_id"], "duration": meta["session"]["duration_sec"], "fps": meta["capture"]["video_fps"], "availability": meta["availability"], # 模态可用性 "quality": meta["quality"], # 质量指标 }) return index实用过滤技巧:训练多模态模型时,只保留所需模态全部可用的 session:
def has_all_modals(s, needed=("rgb", "imu", "body_motion", "hand_motion")): return all(s["availability"].get(k, False) for k in needed)这样索引构建完成后,每个样本点都是"可信"的,后续无需逐帧报错处理。
第 2 步:读取 annotation.hdf5 多模态标注
每个 session 的 annotation.hdf5 是所有模态的"总仓库"。完整结构图见 README.md 的HDF5 Annotation Structure一节,核心分组如下:
| 分组 | 典型内容 | 用途 |
|---|---|---|
video/timestamp_ns | 每帧视频的纳秒时间戳 | 时间对齐的基准 |
body_motion/smplh_pose | SMPL-H 全身参数 | 人体运动监督信号 |
body_motion/foot_contact_probability | 脚部着地概率 | 步态/导航任务 |
hand_motion/{left,right} | MANO 手部参数、joints_3d、valid、confidence | 手部动作建模 |
imu/body、imu/head | 加速度、角速度、姿态 | 惯性信号建模 |
slam/T_slamworld_camera | 相机世界系位姿 | 相机轨迹/世界坐标 |
depth/depth | 深度图(含min_depth_m等属性) | 深度监督/点云 |
calibration/ | 相机内参、畸变、立体外参 | 几何计算前必读 |
读取时记住两条原则:
- 只取需要的分组(h5py 支持惰性读取,按需
f["body_motion/smplh_pose"][:]); - 标定信息缓存在 session 级:
calibration/整段只读一次,不要每帧重复读。
第 3 步:帧级时间戳对齐
多模态训练最关键的环节是同步。HumanPlus-1000 所有模态都通过共享时间戳对齐(见 README.md 的 HDF5 说明):video/timestamp_ns记录了视频帧时间,而synchronization/video_frame_indices可以直接把视频帧号映射到标注帧。
推荐的取帧策略:
- 以
video/timestamp_ns为时间基准; - 对 IMU 等高频信号(
imu/body/timestamp_ns),用np.searchsorted做最近邻插值到目标帧时间; - 手部等稀疏且带有效标记的信号,直接用
hand_motion/right/valid与confidence过滤无效帧。
第 4 步:封装 PyTorch Dataset 与 DataLoader
把上面的逻辑包进Dataset,样本定义为滑动窗口(如 1.5 秒 = 45 帧),而不是整个 session,这样既能控制显存,又能构造足够多的训练样本:
class HumanPlusDataset(torch.utils.data.Dataset): def __init__(self, sessions, win=45): self.sessions = sessions self.win = win # 窗口帧数 self.cached = {} # session 级标定缓存 def __len__(self): return sum(int(s["duration"] * s["fps"] // self.win) for s in self.sessions) def __getitem__(self, i): s, start = self._locate(i) # i -> (session, 起始帧) ann = h5py.File(os.path.join(s["path"], "annotation.hdf5"), "r") frames = read_video_frames(s["path"], "fisheye_left.mp4", start, self.win) body = ann["body_motion/smplh_pose"][start:start + self.win] hand = ann["hand_motion/right/joints_3d"][start:start + self.win] valid = ann["hand_motion/right/valid"][start:start + self.win] return {"rgb": frames, "body": body, "hand": hand, "hand_valid": valid}外层用DataLoader组装训练管线:
loader = torch.utils.data.DataLoader( dataset, batch_size=4, shuffle=True, num_workers=4, collate_fn=collate_with_mask, )两个新手常忽略的细节:
hand_valid要一起 collate:多模态 batch 中手部标注并非每帧都有效,collate 时保留 mask,在损失里只对有效帧求平均;num_workers配persistent_workers=True:HDF5 每次打开文件有固定开销,常驻 worker 可显著提速。
第 5 步:质量过滤与缺失值处理
预览数据中hand_valid_ratio差异很大(从约 0.08 到 0.91 不等),说明手部标注稀疏是常态。建议在索引阶段就设置门槛:
index = [s for s in index if s["quality"]["slam_success"] and s["quality"]["hand_valid_ratio"] > 0.2 and has_all_modals(s)]同时利用scene_type字段可做分层采样,保证 residential、bedroom、bathroom 等场景在训练集中分布均衡。
新手避坑清单
- ❌ 直接把整个 session(数百帧)当作一个样本 → 显存爆炸,改用滑动窗口
- ❌ 每帧重复打开
annotation.hdf5和读标定 → 用session_id做缓存 - ❌ 忽略
availability开关直接读 → 部分 session 没有某模态,训练中途报错 - ❌ 用手部
joints_3d却不过滤valid/confidence→ 无效标注污染损失 - ✅ 先跑一个 session 的端到端小循环(读帧→对齐→打 batch),再扩展到全量
总结
按「索引 → 读 HDF5 → 时间戳对齐 → Dataset 封装 → 质量过滤」五步走,你就拥有了一个可用的 HumanPlus-1000 多模态 DataLoader。仓库 README.md 中还有完整的模态清单与 HDF5 结构说明,可作为查阅手册。下一步可以尝试:基于slam/point_cloud与depth/depth做几何任务,或结合behavior_annotation/里的行为标注做动作-语言联合建模。动手试试吧!
- 数据集
- 人工智能
- 具身智能
- 计算机视觉
- 多模态
- 机器人
【免费下载链接】humanplus-1000
相关推荐
HowToHunt 实战指南:利用 HTTP 请求头绕过 WAF——密码重置投毒(Password Reset Poisoning)与头部伪造攻击全解
HowToHunt 实战指南:利用 HTTP 请求头绕过 WAF——密码重置投毒(Password Reset Poisoning)与头部伪造攻击全解 本文以
数据集人工智能具身智能计算机视觉多模态机器人HumanPlus-1000-viewer使用教程:5分钟加载并可视化多模态人体行为数据
HumanPlus 1000 viewer使用教程:5分钟加载并可视化多模态人体行为数据 HumanPlus 1000 是一个大规模多模态人体行为数据集,同步采
数据集人工智能具身智能计算机视觉多模态机器人如何为RL训练选对模型:UniRL 25+多模态模型支持矩阵完整解析
如何为RL训练选对模型:UniRL 25+多模态模型支持矩阵完整解析 刚接触强化学习(RL)后训练时,新手最常被一个问题卡住: 我的模型到底支不支持 RL 训练
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考