multishot / OVERFIT_TROUBLESHOOTING.md
PencilHu's picture
Upload folder using huggingface_hub
59b4152 verified

Overfit 排查清单(从数据 → 训练 → 推理)

下面按“最可能导致结果糊”的问题优先级排序。每一条都附带定位方式和建议修复思路。

1. 数据与标注是否真的被模型用上

1.1 文本 prompt 在训练与推理不一致(高优先级)

  • 现状:
    • 训练时 pre_shot_caption 被固定为 ["xxx", "xxx", "xxx"]
    • 推理时 overfit_infer_debug.py 会读取 dataset.jsontext 作为 prompt
  • 影响:模型训练时从未见过真实文本,推理时给真实文本会导致条件不匹配,输出容易发散或模糊。
  • 定位:
    • multi-shot/multi_view/datasets/videodataset.py__getitem__ 硬编码 pre_shot_caption
  • 建议:
    • 训练时用真实 text(或按 shot 拆分后的文本)替换 pre_shot_caption
    • 或推理时也用 "xxx" 保持一致(不推荐)

1.2 overfit 推理只跑了 test split(高优先级)

  • 现状:
    • overfit_infer_debug.pytraining=False,Dataset 只使用 data_test
    • 你的日志里 Dataset size: 1,说明只在 test 上推理
  • 影响:过拟合训练是在 data_train 上,推理却在 test 上,必然看不到“过拟合效果”
  • 定位:
    • MulltiShot_MultiView_Dataset(..., training=False)
  • 建议:
    • overfit 验证时改为 training=True 或直接读取全部数据(不做 train/test split)

1.3 每次取随机 5 秒片段(高优先级)

  • 现状:
    • load_video_crop_ref_image 每次随机切 5 秒,训练/推理都不确定
  • 影响:同一个 index 每次取到不同片段,过拟合目标不稳定 → 输出糊
  • 建议:
    • overfit 模式下固定切片(比如固定从第 0 帧开始)
    • 或设置固定随机种子,并在推理里复用同一个切片

2. 数据预处理是否正确(process_data)

2.1 检查处理后的视频尺寸/帧率

python - <<'PY'
import json, imageio
from pathlib import Path

path = Path('/data/rczhang/PencilFolder/multi-shot/processed/dataset.json')
data = json.load(path.open())
first = next(iter(data.values()))
video = first['disk_path']
reader = imageio.get_reader(video)
meta = reader.get_meta_data()
frame = reader.get_data(0)
reader.close()
print('video:', video)
print('fps:', meta.get('fps'))
print('shape:', frame.shape)  # 期望 (480, 832, 3)
PY
  • 期望:fps=16,shape=(480, 832, 3)

2.2 检查 ID 图是否存在、数量够不够

python - <<'PY'
import json, os
from pathlib import Path

path = Path('/data/rczhang/PencilFolder/multi-shot/processed/dataset.json')
data = json.load(path.open())
first = next(iter(data.values()))
id_dir = Path(first['id_dir'])
print('id_dir exists:', id_dir.exists())
print('id_names:', first.get('id_names'))
for name in first.get('id_names', []):
    imgs = list((id_dir / name).glob('*'))
    print(name, 'num_imgs:', len(imgs))
PY

3. 训练配置是否支持“过拟合检查”

3.1 训练是否在用 ref_images

  • train_args.zero_face_ratio=0.1 会随机把 ref 清空 10% 步。
  • 过拟合排查建议:临时设为 0.0,确保 ID 图一直生效。

3.2 训练是否从旧 checkpoint 继续

  • resume_from_checkpoint: True
  • 如果之前的数据或 prompt 变了,旧 ckpt 会污染。
  • 建议:排查时用新的输出目录或手动关闭 resume。

4. 推理配置是否合理

4.1 纯 prompt 推理 vs v2v

  • 你现在默认是纯 prompt(input_video=None),这是合理的。
  • 如果要确认模型是否“记住”训练样本,可临时开 v2v:
    • --use_input_video
    • 这只用于 sanity check,不是最终推理形态。

4.2 采样步数过少

  • num_inference_steps=8 非常少,容易糊。
  • 排查建议:先用 20~50 步看看清晰度提升。

5. 模型与权重是否正确

5.1 确认加载的是你训练出的最新 checkpoint

  • overfit_infer_debug.py 默认取最新 checkpoint-step-*
  • 建议手动指定 --checkpoint_path 再确认一次。

5.2 只训练了 DiT

  • trainable_models: dit,text encoder 和 VAE 都冻结
  • 对于过拟合一般没问题,但如果 prompt 变化很大,text encoder 冻结会让文本条件效果变弱。

快速结论(最可能导致“全是糊图”的 3 个点)

  1. 训练/推理 prompt 不一致(训练固定 "xxx",推理用真实 text)
  2. overfit 推理用的是 test split,不是训练集
  3. 每次都随机 5 秒片段,过拟合目标不稳定

如果你愿意,我可以按这个顺序逐一修掉并验证。