统一训练与评估交接说明
在统一数据集和统一评估协议下,比较不同视觉模型在 AI-generated vs Real image detection 任务中的表现,重点观察 JPEG 压缩后 fake recall 是否下降,以及 LazyStrike-style 方法能否改善鲁棒性。
0. 当前项目主线
目前已完成 ResNet18 baseline 训练与评估流程整理、expanded dataset 重新检查、JPEG 测试集退化强度检查、重新生成 controlled JPEG q30 测试集、统一 notebook 结构及 config/evaluation/predictions.csv/summary.csv 输出格式。接下来 Rachel 和 Bi 分别基于同一套 notebook 模板训练 Transformer 相关模型。
1. 统一 Notebook 结构
完整训练 + 评估流程(10 步)
00_config— 集中管理实验参数01_imports_and_seed— 导入库、设置随机种子02_dataset_and_dataloader— 数据读取与 DataLoader03_model_builder— 模型构建(换模型主要改这里)04_train_one_epoch— 单 epoch 训练逻辑05_evaluate_function— 统一评估函数06_save_predictions_csv— 保存预测结果 CSV07_train_and_save_best_checkpoint— 训练循环 + best checkpoint08_test_original_and_jpeg— original / JPEG 测试集评估09_generate_summary_table— 生成汇总表格
仅测试(不训练)执行路径
跳过 04_train_one_epoch 和 07_train_and_save_best_checkpoint,直接运行:
00 → 01 → 02 → 03 → 05 → 06 → 08 → 09
适用场景:加载已有 checkpoint 重新评估
2. 统一 Config 管理
所有实验参数通过 00_config 集中管理。换模型时优先只改 config 和 model builder,不要随意改 evaluation 部分。
实验标识
experiment_name · model_name · method_name
数据路径
dataset_path · train / val / test_original / test_jpeg
训练超参
batch_size · learning_rate · num_epochs
输出与评估
positive_class · checkpoint_path · output_root
训练前必须确认的 Config 项
experiment_namemodel_namemethod_namelearning_ratenum_epochstest_jpeg_dirpositive_class_nameoutput_root
3. 数据读取部分的重要修改
02_dataset_and_dataloader 是本次改动较多的部分。
3.1 原始问题
expanded dataset 里原本的 test 结构中,original 和 JPEG 图片混在同一个类别目录下,通过文件名区分:
test/fake/0001.jpg
test/fake/0001_JPEG.jpg ← 混在一起
这种方式容易导致 dataloader 读取混乱,也不利于 original / JPEG paired analysis。
3.2 修正后的结构
现在测试集已整理成独立文件夹:
test_original
原始测试图像,作为基准
test_jpeg
expanded dataset 原本提供的 JPEG 版本,仅作 re-encoding 记录
test_jpeg_q30_controlled
从 test_original 重新生成 — 正式实验使用
正式实验统一使用:test_originalvstest_jpeg_q30_controlled
3.3 02 部分现在做什么
- 分别读取
train、val、test_original、test_jpeg_q30_controlled - 建立四个 dataloader,使用统一 transform 和 ImageNet normalization
- 使用 RGB loader,从
train_dataset.class_to_idx读取类别映射 - 明确设置
fake为 positive class - 打印数据集数量和示例文件名,用于检查路径是否正确
后续换成 ViT / DINO 时,除非模型有特殊输入尺寸或 normalization 要求,否则建议保持一致以保证对比公平。
4. JPEG 退化数据检查与修正
重新检查 JPEG test set 时发现,expanded dataset 原本的 test_jpeg 退化强度不理想。
4.1 Expanded Dataset 原 test_jpeg 的问题
抽样 500 对 original/JPEG 图片后发现:
| 指标 | 数值 | 说明 |
|---|---|---|
| 平均 size_ratio | 1.33 | JPEG 后文件反而更大 |
| JPEG 后文件变大的数量 | 476 / 500 | 压缩方向反了 |
| 平均 PSNR | 47.61 dB | 退化极弱 |
| PSNR > 40 dB | 478 / 500 | 几乎没有损失 |
| PSNR < 35 dB | 3 / 500 | 极少数有效退化 |
结论:expanded dataset 原本的 test_jpeg 更像 mild JPEG re-encoding,不是有效的 q30 compression stress test。
4.2 期中旧 Dataset 的 q30 检查结果
| 指标 | 旧 Dataset q30 | Expanded 原 test_jpeg |
|---|---|---|
| paired 数量 | 450 + 450 | 500 对 |
| 平均 size_ratio | 0.367 | 1.33 |
| 平均 PSNR | 32.47 dB | 47.61 dB |
| PSNR < 35 dB | 377 / 500 | 3 / 500 |
| PSNR > 40 dB | 9 / 500 | 478 / 500 |
结论:期中旧 dataset 的 JPEG q30 是有效压缩,expanded dataset 原来的 test_jpeg 压缩不到位。
4.3 当前修正方案
已基于 expanded dataset 的test_original重新生成test_jpeg_q30_controlled,后续正式实验统一使用。
- 先统一跑
test_jpeg_q30_controlled - 如果 q30 仍不足以观察差异,再补 q50 / q10
- 不要在不同模型之间使用不同 JPEG 条件,否则结果不可比
5. 当前 ResNet18 Baseline 状态
ResNet18 baseline 已在 expanded dataset 上训练完成。best checkpoint 出现在 epoch 4。
Model
ResNet18, full fine-tuning
Dataset
expanded dataset
Checkpoint Rule
best validation fake F1
Best Epoch
Epoch 4 / Max 5
后续可再跑一版 10 epoch 的 ResNet18 baseline(命名为 resnet18_baseline_expand_10ep),用于确认 5 epoch 是否足够。不要覆盖现有结果。
6. Epoch 统一建议
之前 ResNet18 baseline 只跑 5 epoch(担心过拟合 + 时间有限 + 先验证 pipeline)。后续 Transformer 模型正式训练时,建议统一改为:
max epoch = 10,根据 validation fake F1 选择 best checkpoint。
- 最终不是使用第 10 epoch,而是 validation fake F1 最高的 checkpoint
- 训练日志中需要记录 best epoch 是第几
- 如果 best epoch 很早出现,可作为模型容易过拟合的证据
论文写法:We train each model for up to 10 epochs and select the best checkpoint based on validation fake F1.
7. 输出结果管理规则
输出按 evaluation condition 归档,避免结果混乱。
建议输出结构
experiment_output/
├── best_checkpoint.pt
├── training_log.csv
├── config.json
├── old_eval_before_test_split_fix/
├── eval_jpeg_reencoded/
└── eval_jpeg_q30_controlled/
每个模型需输出的文件
best_checkpoint.pt
training_log.csv
metrics_original.json
metrics_jpeg.json
predictions_original.csv
predictions_jpeg.csv
summary.csv
old_eval_before_test_split_fix
测试集结构修正前的旧结果,排错用
eval_jpeg_reencoded
expanded dataset 原 test_jpeg 结果,退化过弱仅供参考
eval_jpeg_q30_controlled
正式结果,模型对比以这类结果为主
8. 后续模型分工
| 负责人 | 模型 | 说明 | 阶段 |
|---|---|---|---|
| Rachel | ViT baseline | 监督式 Transformer baseline | Phase 1 |
| Rachel | ViT + LazyStrike | 参考 LazyStrike 论文后的改进版 | Phase 2 |
| Bi | DINO / DINO-ViT baseline | self-supervised ViT baseline | Phase 1 |
| Bi | DINO + LazyStrike | self-supervised ViT + LazyStrike 改进 | Phase 2 |
所有模型必须统一:dataset split · test_original · test_jpeg_q30_controlled · fake positive class · metrics · checkpoint rule · output format。
9. 换 Transformer 模型时主要改哪里
9.1 修改 00_config
需要修改:experiment_name · model_name · method_name · learning_rate · num_epochs · output_root
vit_b16_baseline_expand
vit_b16_lazystrike_expand
dino_vit_baseline_expand
dino_vit_lazystrike_expand
9.2 修改 03_model_builder
这是换模型的主要位置。ResNet18 的训练、评估、保存逻辑已经统一好,后续尽量只在 model builder 中替换模型结构。
9.3 LazyStrike 额外修改
可能需要改
model forward · CLS/patch aggregation · 额外 loss · 04_train_one_epoch 中的 loss 计算
尽量不改
如果只是 LazyStrike-style pooling/aggregation 且不引入额外 loss,保持训练循环不变
10. 哪些部分尽量不要改
02_dataset
数据读取保持一致
05_evaluate
评估函数必须统一
06_predictions
预测保存格式一致
08_test
测试流程保持一致
09_summary
汇总表格式一致
尤其是 evaluation 部分必须保持统一,否则不同模型的 accuracy、recall、F1、recall drop 可能不可比。
11. 训练前必须先沟通确认
本项目需要控制变量,任何以下改动都需要先交流确认:
数据相关
dataset path · JPEG test condition · train/val/test split
模型相关
image size · normalization · positive class · optimizer
训练相关
epoch · learning rate · checkpoint rule · fine-tuning vs frozen
LazyStrike
实现方式 · 额外 loss · 输出文件夹命名
不确认会导致的问题
- 路径读错 / checkpoint 覆盖 / JPEG 条件不一致
- fake / real label 映射不一致 / 输出结果无法比较
12. 推荐行动顺序
- 阅读 notebook 结构 理解 00–09 流程,重点关注 config、dataset、model builder、train、test、summary。
- 确认各自 config Rachel 和 Bi 各自准备 config,并先交流确认。
- 分别训练 baseline 模型 Rachel 跑 ViT baseline,Bi 跑 DINO baseline。
- 产出统一结果 每个模型输出 best_checkpoint.pt · training_log.csv · metrics_*.json · predictions_*.csv · summary.csv。
- 交流 baseline 结果 比较 ResNet18 / ViT / DINO 的 original fake recall、JPEG q30 fake recall、recall drop、JPEG F1、confusion matrix。
- 再做 LazyStrike 版本 等 baseline 跑通并确认结果合理后,再分别做 ViT + LazyStrike 和 DINO + LazyStrike。
13. 最重要的注意事项
1. JPEG 测试
正式统一使用 test_jpeg_q30_controlled,原来的 test_jpeg 不作为正式 q30
2. Epoch 策略
max epoch = 10,最终使用 best validation fake F1 checkpoint
3. 命名独立
每个模型必须使用独立 experiment_name,避免覆盖结果
4. 换模型
主要改 00_config 和 03_model_builder
5. Evaluation 不改
predictions CSV、summary table 尽量不要改
6. 控制变量
任何影响控制变量的改动都要先同步