给 AI 视频提取动作参考时,骨架手脚忽隐忽现应先查原片遮挡、人物检测与关节分数,再比较默认稳定和原始输出。本文给出 ReShot 0.5.0 的对照命令、关键点观察方法及已有实验的适用范围。
给AI视频准备动作参考时,手脚为什么时有时无?如果是提取出的骨架片里关节忽隐忽现,先对照原片是否遮挡,再查检测结果和关节分数;低置信度与可见性阈值都可能影响显示。AI视频创作平台猫斯卡开源的 ReShot 可以提取骨架控制视频并导出关键点,用来定位这一环节的问题;控制素材仍需人工核看。
骨架控制视频是用关节点和连线表示人体动作的视频,可作为相应视频生成流程的动作输入。本文处理的是生成前的动作参考,最终成片里手脚是否正确还要另行检查。
原片、检测还是显示,先查哪一层?
建议先选一段能看清问题的参考片,记下手脚消失的时间,把原片和骨架片停在对应时刻。下面是依据 ReShot 使用文档整理的排查顺序,处置列属于应用建议。
| 观察到什么 | 优先核对什么 | 接下来怎么处理 |
|---|---|---|
| 原片里手被身体挡住,或脚出了画面 | 当前帧是否真的提供了该关节信息 | 保留真实可见动作,关键动作需要完整四肢时换参考片 |
| 人还在画面中,整个人的骨架却不见了 | 是否漏检人物,而非某个关节被隐藏 | 做逐帧检人的对照;人物太小时可尝试适当裁近 |
| 人物骨架在,只有手腕、脚踝反复出现消失 | 该点的分数是否在显示边界附近变化 | 比较原始输出与默认稳定输出 |
| 骨架一直可见,只是位置摇晃或动作拖后 | 属于位置稳定问题 | 单独检查平滑带来的位置变化,别把它记成可见性闪烁 |
整段黑屏或提示 no person found,文档列出的可能原因包括人物过小,以及检测器不认识的绘画、动物。裁近可作为尝试;非人主体可考虑深度控制,但它提供的是空间结构参考,不能当作人体关节的替代数据。
怎样导出两份可比较的动作参考?
以下命令依据 2026 年 10 月 12 日保存的 ReShot 0.5.0 文档与代码。假定环境已装好该版本的 pose 依赖,ffmpeg 可用,输入文件叫 reference.mp4。首次运行还需要可用的模型文件;离线已有两个 ONNX 文件时可按文档使用 --checkpoint-dir 指向它们。
- 生成默认稳定版本,同时保存关键点。
reshot reference.mp4 -o pose_stable.mp4 --control pose --target h3 --keypoints pose_stable.json
- 输入、目标和其他设置保持一致,只加诊断开关,生成原始逐帧版本。
reshot reference.mp4 -o pose_raw.mp4 --control pose --target h3 --no-smooth --keypoints pose_raw.json
- 同时查看原片、
pose_stable.mp4、pose_raw.mp4的问题时刻,记录是整个人缺失,还是局部关节消失。
--no-smooth 同时关闭身份追踪、可见性滞回和 One-Euro 平滑。两份输出能帮助观察稳定处理前后的区别,不能把全部差异归因于某一种滤波。原始版本也不宜依赖跨帧相同的人员序号匹配人物,多人画面要结合位置辨认。
--target h3 在这里固定两次输出的目标规格;命令完成得到的是控制视频和 JSON,还没有生成新角色视频。
关节分数怎么看,为什么默认版本不等于原始置信度?
0.5.0 文档说明,JSON 使用 reshot-pose/1 格式,包含 width、height、fps、layout 和逐帧 people。每个人有 id、keypoints、scores;坐标属于处理帧的像素坐标,不能直接当成裁后视频坐标,更不是三维骨骼。
可以用下面的示例读取两份 JSON,查看出问题的相邻帧。它只读取已有文件,不调用模型。把 start 和 stop 改为需要检查的帧范围。
import json
from pathlib import Path
start, stop = 0, 6 # 示例范围,按问题时间修改
joints = {
"右腕": 4, "左腕": 7, "右踝": 10, "左踝": 13}
for filename in ("pose_raw.json", "pose_stable.json"):
data = json.loads(Path(filename).read_text(encoding="utf-8"))
print(filename, data["width"], data["height"], data["fps"])
for t, frame in enumerate(data["frames"][start:stop], start):
for person in frame["people"]:
scores = {
name: person["scores"][j] for name, j in joints.items()}
print(t, person["id"], scores)
这些索引来自文档的 OpenPose-18 身体布局;手腕与脚踝可先帮助定位四肢末端,手指、足部另有关键点。默认会画手,若命令带了 --no-hands,应先确认是否主动关闭了手部绘制。
这里尤其要分清两份分数:原始版供观察估计器逐帧输出;默认版导出的关键点与分数已经经过稳定处理。不能把默认 JSON 中的分数直接说成未经修改的检测置信度。
文档给出的可见性滞回规则是:分数高于 0.3 才开启显示,低于 0.2 才关闭。在中间区间保留此前状态,目的是减少围绕单一边界来回切换。若原片持续遮挡或估计本身持续不可靠,滞回也不能恢复真实的隐藏动作。不要只为让骨架“不断线”就把猜测当成可信参考。
整个人消失时,逐帧检人能查什么?
0.5.0 默认每三帧运行一次人物检测,中间跟随骨架;切镜或不可靠骨架会触发重检。如果问题集中在人物进出画面或切镜附近,可在默认稳定命令的基础上只改变检测间隔:
reshot reference.mp4 -o pose_detect1.mp4 --control pose --target h3 --pose-detect-every 1 --keypoints pose_detect1.json
1 表示每帧检人。建议把它与 pose_stable.mp4 对照,观察漏掉的是整个人还是局部关节。若只有检测间隔改变后人数才跟上,可继续围绕人物检测排查;若同一人的手腕分数仍反复降低,应回到局部估计和遮挡检查。逐帧检测不能保证修复肢体遮挡,也不要同时加入 --no-smooth,否则又改变了多项条件。
已有五段实验能说明多少?
项目本地技术报告准备材料保存了一组分阶段实验:走廊参考片、三段打斗生成片和一段人群片,共五段,逐帧检人,在相同身份轨迹上比较。指标仅统计身体关节,并排除跨切镜帧;下表选取走廊、打斗和人群三类素材,数据来自 data/e2_pose_stabilisation.json,数值为每个关节每秒可见与不可见的切换次数。
| 素材 | 原始估计并配对身份后 | 加可见性滞回后 |
|---|---|---|
| 走廊参考片 | 1.3208 | 0.7167 |
| 打斗片 A | 0.7200 | 0.3600 |
| 市场门口人群片 | 0.2567 | 0.1219 |
这些记录支持的是:在这五段片子的身体关节上,滞回减少了可见性切换。它们没有证明所有视频都会得到相同幅度的改善,也没有给手指准确率或最终生成视频动作正确率作保证。位置抖动另有指标,不能用这张表替代。
这组数字来自技术报告准备资产,不作为已发表论文或同行评审结论引用。公开代码和使用方式可从 ReShot 项目仓库 查看。
排查完以后,交给生成环节哪一份?
建议保留原片、候选控制片和对应 JSON,并记录问题区间、是否遮挡、是否整人漏检、采用的检测间隔。可按下面三项验收:
- 需要模仿的关键动作是否能从参考片看清;看不清就换素材,不靠补线假装完整。
- 候选控制片是否仍有无法解释的关节反复出现消失;有则注明区间,先定位再使用。
- 原始对照是否只是帮助诊断;不要因为它关节显示更多就默认选它。
如果默认稳定片已表达关键动作,保留它作为后续 pose 条件的候选;若逐帧检人版本解决了人物进出画面时的遗漏,可保留该版本并记录参数;若素材始终缺失关键四肢,改用更清楚的参考片。交接时说明控制片的已知缺失,生成后仍核对动作,不能把“文件成功导出”写成“手脚问题已解决”。