- 媒体生成
- 计算机视觉
- 深度学习
- 人工智能
- 大模型
【免费下载链接】mmagic
OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic 🪄: Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.
本文以 MMagic 仓库中的 Animated Drawings 项目 为骨架,结合其配套源码、配置文件与动作数据,系统讲解如何基于 SIGGRAPH 2023 论文《A Method for Animating Children's Drawings of The Human Figure》在 MMagic 生态中完成"角色生成 → 动作重定向 → 视频渲染"的完整动画化流程。读完本文,你将掌握 Animated Drawings 在 MMagic 中的安装方式、两段式命令行工作流,以及角色配置、动作配置、重定向配置三套 YAML 文件的核心字段语义,并能将自定义画作替换进流水线生成属于自己的动画视频。
一、项目背景:给儿童画赋予生命力
Animated Drawings 是 SIGGRAPH 2023 收录的论文项目(论文标题《A Method for Animating Children's Drawings of The Human Figure》,arXiv 编号 2303.12741),其核心目标是:自动为儿童绘制的"人物画"生成动画。由于儿童画在构图、比例、透视上存在巨大差异,系统需要在算法层面具备对这类"业余画作"的鲁棒性,同时保持足够简单,让任何人都能使用。
论文团队为此发布了 Animated Drawings Demo 公共网站,并构建了首个同类标注数据集Amateur Drawings Dataset:通过公共 Demo 收集了超过 178,000 张业余画作,并附带了用户认可的物体包围框(bounding boxes)、分割掩码(segmentation masks)与关节点标注(joint location annotations),为后续研究与微调实验提供了数据基础。
在 MMagic 仓库中,该项目位于 projects/animated_drawings,任务类型标注为Drawing,属于 MMagic projects 生态(projects/README.md)中以 MMagic 为基底、独立组织代码的社区项目之一。整个项目目录结构如下:
bvh/:动作数据(zombie.bvh,946 行 BVH 格式动作文件,即"僵尸步"动作)characters/:生成的角色资产(slamdunk/char_cfg.yaml角色骨架配置文件)configs/:三套配置(motion/动作、mvc/场景视图、retarget/动作重定向)tools/:两个核心脚本(generate_character.py、generate_video.py)README.md:官方使用说明
整条流水线可概括为:输入一张角色图片 + 一张掩码图 → OpenPose 提取姿态并构建角色骨架 → 载入 BVH 动作 → 按重定向配置把动作映射到角色 → 渲染输出视频。
二、环境准备与安装
1. 安装 Animated Drawings
Animated Drawings 的渲染与动作处理能力由 Facebook Research 的 AnimatedDrawings 库提供。进入项目目录后,通过 pip 以可编辑(editable)方式从源码安装:
cd mmagic/projects/animated_drawings pip install -e git+https://github.com/facebookresearch/AnimatedDrawings.git#egg=animated_drawings使用-e(editable)安装后,源码会留在本地,便于开发者查看animated_drawings.render等模块的实现。安装前请确保 MMagic 主库及其依赖(PyTorch、MMEngine 等)已就绪。
从 generate_character.py 的 import 语句可以看出,角色生成阶段还依赖以下运行库:opencv-python(cv2)、numpy、Pillow(PIL.Image)、PyTorch(torch)、PyYAML(yaml),以及姿态检测库controlnet_aux(含OpenposeDetector及 open_pose 的 face/hand 工具模块)。这些缺失时需一并补齐。
2. 下载演示资源
官方 README 为演示流程提供了三张图片素材,全部下载到resources目录:
cd mmagic/projects/animated_drawings mkdir resources # 角色原图(灌篮高手风格的 "Sakuragi" 人物画) wget -O sakuragi.png https://user-images.githubusercontent.com/12782558/236157945-452fb9d0-e02e-4f36-8338-34f0ca0fe962.png # 角色掩码图(用于从原图中抠出角色区域) wget -O sakuragi_mask.png https://user-images.githubusercontent.com/12782558/236157965-539a5467-edae-40d0-a9da-7bb5906bcdc4.png # 背景图(篮球场) wget -O basketball_playground.png https://user-images.githubusercontent.com/12782558/236190727-0e456482-2ae3-4304-9e6c-6ba7d319ea71.png三张素材各司其职:sakuragi.png是待动画化的角色绘制图,sakuragi_mask.png是与角色图配对的掩码(区分前景角色与背景),basketball_playground.png在渲染阶段作为场景背景(对应mvc配置中的BACKGROUND_IMAGE字段)。
三、Step 1:从图片生成可驱动角色
命令与产物
cd mmagic/projects/animated_drawings python tools/generate_character.py执行后,脚本会在characters/slamdunk/目录下产出动画渲染所需的纹理图与掩码图,同时自动生成角色骨架配置char_cfg.yaml。
源码级原理剖析
generate_character.py 的完整处理链路如下:
姿态检测器定制:脚本定义了
OpenposeDetectorPoint类,继承自controlnet_aux的OpenposeDetector,并重写了__call__方法。与原始实现不同的是,该方法额外返回candidate(归一化后的关键点坐标)与subset(关键点连接关系),供后续构建骨架使用。默认检测分辨率detect_resolution = 512,检测器权重来自lllyasviel/ControlNet。OpenPose 关键点提取:对输入图像执行姿态估计,得到 14 个人体关键点(kpts 索引 0~13,对应鼻子/颈部、躯干、双肩、双肘、双手、双髋、双膝、双脚等),并以
pose.png保存姿态可视化图。图像与掩码预处理:输入角色图
resources/sakuragi.png与掩码图resources/sakuragi_mask.png均统一缩放到 512 分辨率,分别保存为texture.png(角色纹理)与mask.png(角色掩码)。骨架构建:脚本将 OpenPose 关键点映射为一个 16 关节、带父子层级(parent 字段)的骨架树,写入
characters/slamdunk/char_cfg.yaml。映射逻辑如下(对应源码 167-187 行):root、hip:取左右髋关键点均值(kpts[8] + kpts[11]) / 2,其中root为整棵骨架的根节点(parent: null);torso ← hip、neck ← torso(kpts[1]、kpts[0]);- 右臂链:
right_shoulder(2) → right_elbow(3) → right_hand(4),均挂接在torso之下; - 左臂链:
left_shoulder(5) → left_elbow(6) → left_hand(7),挂接在torso之下; - 右腿链:
right_hip(8) → right_knee(9) → right_foot(10),挂接在root之下; - 左腿链:
left_hip(11) → left_knee(12) → left_foot(13),挂接在root之下。
关键点坐标先由归一化值乘以图像宽高还原为像素坐标(
kpts[:, 0] * W、kpts[:, 1] * H),再四舍五入写入配置。
角色配置文件 char_cfg.yaml
仓库中已生成的 characters/slamdunk/char_cfg.yaml 展示了输出格式——顶层包含width(512)、height(512)与skeleton列表。每个骨架节点由loc(像素坐标 [x, y])、name(关节名)、parent(父关节名,根节点为null)构成,例如:
height: 512 width: 512 skeleton: - loc: [260, 230] name: root parent: null - loc: [260, 230] name: hip parent: root - loc: [257, 93] name: torso parent: hip - loc: [250, 54] name: neck parent: torso # ... 其余肩、肘、手、髋、膝、脚关节,共 16 个节点这套"像素位置 + 父子链"的骨架正是后续动作重定向阶段将 BVH 动作映射到角色身上的"锚点"。
四、Step 2:驱动角色生成动画视频
命令与产物
cd mmagic/projects/animated_drawings python tools/generate_video.py运行后,你会得到一个"像僵尸一样行走的 Sakuragi"动画视频,输出保存在resources目录下。整个脚本只有一行核心调用(generate_video.py):
from animated_drawings import render render.start('./configs/mvc/slamdunk.yaml')也就是说,视频渲染完全由场景配置驱动:render.start()读取mvc层配置,按其中声明的角色、动作、重定向三份配置完成组装,最终输出视频。
五、三层配置体系详解
Animated Drawings 在 MMagic 中的落地采用"场景视图(mvc)/ 动作(motion)/ 重定向(retarget)"三层配置解耦设计,理解这三份 YAML 是自定义动画的关键。
1. 场景与视图配置:configs/mvc/slamdunk.yaml
configs/mvc/slamdunk.yaml 是整个渲染流程的入口,包含scene、view、controller三段:
scene: ANIMATED_CHARACTERS: - character_cfg: characters/slamdunk/char_cfg.yaml motion_cfg: configs/motion/zombie.yaml retarget_cfg: configs/retarget/fair1_spf.yaml view: CAMERA_POS: [1.6, 1.7, 4.0] CAMERA_FWD: [0.0, 0.5, 2.0] BACKGROUND_IMAGE: resources/basketball_playground.png controller: MODE: video_render OUTPUT_VIDEO_PATH: ./resources/slamdunk_video.mp4 OUTPUT_VIDEO_CODEC: mp4vscene.ANIMATED_CHARACTERS:声明场景中要渲染的动画角色列表,每个角色由三份配置组合而成——character_cfg(角色骨架/纹理,指向characters/slamdunk/char_cfg.yaml)、motion_cfg(动作数据)、retarget_cfg(动作重定向策略)。场景支持多个角色,只需向列表追加元素。view:相机与背景。CAMERA_POS为相机位置三维坐标,CAMERA_FWD为相机朝向向量,二者共同决定取景角度;BACKGROUND_IMAGE指定渲染背景图(即上一步下载的篮球场图片)。controller:输出控制。MODE: video_render表示视频渲染模式;OUTPUT_VIDEO_PATH指定输出文件路径(./resources/slamdunk_video.mp4);OUTPUT_VIDEO_CODEC指定编码格式(mp4v,即 MPEG-4 编码,可用通用播放器直接播放)。
2. 动作数据配置:configs/motion/zombie.yaml + BVH 文件
configs/motion/zombie.yaml 描述"僵尸步"动作的来源与参数:
filepath: bvh/zombie.bvh start_frame_idx: 0 end_frame_idx: 320 groundplane_joint: LeftFoot forward_perp_joint_vectors: - - LeftShoulder - RightShoulder - - LeftUpLeg - RightUpLeg scale: 0.025 up: +zfilepath:动作数据文件路径,指向 bvh/zombie.bvh。BVH(Biovision Hierarchy)是动画领域通用的骨骼动作格式。start_frame_idx/end_frame_idx:动作片段在 BVH 中的起始/结束帧索引(0~320 帧),控制动作播放范围。groundplane_joint:确定角色贴合地面的关节(此处为LeftFoot),用于计算脚部与地面的约束关系,避免角色陷入或悬浮。forward_perp_joint_vectors:用于推导角色"朝向"的关节向量对(左肩-右肩、左大腿-右大腿),系统据此在水平面上估计角色的前向方向。scale:BVH 动作的缩放系数(0.025),把动作数据单位换算到场景尺度。up:动作数据的竖直轴约定(+z),告诉渲染器哪个轴是"向上"。
BVH 文件本身的层级结构(bvh/zombie.bvh)以HIERARCHY开头,根关节为Hips,声明了 6 通道(Xposition Yposition Zposition Xrotation Yrotation Zrotation),躯干链为Spine → Spine1 → Spine2 → Spine3 → Neck → Head,并分别挂接左右肩臂链(RightShoulder → RightArm → RightForeArm → RightHand等)与腿脚链。这种层级命名与重定向配置中的bvh_joint_names一一对应,是动作映射能够成立的前提。
3. 动作重定向配置:configs/retarget/fair1_spf.yaml
configs/retarget/fair1_spf.yaml 负责把 BVH 动作"翻译"到角色骨架上,是三层配置中最复杂的一份,核心字段如下:
char_starting_location:角色在场景中的初始位置[0.0, 0.0, 0.0]。bvh_projection_bodypart_groups:把 BVH 关节按身体部位分组,并指定每组动作向平面投影的方法,共三组:Upper Limbs(上肢,含 RightShoulder/RightArm/RightForeArm/RightHand/RightHandEnd 与左臂对称关节),投影方法sagittal(矢状面投影);Lower Limbs(下肢,含 RightUpLeg/RightLeg/RightFoot/RightToeBase 与左腿对称关节),投影方法pca(主成分分析投影);Trunk(躯干,含 Hips/Spine/Spine1/Spine2/Spine3/Neck/Head),投影方法frontal(额状面投影)。
论文中提到的twisted perspective(扭转透视)重定向技术即体现在这里:儿童画常把身体部位画在"扭转的视角"中,直接套用正视角动作会产生违和,因此对不同部位采用不同的投影平面来重定向,这正是本方法相对朴素重定向的差异点。
char_bodypart_groups:建立 BVH 深度驱动关节与角色关节的映射,例如Hips驱动right_shoulder/left_shoulder/right_hip/left_hip/hip/torso/neck,LeftHand驱动left_elbow/left_hand,RightHand驱动right_elbow/right_hand,LeftFoot驱动left_knee/left_foot,RightFoot驱动right_knee/right_foot。char_bvh_root_offset:利用下肢投影组(Lower Limbs)中双脚→双膝→双髋的关节链,计算角色根节点相对 BVH 根节点的偏移,保证角色初始姿态与动作基准对齐。char_joint_bvh_joints_mapping:角色关节与 BVH 关节段的精确对应表,例如left_elbow ↔ (LeftArm, LeftForeArm)、left_knee ↔ (LeftUpLeg, LeftLeg)、torso ↔ (Hips, Spine3)、neck ↔ (Hips, Neck)等。由于 YAML 中使用了!!python/tuple标签,这份配置须由 Python 的 yaml 加载器读取。char_runtime_checks:运行时校验规则(如neck必须位于right_shoulder、left_shoulder上方),用于在渲染前检查骨架几何合理性,避免生成畸形动画。
可以看到,fair1_spf中的关节命名(LeftUpLeg、RightForeArm等)与zombie.bvh的层级命名完全一致,这说明三份配置是围绕同一套 BVH 骨架设计、彼此咬合的整体。
六、扩展实战:动画化你自己的画作
掌握了上述配置后,把流水线迁移到自定义输入只需做四类替换:
替换输入画作:运行
generate_character.py时通过命令行参数指定新素材:python tools/generate_character.py \ --chardir characters \ --charname my_char \ --img resources/my_drawing.png \ --mask resources/my_drawing_mask.png--chardir(角色根目录,默认characters)、--charname(角色名,默认slamdunk)、--img(角色图路径)、--mask(掩码图路径)四个参数均在 generate_character.py 的parse_args中定义。脚本会为my_char生成独立的texture.png、mask.png、pose.png与char_cfg.yaml。注意掩码应准确勾勒角色轮廓,直接影响纹理裁剪与渲染效果。替换动作:准备新的 BVH 文件,仿照
configs/motion/zombie.yaml新建动作配置(调整filepath、帧范围、scale与朝向向量),并确保 BVH 的关节命名与重定向配置中的bvh_joint_names兼容。调整场景与相机:修改
configs/mvc/slamdunk.yaml的view.CAMERA_POS/CAMERA_FWD改变镜头,替换BACKGROUND_IMAGE更换背景,并可向scene.ANIMATED_CHARACTERS追加多个角色实现多角色同场。调整输出:通过
controller.OUTPUT_VIDEO_PATH与OUTPUT_VIDEO_CODEC控制导出位置与编码。
需要说明的适用前提:整套流程依赖 AnimatedDrawings 库与controlnet_aux姿态检测组件,首次运行会下载 ControlNet 姿态检测权重;角色姿态估计与视频渲染涉及 PyTorch 推理,建议在具备 GPU 的环境下运行以获得流畅的渲染速度。
七、引用
论文作者为 Harrison Jesse Smith、Qingyuan Zheng、Yifei Li、Somya Jain、Jessica K. Hodgins,完整 BibTeX 引用如下:
@misc{smith2023method, title={A Method for Animating Children's Drawings of the Human Figure}, author={Harrison Jesse Smith and Qingyuan Zheng and Yifei Li and Somya Jain and Jessica K. Hodgins}, year={2023}, eprint={2303.12741}, archivePrefix={arXiv}, primaryClass={cs.CV} }八、小结
MMagic 的 Animated Drawings 项目用两个脚本与三份 YAML 配置,完整复现了"儿童人物画 → 姿态提取 → 角色骨架 → BVH 动作重定向 → 场景渲染"的动画化流水线。其中generate_character.py借助 OpenPose 关键点自动构建带父子层级、可被动作驱动的角色骨架,generate_video.py以render.start()一句调用拉起渲染,而mvc / motion / retarget三层配置则把"场景与相机、动作数据、重定向策略"彻底解耦。无论是体验官方演示,还是替换自己的画作与动作,都可以在 projects/animated_drawings 目录内快速完成,是理解"静态图像 → 可驱动数字人"类 AIGC 流水线的绝佳范例。
- 媒体生成
- 计算机视觉
- 深度学习
- 人工智能
- 大模型
【免费下载链接】mmagic
OpenMMLab Multimodal Advanced, Generative, and Intelligent Creation Toolbox. Unlock the magic 🪄: Generative-AI (AIGC), easy-to-use APIs, awsome model zoo, diffusion models, for text-to-image generation, image/video restoration/enhancement, etc.
相关推荐
AnimatedDrawings 儿童简笔画动画化:配置驱动动画渲染实战指南
AnimatedDrawings 儿童简笔画动画化:配置驱动动画渲染实战指南 导读 本文基于开源仓库 AnimatedDrawings(论文 A Method
计算机视觉图形学终极指南:如何将真人视频转换为3D动漫角色动画
终极指南:如何将真人视频转换为3D动漫角色动画 OpenMMD是一款基于OpenPose的开源应用程序,能够将真人视频转换为3D模型动画文件(.vmd格式),直
人工智能计算机视觉3分钟上手jsonschema2md:从安装到生成第一个Markdown文档的快速教程
3分钟上手jsonschema2md:从安装到生成第一个Markdown文档的快速教程 jsonschema2md是一款高效的JSON Schema转Markd
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考