multishot / OVERFIT_TROUBLESHOOTING.md
PencilHu's picture
Upload folder using huggingface_hub
59b4152 verified
|
Raw
History Blame Contribute Delete
4.56 kB
# 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 秒片段,过拟合目标不稳定**
如果你愿意,我可以按这个顺序逐一修掉并验证。