Project 5 Rachel Lu · 2025.05

统一训练与评估交接说明

在统一数据集和统一评估协议下,比较不同视觉模型在 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 步)

  1. 00_config — 集中管理实验参数
  2. 01_imports_and_seed — 导入库、设置随机种子
  3. 02_dataset_and_dataloader — 数据读取与 DataLoader
  4. 03_model_builder — 模型构建(换模型主要改这里)
  5. 04_train_one_epoch — 单 epoch 训练逻辑
  6. 05_evaluate_function — 统一评估函数
  7. 06_save_predictions_csv — 保存预测结果 CSV
  8. 07_train_and_save_best_checkpoint — 训练循环 + best checkpoint
  9. 08_test_original_and_jpeg — original / JPEG 测试集评估
  10. 09_generate_summary_table — 生成汇总表格

仅测试(不训练)执行路径

跳过 04_train_one_epoch07_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_name
  • model_name
  • method_name
  • learning_rate
  • num_epochs
  • test_jpeg_dir
  • positive_class_name
  • output_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_original vs test_jpeg_q30_controlled

3.3 02 部分现在做什么

后续换成 ViT / DINO 时,除非模型有特殊输入尺寸或 normalization 要求,否则建议保持一致以保证对比公平。

4. JPEG 退化数据检查与修正

重新检查 JPEG test set 时发现,expanded dataset 原本的 test_jpeg 退化强度不理想。

4.1 Expanded Dataset 原 test_jpeg 的问题

抽样 500 对 original/JPEG 图片后发现:

指标数值说明
平均 size_ratio1.33JPEG 后文件反而更大
JPEG 后文件变大的数量476 / 500压缩方向反了
平均 PSNR47.61 dB退化极弱
PSNR > 40 dB478 / 500几乎没有损失
PSNR < 35 dB3 / 500极少数有效退化

结论:expanded dataset 原本的 test_jpeg 更像 mild JPEG re-encoding,不是有效的 q30 compression stress test。

4.2 期中旧 Dataset 的 q30 检查结果

指标旧 Dataset q30Expanded 原 test_jpeg
paired 数量450 + 450500 对
平均 size_ratio0.3671.33
平均 PSNR32.47 dB47.61 dB
PSNR < 35 dB377 / 5003 / 500
PSNR > 40 dB9 / 500478 / 500

结论:期中旧 dataset 的 JPEG q30 是有效压缩,expanded dataset 原来的 test_jpeg 压缩不到位。

4.3 当前修正方案

已基于 expanded dataset 的 test_original 重新生成 test_jpeg_q30_controlled,后续正式实验统一使用。
  1. 先统一跑 test_jpeg_q30_controlled
  2. 如果 q30 仍不足以观察差异,再补 q50 / q10
  3. 不要在不同模型之间使用不同 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。

论文写法: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. 后续模型分工

负责人模型说明阶段
RachelViT baseline监督式 Transformer baselinePhase 1
RachelViT + LazyStrike参考 LazyStrike 论文后的改进版Phase 2
BiDINO / DINO-ViT baselineself-supervised ViT baselinePhase 1
BiDINO + LazyStrikeself-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. 推荐行动顺序

  1. 阅读 notebook 结构 理解 00–09 流程,重点关注 config、dataset、model builder、train、test、summary。
  2. 确认各自 config Rachel 和 Bi 各自准备 config,并先交流确认。
  3. 分别训练 baseline 模型 Rachel 跑 ViT baseline,Bi 跑 DINO baseline。
  4. 产出统一结果 每个模型输出 best_checkpoint.pt · training_log.csv · metrics_*.json · predictions_*.csv · summary.csv。
  5. 交流 baseline 结果 比较 ResNet18 / ViT / DINO 的 original fake recall、JPEG q30 fake recall、recall drop、JPEG F1、confusion matrix。
  6. 再做 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_config03_model_builder

5. Evaluation 不改

predictions CSV、summary table 尽量不要改

6. 控制变量

任何影响控制变量的改动都要先同步