| # 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 秒片段,过拟合目标不稳定** |
|
|
| 如果你愿意,我可以按这个顺序逐一修掉并验证。 |
|
|