Hy-Nomas 这类逐帧跟随操作的生成方式,没有“一定能跟多少帧”的固定答案。画面开始跑偏的时间点,通常由四个因素共同决定:单次生成的片段长度、交互步长、重绘比例,以及参考素材与当前操作之间的一致性。比较实用的做法是:先把“跑偏了”变成可复现的观察结论,也就是找到第一帧偏离操作意图的位置并记下当时的输入,再判断是素材不足还是参数不当,最后用单变量对照逐个调整。
先固定随机种子,再把连续输出分段截取,找到漂移起始帧并记录对应操作输入;随后用“换素材”和“调参数”两组对照判断原因在哪一侧,再单独调整交互步长与单次生成长度。同一段操作内,画面退化到可用阈值以下就切片段重开,不建议在已经跑偏的同一段里持续加长。
在连续输出里定位画面开始漂移的那一帧
“感觉跑偏”不能作为调参依据,需要先把它转成帧号。做法是把一次完整的连续交互录制或导出为视频,然后按固定时间片切段,逐段回看。切段长度建议先取 2 到 4 秒,短到能看清变化,又长到不至于切得太碎。
# 按 4 秒一段切分,便于逐段回看
ffmpeg -i run.mp4 -c copy -segment_time 4 -f segment seg_%03d.mp4
# 按固定间隔抽帧,便于定位具体帧号
ffmpeg -i run.mp4 -vf "select='not(mod(n,12))'" -vsync 0 frames/%05d.png
逐段看完后,先确定“第一段出现偏离”的段号,再在这一段内二分细化,直到锁定一个具体帧号。判断“偏离”的标准要写死,例如:主体轮廓开始融化、背景纹理重复、镜头运动方向与操作输入相反、操作区域不再响应。每次只认一种现象,不要笼统记成“变糊了”。
| 记录项 | 写法示例 | 用途 |
|---|---|---|
| 运行编号 | run-003 | 与其他实验区分 |
| 漂移起始帧号 | frame 186 | 作为后续对照的基准点 |
| 帧号对应的操作输入 | 第 12 步左移 + 放大 | 复现同一操作序列 |
| 首个异常现象 | 主体边缘与背景粘连 | 统一判断口径 |
区分素材不足和参数不当两类原因
页面变形和场景重复,既可能是参考素材覆盖不到当前操作,也可能是参数设置跟不上操作。两个方向调错的代价是白花时间,所以建议先做一组只改一个因素的对照,看现象变化是否符合预期。
| 操作 | 应观察到的变化 | 说明 |
|---|---|---|
| 只换素材,参数不动 | 漂移起始帧明显后移,或某一类现象消失 | 说明原素材对当前操作覆盖不足 |
| 只换素材,参数不动 | 漂移起始帧几乎不变,现象完全一样 | 素材不是主因,转向调参数 |
| 只调参数,素材不动 | 漂移起始帧有规律地前移或后移 | 该参数与漂移直接相关 |
| 只调参数,素材不动 | 漂移起始帧随机波动,无规律 | 随机性占主导,先固定种子再谈参数 |
推荐顺序是:先用原参数换一版更贴近操作范围的素材跑一遍,看漂移点是否后移;如果后移,问题主要在素材;如果基本不动,回到原素材只调一个参数再跑。每轮实验都要保留漂移起始帧号,没有帧号的变化都当作噪声。
把交互步长和单次生成长度分开调
交互步长决定每次操作推进多少,单次生成长度决定一次连续生成多少帧,重绘比例决定每步有多少内容被重新生成。这三个量一起改,观察到的现象就无法归因。建议先给出一个基础配置骨架,然后每次只动一项。
# 通用配置骨架,字段名按你的实际实现替换
segment_frames: 48 # 单次生成长度
interaction_step: 1 # 每次操作推进的步长
redraw_ratio: 0.35 # 重绘比例
seed: 12345 # 随机种子
| 实验号 | 改动项 | 其余项 | 漂移起始帧 | 现象 |
|---|---|---|---|---|
| exp-01 | 基线 | 保持默认 | 186 | 边缘粘连 |
| exp-02 | segment_frames 48→32 | 其余同 exp-01 | 待记录 | 待记录 |
| exp-03 | interaction_step 1→2 | 其余同 exp-01 | 待记录 | 待记录 |
| exp-04 | redraw_ratio 调整 | 其余同 exp-01 | 待记录 | 待记录 |
经验上,单次生成长度偏长时,漂移更容易出现在片段后半段;交互步长偏大时,漂移更容易出现在单次操作跳变之后;重绘比例偏低时,错误会沿着帧序列累积。这三条只作为排查方向,实际结论仍以你自己记录到的漂移起始帧为准。
用固定随机种子重跑同一段操作序列
不固定种子时,两次运行的差异里混着随机性,参数对照就没有意义。先把种子写进配置或环境变量,再用完全相同的操作脚本跑第二遍。
# 命令骨架,参数名按实际实现替换
SEED=12345 python run_interactive.py \
`--segment-frames` 48 \
`--step` 1 \
`--redraw` 0.35 \
`--input-sequence` ops.json
两次输出的对比方法:一是比较漂移起始帧号,若两次帧号接近,说明结果可复现,可以进入调参;若两次帧号相差很大,说明当前配置下随机性影响很强,需要先把种子、采样设置等收敛住。二是把两次输出的同一段抽帧并排放置,逐段看首个差异出现在哪一帧,把这一步的帧号也记进实验表。操作序列建议存成固定文件,避免手操作带来的输入差异。
给长时交互设一个可接受的退化阈值
长时交互是否还能用,取决于退化到什么程度还可以接受,而不是能否无限延长。建议在开始前写下判断条目,跑到条目触发就停止。
- 仍可用:主体轮廓可辨,操作方向有响应,纹理重复只在局部出现。
- 仍可用:漂移在可容忍时间内可自行恢复,不需要人工干预。
- 不可用:操作方向与画面反馈相反,或某一区域完全不响应。
- 不可用:场景开始整段重复,已有内容被替换成与操作无关的画面。
- 不可用:漂移一旦出现就持续扩大,回看后续帧没有收敛迹象。
触发不可用条目时的切段重开步骤:
- 记下当前帧号与当时的操作输入,作为下一轮实验的参照点。
- 把触发点之前的最后一帧稳定画面导出,作为新片段的起始参考。
- 在新片段里重置交互步长和重绘比例,从较小的单次生成长度开始。
- 用同一个随机种子重跑新片段,确认漂移起始帧是否被推后。
- 把新片段的漂移起始帧记入实验表,与切段前的记录对比。
阈值不需要一次定死。可以先按上面的条目跑几轮,把“通常在第几段触发不可用”作为自己环境下的经验值,再结合素材质量和参数调整逐步放宽或收紧。不同素材、不同操作强度下的阈值会不一样,需要结合具体环境确认。