做 3D 姿态估计的人,应该都听过 VideoPose3D。这个 Facebook Research 开源的项目,核心思路是把 2D 关键点序列“提升”到 3D 空间,用时间卷积网络替代复杂的图结构,既保留了准确率,又让工程落地变得相对友好。我第一次接触它的时候,以为环境搭建跟普通 PyTorch 项目差不多,结果真上手发现:PyTorch 版本、CUDA 版本、模型权重下载、2D 检测器对接,每一步都可能让新手卡住。尤其是如果你只是想先跑通一个 Demo,很容易在环境问题上耗掉一整天。
这篇文章我想把自己搭 VideoPose3D 环境的全过程拆开讲清楚。不是照着 README 念一遍,而是从虚拟环境开始,到 PyTorch 安装、项目依赖、预训练模型下载、推理命令执行,再到常见报错排查,全部用我实际踩过的坑来串。适合刚接触这个项目、想在本地或服务器上复现 3D 姿态估计效果的同学,也适合准备基于它做二次开发的人参考。
1. VideoPose3D 是什么,环境搭建前需要想清楚的三件事
1.1 这个项目不是“视频直接出 3D”的傻瓜模型
很多人一开始会误以为 VideoPose3D 是输入一段视频,直接吐出一段 3D 骨骼动画。实际不是这样。它的主链路是:先用一个 2D 关键点检测器(比如 Detectron2、OpenPose 或者 HRNet)从视频帧里提取每个人的 2D 关键点坐标,然后把连续帧的关键点序列作为输入,用时间卷积网络去回归 3D 姿态序列。
这个设计带来的直接影响是:项目本身并不包含 2D 检测器,所以完整的环境搭建必须包含“2D 关键点检测环境”和“VideoPose3D 推理环境”两部分。你能不能用它跑自己的视频,一半取决于 VideoPose3D 装得好不好,另一半取决于你能不能把 2D 关键点送进模型。这个认知理清楚之后,再去搭环境就不会觉得“怎么这么多依赖”了。
1.2 环境搭建的核心思路:围绕 PyTorch 和 2D 关键点展开
VideoPose3D 的官方实现基于 PyTorch,所以环境搭建的主线非常清晰:装 Python、装虚拟环境、装 PyTorch、装 numpy 和 matplotlib。但难点在于版本匹配。PyTorch 要和 CUDA 匹配,CUDA 要和显卡驱动匹配,显卡驱动又要和操作系统匹配。这个链条里任何一环对不上,都能让你在import torch或者跑训练时看到各种奇奇怪怪的报错。
另外,因为项目依赖 2D 关键点数据,如果你要用自己的视频做端到端推理,就得再装一个 2D 关键点检测器。最常见的是 Detectron2,它本身又是一个独立的 PyTorch 项目,安装时经常跟 VideoPose3D 的依赖“打架”。所以我的建议是:先把 VideoPose3D 本身跑通,用官方提供的 2D 关键点数据文件做验证,成功之后再考虑接 Detectron2 或者其他检测器。
1.3 我用的推荐方案(系统 + Python + CUDA)
我前后在 Ubuntu 20.04 和 Windows WSL2 上都搭成功过,整体感受是:Linux 环境更省心,尤其是编译和 CUDA 支持更顺畅。如果你只是想在本地试一下,WSL2 也完全可以,但要注意 Windows 原生环境容易在torchvision和detectron2的编译环节翻车。
Python 版本我推荐 3.8 或者 3.9。VideoPose3D 本身对 Python 版本不算挑剔,但 Detectron2 对 Python 和 PyTorch 版本有明确限制,选择 3.8 可以兼顾两边。PyTorch 我建议装 1.12 或 1.13 这个区间,因为官方模型权重是在较老的 PyTorch API 下训练的,太新的版本(比如 2.x)也能跑,但偶尔会遇到torch.load的 key 映射小坑,不值得为了体验新特性去折腾。CUDA 用 11.3 到 11.7 都可以,关键是跟 PyTorch 的编译版本对应上。
提示:如果你机器上已经装了别的大项目,尽量不要在同一个 Python 环境里硬塞 VideoPose3D。单独建一个 conda 环境,后面能省掉大量“这个库版本冲突”的烦心事。
2. 基础环境搭建:虚拟环境、PyTorch、系统依赖
2.1 先用 conda 还是 venv?我更推荐 conda,尤其是要接 Detectron2 时
Python 虚拟环境无非 conda 和 venv 两个主流选择。单独跑 VideoPose3D 的话,venv 就够了;但只要你想后续接 2D 检测器,强烈建议直接用 conda。原因是 Detectron2 的安装依赖一些 C++ 编译库和特定版本的fvcore,conda 管理这些依赖比 pip 干净得多。
创建环境的命令很简单:
conda create -n videopose python=3.8 -y conda activate videopose进入环境后,顺手把 pip 升级一下,避免后面安装时出现旧版本 pip 的依赖解析问题:
pip install --upgrade pip如果你是 Ubuntu 系统,建议顺手把编译工具链装上,后面安装 Detectron2 或其他需要编译的包时会用到:
sudo apt update sudo apt install build-essential2.2 安装 PyTorch,版本匹配是重中之重
PyTorch 的安装是整个环境搭建里最容易被卡住的一步。我见过太多人直接pip install torch,装了一个带 CPU 的版本,结果后面跑模型发现慢得离谱;也有人显卡驱动跟不上,却强行装了一个要 CUDA 12 的 PyTorch,结果启动直接报driver version is too old。
正确做法是先去官网的 PyTorch Get Started 页面,选择你对应的系统、安装方式和 CUDA 版本,拿到对应的安装命令。举个例子,如果你用的是 CUDA 11.6,conda 安装命令类似这样:
conda install pytorch==1.12.1 torchvision==0.13.1 torchaudio==0.12.1 cudatoolkit=11.6 -c pytorch -c conda-forge装完之后,一定要验证 PyTorch 能否识别 GPU:
python -c "import torch; print(torch.__version__); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0))"如果torch.cuda.is_available()输出True,说明 PyTorch 和 CUDA 基本没问题了。如果输出False,先别急着重装,用nvidia-smi看下驱动支持的 CUDA 版本,再回头看 PyTorch 是不是装了 CPU 版本。
2.3 项目依赖和系统级工具(ffmpeg、libgl 等)
VideoPose3D 的官方仓库没有特别统一的requirements.txt,但核心依赖很清楚:numpy、matplotlib、torch、torchvision,以及用于读取视频的opencv-python和用于处理视频文件的ffmpeg。
我的安装顺序是这样的:
pip install numpy matplotlib opencv-python sudo apt install ffmpeg为什么强调ffmpeg?因为如果你最终要跑视频推理,VideoPose3D 的推理脚本底层依赖 OpenCV 的VideoCapture读取视频帧,而 OpenCV 读取很多视频格式时需要一个正常的 ffmpeg 后端。Ubuntu 上如果不装系统级的 ffmpeg,你可能会遇到Unable to get frame from camera或者视频读取出来全是黑帧的诡异问题。
另外,如果你在服务器上装的是精简版系统,可能还需要补一下 OpenGL 相关的库,因为 matplotlib 和 OpenCV 在渲染窗口时会依赖它们:
sudo apt install libgl1-mesa-glx libglib2.0-0这一行看起来无关紧要,实际能救很多人。
3. 拉取仓库、下载预训练模型、整理数据目录
3.1 clone 仓库后先把目录结构看清
基础环境装好之后,就可以拉项目代码了:
git clone https://github.com/facebookresearch/VideoPose3D.git cd VideoPose3D第一次 clone 下来,别急者跑命令,先看一眼目录结构。里面有几个关键目录:common放模型定义和训练工具,data放 2D 关键点检测结果和 3D 标签,inference放推理脚本,checkpoint一般是自己创建,用来放预训练权重。理解了这几个目录的关系,后面出问题才知道去哪里找原因。
官方仓库里通常不会把checkpoint目录直接放好,需要自己创建:
mkdir checkpoint3.2 预训练模型下载与放置位置
VideoPose3D 的预训练模型是以压缩包形式分发的,不同数据集和不同设置对应不同权重文件。常见的是在 Human3.6M 数据集上预训练的模型,它接受 2D 关键点序列,输出 3D 关键点序列。下载地址一般写在仓库 README 或者配置文件的注释里。
我实际用的方式是这样的:先从官方提供的链接把模型包下载到本地,然后解压到checkpoint目录下。解压后目录里会有一个.tar或.pt文件,后续推理时用--checkpoint output/checkpoint/model_name这样的参数指定。
这里有个特别容易踩的坑:很多人下载模型后,不确定该放在哪个路径,导致推理时反复提示找不到文件。解决办法很简单,在inference相关脚本里搜一下checkpoint默认前缀,或者看配置文件里写的是哪条路径,按那个路径放。一般来说,相对路径都是基于项目根目录的。
3.3 2D 关键点数据从哪里来
官方 demo 为了方便用户,会提供一组在 Human3.6M 数据集上预先提取好的 2D 关键点文件。如果你只是想验证环境是否通,直接用这些 2D 关键点数据是最稳的,完全不需要自己准备 2D 检测器。
但如果你想用自己拍摄的视频,就必须先跑一遍 2D 关键点检测,把结果保存成项目约定的 JSON 格式。这个 JSON 里通常包含每个视频帧的多人关键点坐标、置信度,以及骨骼连接顺序等信息。VideoPose3D 的推理脚本会读取这个 JSON,把 2D 关键点序列转成模型需要的输入张量。
这一步是数据链路的“咽喉”。我见过不少朋友把环境搭好、模型也下载好了,最后却卡在自定义视频的 2D 关键点格式上。我的建议是:第一次不要碰自定义视频,先用官方给的 2D 关键点数据跑通全流程,后面再去折腾检测器。
4. 实操演示:从 2D 关键点推理出 3D 姿态
4.1 准备输入:我建议先用官方 demo 数据试
当环境、模型、数据都齐了,就可以跑推理了。官方仓库里通常会有推理脚本,比如inference/infer_video.py,它会读取一段视频对应的 2D 关键点 JSON,调用训练好的模型,输出一段可视化后的 3D 姿态视频和相关的npz文件。
我建议第一次跑的时候,严格按官方 README 里的 demo 命令来,不要自己改参数。原因很简单:官方 demo 的参数组合是验证过的,如果你改动了某个参数,比如--architecture或者--fine-tune,很可能因为配置不匹配导致模型加载失败,这时候你根本分不清到底是环境问题还是参数问题。
一个常见的形式是:
python inference/infer_video.py \ --cfg configs/human3.6m/mvn/pretrained_h36m_demo.yaml \ --videoFile /path/to/demo.mp4 \ --pose2dJson /path/to/detected_2d_poses.json \ --outputDir /path/to/output具体参数名以你 clone 的仓库版本为准,但思路是一致的:指定配置文件、输入视频、2D 关键点 JSON 和输出目录。
4.2 跑通推理命令并理解关键参数
命令行参数看起来多,其实核心就几个:--cfg指定模型架构和超参数配置,--videoFile指定原始视频,--pose2dJson指定 2D 关键点检测结果,--outputDir指定输出目录。有些版本还会支持--checkpoint直接指定权重文件路径。
我个人的体会是,不要照抄命令就完事,要理解每个参数背后的作用。比如--architecture参数控制的是时间卷积网络的层数设置(比如 3、9、27 层),它必须和模型权重训练时的结构完全一致,否则 PyTorch 加载时会报形状不匹配的错误。官方 demo 的配置文件里已经写好了默认结构,但你如果换了预训练模型,就要检查配置文件是否对应。
跑推理时,机器会先读取 2D 关键点 JSON,经过归一化、切片等预处理,然后进入时间卷积网络逐帧生成 3D 关键点,最后再把 3D 关键点映射回图像坐标系。整个过程如果在 GPU 上跑,几秒钟到几十秒钟就能处理完一个短视频,但如果只有 CPU,可能需要几分钟。第一次跑如果看到进度条走得很慢,不一定是你环境坏了,很可能是没有使用 GPU。
4.3 看输出结果:视频和 npy 文件怎么用
推理完成后,输出目录里会生成几个文件:一个渲染好的 3D 姿态视频(通常是把 2D 姿态和 3D 姿态同时可视化)、一个保存了原始 3D 关键点坐标的.npz或.npy文件,有些版本还会生成一个data_2d的备份文件。
第一次跑成功后,我建议你直接打开视频看一眼。你会发现每一帧里,原本的 2D 骨架旁边会出现一个旋转视角的 3D 骨架,看起来就像在“跳舞”。这个可视化效果能直观验证整个链路是否打通。如果视频能正常生成,但 3D 骨架乱跳或者跑到画面外,那多半不是环境问题,而是 2D 关键点质量差,或者输入的视频帧率和训练数据不一致。
至于.npz文件,里面存的是每个人的 3D 关键点坐标序列,形状一般是(帧数, 关节数, 3)。如果你是做数据分析或者接后续应用,直接读这个文件就可以了。比如你想计算某个关节的运动幅度、做动作对比,都可以基于这个输出结果来做。
5. 环境搭建高频问题与排查记录
5.1 CUDA、cuDNN、PyTorch 三者版本“打架”
这是最高频的问题,没有之一。症状通常是:import torch正常,但一旦跑模型或者调用torch.cuda.FloatTensor就报错,错误信息里可能出现CUDA driver version is insufficient for CUDA runtime version或者no kernel image is available for execution on the device。
排查思路是先把版本链捋一遍。运行nvidia-smi看驱动支持的最高 CUDA 版本;运行python -c "import torch; print(torch.version.cuda)"看 PyTorch 内置的 CUDA 版本。如果驱动的最高版本小于 PyTorch 所需版本,你需要更换驱动,或者改用更低 CUDA 版本的 PyTorch。大多数情况下,大家机器上不是驱动太老,而是 PyTorch 装成了 CPU 版本,导致 GPU 根本用不上,所以第一步永远是先确认torch.cuda.is_available()是否为True。
5.2 显存不足和内存不足
VideoPose3D 本身不太吃显存,官方预训练模型大部分时间卷积网络只有几十 MB 到几百 MB 的参数量,显存占用并不高。但如果你输入的视频分辨率很高、人数很多,或者你一次性处理了过长的时间窗口,显存也可能被打满。训练模式或微调模式下,显存占用会显著上升,因为反向传播需要保存中间激活值。
内存不足的问题更容易被忽略。当你加载一个很长的视频对应的 2D 关键点 JSON 时,如果 JSON 里包含几千帧、每帧好几个人,程序会一次性把关键点序列载入内存。小内存机器很容易直接 OOM。解决办法有两个方向:一是把视频长度切短,分片段处理;二是调整推理脚本里padding或batch size相关参数,减少同时处理的数据量。
5.3 预训练模型下载慢或者失败
这个问题的典型场景是:代码环境和依赖都通了,但模型权重一直下载不下来,或者下载到一半中断。服务器在墙外,下载不稳定是很正常的事,但我不想在这篇环境搭建里展开太多网络话题。我只说实际方案:优先用浏览器或者带断点续传的下载工具把权重文件下到本地,然后再拷贝到服务器的checkpoint目录。
下载完成后一定要校验文件完整性。最简单的方法是用官方提供的 MD5 值,或者直接看一眼解压后文件大小是否和 README 里标注的一致。我遇到过文件只下载了 80%,解压时报错,我以为是环境问题,排查了半天才发现是压缩包损坏。先校验文件,再排查代码,顺序不要搞反。
5.4 2D 关键点检测器环境冲突
前面说过,如果你用自定义视频,就得接一个 2D 关键点检测器。Detectron2 是目前和 VideoPose3D 搭配比较多的一种选择,但它的安装过程很容易把环境搞乱。Detectron2 对 PyTorch 版本有严格限制,比如某个版本只支持 PyTorch 1.10 到 1.12,如果你为了 VideoPose3D 装了 PyTorch 2.0,再回头装 Detectron2 就会编译失败。
我实际推荐的做法是:如果你需要接 Detectron2,新建一个独立的 conda 环境给检测器用,让它先输出 2D 关键点 JSON 文件,再切换到 VideoPose3D 环境做后续推理。两边通过文件对接,而不是硬塞进同一个 Python 环境。这样看起来多了一步,实际上比解决依赖冲突省心得多。
6. 从 Demo 到自己的项目:扩展建议与心得
6.1 处理自定义视频的完整流程参考
当你已经用官方 demo 数据跑通之后,就可以处理自己的视频了。完整流程大概是:先用 2D 关键点检测器对输入视频逐帧检测,输出包含所有人物关键点坐标的 JSON 文件;然后用一个简单的脚本把视频剪辑成和 JSON 帧数对应的片段;最后调用 VideoPose3D 的推理脚本,输出 3D 关键点结果和可视化视频。
这里有三个细节值得注意。第一,视频的帧率和 2D 检测器处理时的帧率必须一致,否则关键点序列的时间关系会错位,3D 姿态会“发抖”。第二,多人场景下,2D 检测器的物体跟踪 ID 如果跳变,同一个 ID 的轨迹会被打断,导致 3D 姿态断裂;最好先用一个不依赖短时跟踪的批量检测器做离线关键点提取。第三,输入视频的编码格式尽量用 H.264,不要用一些小众格式,否则 OpenCV 读取可能抽帧异常。
6.2 想训练自己的模型,还要补哪些环境
如果你不满足于用预训练模型推理,想在自己的数据集上训练,环境就要再补两样东西:一是 3D 标注数据,二是训练脚本的额外依赖。VideoPose3D 的训练脚本依赖h5py、tensorboard等库,安装方法并不复杂:
pip install h5py tensorboard但训练时真正麻烦的是数据预处理。官方训练一般采用 Human3.6M 数据集,这个数据集需要注册才能下载,并且原始数据格式需要转换成项目要求的.npz格式。这一步虽然不涉及复杂的编译,但很容易在数据路径配置上踩坑。我自己的经验是,先把一个小规模数据集跑通训练,确认模型能正常收敛,再切换到完整数据集,节省调试时间。
另外,训练时的显存占用会比推理高不少,建议至少准备一块 8GB 显存的显卡作为起点。如果你只有 CPU,训练一个 27 层的模型可能要跑几天,那不如先用预训练模型做更实际的事情。
6.3 我在多次搭建环境后的几条实操心得
第一,永远先跑通最小链路。不管目标多复杂,先让模型在官方 demo 数据上跑出结果,再一步步加自定义数据、2D 检测器、可视化扩展。很多人一上来就想接 Detectron2,最后环境崩了都不知道是哪个环节出问题。
第二,环境对了就不要乱动。VideoPose3D 作为两三年之前很成熟的项目,它的依赖体系并不追求“新”。我用得很顺的一套组合是 Python 3.8 + PyTorch 1.12 + CUDA 11.6,中间试过升级到 PyTorch 2.0,虽然也能跑,但遇到过一次老权重加载的兼容性警告,让我白折腾了一下午。不是说新版本不行,而是如果你只是为了跑这个项目,稳定优先。
第三,项目自带的配置文件和权重是宝贵资产。很多人喜欢随便改参数,改完发现结果不对,然后怀疑环境有问题。实际上 VideoPose3D 对配置非常敏感,尤其是输入关键点的归一化方式、时间窗口长度和模型层数,任何一个不一致都会导致输出不可用。建议在完全理解配置之前,先照搬官方配置。
最后给你一个操作上的小技巧:每次修改环境或者安装新包之前,用pip freeze > requirements_backup.txt把当前环境快照存一份。这样哪怕后面装挂了,也可以在几分钟内恢复到可用状态。我靠这个备份,避免了好几次重装环境的重活。希望这篇环境搭建的记录,能帮你少走几步弯路。