这是从 CCTV 小巷里的火柴人开始的任务的最后一站。“跳舞!”这几个字穿过词袋变成火柴人的舞蹈,这段舞蹈再变成姿态图,穿上助手的模样。我们会逐帧打开真实视频,仔细推敲画面上显示的“动作一致率 76.5%”说明了什么、又没有说明什么。
到 5-4 为止,火柴人已经能听懂语言跳舞了。但它还只是一副骨架。最后的任务,是给这副骨架穿上人的模样,做成视频。担任模特的是助手。
点击格子即可查看该步骤的说明。第 1~4 步是本系列亲手实现的计算,第 5~6 步由给定的视频展示。
| 步骤 | 输入 | 输出 | 本系列的篇目 |
|---|---|---|---|
| 1~2 文字漏斗 | “跳舞!” | 共享地图上的一个点(8 格) | 5-4 第 2·3 节 |
| 3 动作生成 | 地图上的点 | 火柴人动作(帧 × 13 个关节) | 5-3 第 6 节,5-4 第 5 节 |
| 4 姿态图 | 关节坐标 | 黑底彩色线条图(每一帧) | 5-1 第 3 节的反方向 |
| 5 基于姿态的生成 | 参考图像 + 姿态图 | 助手摆出该姿势的一帧 | 本篇第 3 节 |
| 6 视频 | 一系列帧 | 舞蹈视频 | 本篇第 4 节 |
基于姿态的视频生成模型大多是扩散模型。它从随机噪声开始,每一步去掉一点噪声,同时参考“外貌像参考图像、姿势像姿态图”这两个条件。拖动滑块,把噪声去掉看看。
| 外貌编码器 | 提取参考图像中脸、头发、衣服的特征,让模型在绘制过程中持续参考(ReferenceNet 类) |
| 姿态引导器 | 用小型卷积神经网络把姿态图折叠后叠加到噪声上。“这里是手臂”从一开始就定下来了 |
| 时间层 | 让前后帧互相参考,使衣服颜色和头发不会闪烁 |
这个画面是把完成的帧(视频中的助手)按比例混入噪声,展示“每一步剩下的原始信号份额”(√ᾱ 的计算遵循真实扩散模型的调度表)。真实模型是在把图像压缩变小的潜在空间里处理噪声,并在每一步预测“这里的噪声有这么多”再减掉 [R1]。用参考图像和姿态让人物动起来的结构,以 Animate Anyone [R2] 系列为代表。给定的视频是用什么模型和设置制作的,视频中并没有标注。
视频并没有把两段舞并排,而是前后接在一起(0~4.96 秒为火柴人,4.96~10 秒为助手)。点击“并排查看”,同一个文件会在两个画面中播放,把同一时刻对照起来。调节右侧画面的时间差,找出两段舞对上的时刻吧。
一开始声音是关闭的。点击“打开声音”即可听到音乐。在并排查看中,把时间差调到 0.9 秒附近试试。
先确认视频中的数字是什么,再亲手测一测一致率。即使是同一段舞,测量方法不同,数字也会相差很大。
| 确认的内容(代码 2) | 结果 | 含义 |
|---|---|---|
| 数字区域是否逐帧变化 | 与第一帧的像素差最大 0.07 | 240 帧始终是 76.5%。并不是逐帧重新计算的值 |
| 前一场景与后一场景的一致率框 | 同一时刻之间的平均差 0.16 | 同一个叠加层在两个场景中各播放了一次。下方粉色条的起伏也只是装饰 |
| 计算方式说明 | 无 | 拿什么和什么、用什么分数比较,仅凭视频无法得知 |
左边是 5 秒的编舞(挥手 → 指向 → 张开双臂抬膝 → 举起双臂),右边是晚一些跟跳同一段编舞的舞蹈。关节距离分数是对齐骨盆后,每个关节 exp(−距离²/2·0.1²) 的平均值;肢体方向分数是 8 根骨骼方向的余弦相似度的平均值。
| 情形 | 关节距离分数 | 肢体方向分数 |
|---|---|---|
| 同一段舞,同一时刻 | 100.0% | 100.0% |
| 晚 0.33 秒跟跳 | 90.8% | 96.4% |
| 晚 1.0 秒跟跳 | 77.6% | 87.8% |
| 左右翻转的舞 | 82.5% | 88.6% |
| 晚 1.0 秒且左右翻转 | 78.7% | 86.5% |
| 把晚 1.0 秒的舞提前 15 帧对齐 | 100.0% | — |
| 用动态时间规整(DTW)对齐 | 99.6% | — |
| 左右也翻转的舞:只对齐时间 / 同时还原左右 | 79.6% / 100.0% | — |
CCTV 小巷里的一个火柴人,先变成了特征,又变成了生成的材料,被折叠又被展开,与语言配成对,最后变成了助手的舞蹈。点击卡片即可前往对应篇目。
600 万个画面数字 → 26 个关节 → 4 个特征 → 判定
手腕速度规则 → 4 个特征 + 学习
5-2 生成从识别到生成把箭头反过来,学到的就不是正确答案,而是分布
坐标骰子 → 抽取旋钮(潜变量)后的骨长误差
5-3 压缩编码器 · 解码器把 1,196 个数字折叠成 16 个,再展开
16 个数字承载的动作
5-4 文本从词语到动作把语言和动作放到同一张地图上的对比学习
配对损失,400 步
5-5 最终从“跳舞!”到舞蹈视频给姿态图穿上助手的模样,做成视频
视频中显示的一致率(未标注计算方式)
两段代码都只使用 Colab 默认安装的库。“下载笔记本(.ipynb)”后,在 Colab 中通过文件 → 上传笔记本打开,或者复制后粘贴到新笔记本的单元格中。
生成一段 5 秒的编舞,再与晚一些跟跳或左右翻转的舞用两种分数进行比较。其中也包括时间对齐和动态时间规整(DTW)。想换成自己的数据把 dance_seq 替换为从两段视频中用姿态估计提取的关节坐标(帧, 13, 2),分别放入 A 和 B。
测量视频的分辨率与时长、场景切换、一致率数字区域的变化以及两个场景的时间差。第 4·5 节的视频分析数字就出自这里。视频文件请把与本页所含相同的 match_score_video.mp4 上传到 Colab 使用。
这是粘贴到 ChatGPT、Qwen、Claude 等 AI 助手中的提示词。点击“复制”,所选代码会一起附在提示词后面。把〔 〕里的内容换成你自己的情况即可。
AI 的回答只是起点。它提出的论文、数值和库函数,务必对照原文和官方文档核实。使用有真人出镜的视频时,先确认拍摄同意和个人信息处理规定。
与正文中黄色虚线下划线相同的词典。点击节名即可跳到首次出现的位置。
比喻是理解的第一步,也可能是误解的种子。与人类知觉相比的比喻标注了强度。直接 有证据表明实际上在做同样的事 · 部分 只有部分性质相似 · 无 尚不知道有对应的东西
| 概念 | 日常比喻 | 人类知觉比喻 | 比喻失效之处 |
|---|---|---|---|
| 基于姿态的生成 | 先摆好人体模特的姿势,再给它穿上衣服拍照 | 部分人看到动作时,会联想到做这个动作的特定人物 | 人体模特身上的衣服始终不变,但生成模型每一帧都重新画衣服和脸,所以可能会有细微差别 |
| 参考图像 | 演员的形象照 | 无 | 形象照里没有的背影、手指由模型凭空编出。编出来的部分可能与本人不同 |
| 姿态图 | 舞谱(编舞记录) | 无 | 编舞记录由人来阅读和诠释,而姿态图只包含关节位置。表情、手指、节奏都没有 |
| 动作一致率 | KTV 打分 | 无 | 像 KTV 打分那样计算方式被隐藏时,光看数字无法判断好坏。先要弄清拿什么和什么、怎么比较 |
| 时间对齐(DTW) | 把两个人节拍错开的舞蹈视频按节拍重新剪辑 | 部分即使节拍稍有错开,人也能认出是“同一段舞” | DTW 不改变顺序,只做拉伸和压缩。动作顺序变了的舞,它对不上 |
E-1 作者简介 · E-2 学术参考文献 · E-3 图片与数字的出处
这是给讲师、在职培训(OJT)负责人和辅导老师的授课指南。时间为预估值,请根据实际课堂调整。本篇也可以用作系列总结课。
| 对象 | 学完 5-1~5-4 的大学生、职场人士。在工作中接触生成视频和“AI 分数”的策划人员与从业者 |
|---|---|
| 预备知识 | 5-1 的姿态估计、5-4 的语言 → 动作、扩散模型的基本思路(去除噪声) |
| 学习目标 | ① 能按顺序说明从提示词到视频的六个步骤 ② 能说出参考图像和姿态图各自决定什么 ③ 看到一致率之类的数字时,会追问“比较了什么、怎么比较的”,并能举例说明时间差如何改变分数 |
| 预计时间 | 阅读 30~40 分钟 · 视频演示 20 分钟 · Colab 实践 25 分钟(代码 1 12 分钟,代码 2 13 分钟) |
导入 5 分钟(第 1 节)→ 第 2 节六个步骤 10 分钟 → 第 4 节视频并排查看 10 分钟 → 第 5 节一致率实验 12 分钟 → 第 6 节系列地图 8 分钟 → 练习题 5 分钟。
第 4·5 节 25 分钟 → 各组挑选一个“我们工作中的 AI 分数”,倒推它比较了什么、怎么比较的 25 分钟 → 用代码 2 直接测量视频 20 分钟 → 以第 3 节的服装差异为题讨论生成内容标识与授权同意 20 分钟。
初学者只看第 2·4·6 节。中级学习者可以让他们用手算代码 1 中 score_dist 的一帧,并跟着走一遍 3 × 3 的 DTW 填表过程。
| 节 | 停下来提问 | 操作提示 |
|---|---|---|
| 2 串成一线 | “其中哪些步骤是本系列亲手计算的,哪些步骤来自给定的视频?” | 逐个点击格子,读一读下方说明的最后一句 |
| 3 画出助手 | “参考图像里是实验服,为什么视频里是偶像服装?” | 把步骤从 0 拖到 25,再与下方的独舞 12 格对比 |
| 4 视频 | “两段舞的转圈分别发生在第几秒?” | 在并排查看中把时间差从 0 调到 0.9 秒 |
| 5 一致率 | “明明是同一段舞,为什么是 77.6%?怎样才能变成 100%?” | 在延迟 1.0 秒时点击“时间对齐” |
| 6 总结 | “如果从五篇中选出一个最重要的数字,你会选哪个?” | 点击卡片,回到对应篇目看看 |
| 误解 | 正确解释 | 要展示的场景 |
|---|---|---|
| 只要说“跳舞!”,AI 就会理解舞蹈并做出视频 | 这是多个步骤依次传递数字的流程。语言 → 地图上的点 → 关节坐标 → 姿态图 → 帧 | 第 2 节 |
| 视频上显示的一致率是可靠的测量值 | 这段视频的 76.5% 在 240 帧中始终不变,而且没有标注计算方式 | 第 5 节上方的表格 |
| 一致率低,就说明舞没跟上 | 同一段舞晚 1 秒也只有 77.6%。对齐时机和左右后就变成 100% | 第 5 节 亲手测一测 |
| 参考图像的样子会原封不动地出现 | 原则上如此,但参考图像中没有的部分(如背影)会由模型编出,而且像这段视频一样,服装也可能不同 | 第 3 节下方的注释 |
| 只要有姿态图就能让任何人跳舞,所以没有问题 | 用真实人物的外貌制作视频时,需要本人同意并标明是生成内容 | 第 6 节“人的责任” |
24 × 10 = 240 帧。119 ÷ 24 ≈ 4.96 秒。
exp(−0.01 / 0.02) = exp(−0.5) ≈ 0.607。距离拉开一个 σ 时,该关节约得 61 分。
直接比较 77.6%,提前对齐后 100.0%。原来是“晚了”被当成了“错了”。
数字区域的像素在 240 帧中与第一帧几乎相同(差值最大 0.07),两个场景的一致率框在同一时刻也几乎相同(平均差 0.16)。这是同一个叠加层播放了两次。
参考图像决定外貌(脸、头发、衣服),姿态图决定姿势。去噪的前期(大轮廓)主要由姿态图发挥作用,后期(脸、饰品、花纹)主要由参考图像发挥作用。
在代码 1 中把 σ 改为 0.05、0.1、0.2,比较“晚 1.0 秒跟跳”的关节距离分数。用两句话写出 σ 如何影响分数,以及公布一致率时为什么也要说明 σ。
用 MediaPipe 从这段视频的两个场景中提取关节坐标(助手场景中失败的帧也要记录),再用代码 1 的 score_dist 和 best_shift 计算实际的一致率。把时间对齐前后的分数、还原左右后的分数与 76.5% 进行比较并报告。
| 入门者 | 只要有第 4 节的并排查看和第 5 节的“时间对齐”按钮,就能掌握本篇的核心 |
|---|---|
| 进阶 | 让学生把 Animate Anyone 论文的结构图与第 3 节的表格(外貌编码器 · 姿态引导器 · 时间层)对应起来进行讲解 |
| 系列复习 | 让学生用一句话分别说明第 6 节五张卡片上的数字(60.7% → 99.7%、44.2% → 0.0%、99.8%、1.90 → 0.01、76.5%)各测的是什么 |
到《5-5 从“跳舞!”到舞蹈视频》为止,五个任务全部完成了。下面是研究室成员们的最后一句话。