Overfit 排查清单(从数据 → 训练 → 推理)
下面按“最可能导致结果糊”的问题优先级排序。每一条都附带定位方式和建议修复思路。
1. 数据与标注是否真的被模型用上
1.1 文本 prompt 在训练与推理不一致(高优先级)
- 现状:
- 训练时
pre_shot_caption被固定为["xxx", "xxx", "xxx"] - 推理时
overfit_infer_debug.py会读取dataset.json的text作为 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.py里training=False,Dataset 只使用data_test- 你的日志里
Dataset size: 1,说明只在 test 上推理
- 影响:过拟合训练是在
data_train上,推理却在 test 上,必然看不到“过拟合效果” - 定位:
MulltiShot_MultiView_Dataset(..., training=False)
- 建议:
- overfit 验证时改为
training=True或直接读取全部数据(不做 train/test split)
- overfit 验证时改为
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 个点)
- 训练/推理 prompt 不一致(训练固定 "xxx",推理用真实 text)
- overfit 推理用的是 test split,不是训练集
- 每次都随机 5 秒片段,过拟合目标不稳定
如果你愿意,我可以按这个顺序逐一修掉并验证。