# 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) ### 1.3 每次取随机 5 秒片段(高优先级) - 现状: - `load_video_crop_ref_image` 每次随机切 5 秒,训练/推理都不确定 - 影响:同一个 index 每次取到不同片段,过拟合目标不稳定 → 输出糊 - 建议: - overfit 模式下固定切片(比如固定从第 0 帧开始) - 或设置固定随机种子,并在推理里复用同一个切片 ## 2. 数据预处理是否正确(process_data) ### 2.1 检查处理后的视频尺寸/帧率 ```bash 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 图是否存在、数量够不够 ```bash 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 秒片段,过拟合目标不稳定** 如果你愿意,我可以按这个顺序逐一修掉并验证。