摘要
这是上一篇修订文的工程附录:给出一套可直接落地的 SIDD + NAFNet + BasicSR 训练/推理模板。目标是把“概念讨论”落到可执行层面,覆盖:
- 环境与依赖
- 数据组织
- 训练配置(YAML)
- 启动命令(单机/多卡)
- 推理与评测
- 回归基线与自动化建议
说明:NAFNet 官方实现基于 BasicSR,实际参数与路径以当前仓库版本为准。
1) 环境模板(venv)
1
2
3
4
5
6
7
8
9
10
11
12
13
|
# 1. 创建环境
python3 -m venv .venv
source .venv/bin/activate
# 2. 克隆 NAFNet(其实现依赖 BasicSR)
git clone https://github.com/megvii-research/NAFNet.git
cd NAFNet
# 3. 安装依赖
pip install -r requirements.txt
python setup.py develop --no_cuda_ext
# 可选:若你需要 CUDA 扩展,去掉 --no_cuda_ext 并确保编译链可用
|
建议固定版本(可复现):
- Python 3.9.x
- PyTorch/CUDA 与驱动严格匹配
- 在实验记录里保存
pip freeze 与 nvidia-smi 输出
2) 数据目录模板(SIDD)
建议统一目录(示例):
1
2
3
4
5
6
7
8
9
10
11
|
datasets/
SIDD/
train/
input/
gt/
val/
input/
gt/
test/
input/
gt/ # 若有 GT
|
关键原则:
- 输入噪声图与 GT 文件名一一对应。
- 所有路径在 YAML 里显式声明,禁止隐式相对路径。
- 数据版本号写入实验名,例如
sidd_v1_20260306。
3) 训练配置模板(YAML 骨架)
下面给一个可改造的 options/train/SIDD/NAFNet-custom.yml 骨架(字段名按 BasicSR 常用风格):
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
|
name: NAFNet_SIDD_custom
model_type: ImageRestorationModel
scale: 1
num_gpu: auto
manual_seed: 42
datasets:
train:
name: SIDD_train
type: PairedImageDataset
dataroot_gt: datasets/SIDD/train/gt
dataroot_lq: datasets/SIDD/train/input
io_backend:
type: disk
gt_size: 256
use_hflip: true
use_rot: true
batch_size_per_gpu: 8
num_worker_per_gpu: 8
val:
name: SIDD_val
type: PairedImageDataset
dataroot_gt: datasets/SIDD/val/gt
dataroot_lq: datasets/SIDD/val/input
io_backend:
type: disk
network_g:
type: NAFNet
width: 64
enc_blk_nums: [1, 1, 1, 28]
middle_blk_num: 1
dec_blk_nums: [1, 1, 1, 1]
path:
pretrain_network_g: ~
strict_load_g: true
resume_state: ~
train:
ema_decay: 0.999
optim_g:
type: AdamW
lr: !!float 2e-4
weight_decay: 0
betas: [0.9, 0.9]
scheduler:
type: CosineAnnealingRestartLR
periods: [300000]
restart_weights: [1]
eta_min: !!float 1e-7
total_iter: 300000
warmup_iter: -1
pixel_opt:
type: L1Loss
loss_weight: 1.0
reduction: mean
val:
val_freq: !!float 5e3
save_img: false
metrics:
psnr:
type: calculate_psnr
crop_border: 0
test_y_channel: false
ssim:
type: calculate_ssim
crop_border: 0
test_y_channel: false
logger:
print_freq: 100
save_checkpoint_freq: !!float 5e3
use_tb_logger: true
dist_params:
backend: nccl
port: 29500
|
注意:不同版本 NAFNet/BasicSR 的字段可能存在细微差异,首次运行请以仓库内现有 options/train/SIDD/*.yml 对齐。
4) 启动命令模板
单卡调试
1
|
python basicsr/train.py -opt options/train/SIDD/NAFNet-custom.yml --launcher none
|
多卡训练(DDP)
1
2
3
4
5
6
|
python -m torch.distributed.launch \
--nproc_per_node=4 \
--master_port=4321 \
basicsr/train.py \
-opt options/train/SIDD/NAFNet-custom.yml \
--launcher pytorch
|
断点续训
在 YAML 的 path.resume_state 指向 experiments/<exp_name>/training_states/*.state,然后重启同一训练命令。
5) 推理与离线评测模板
推理
1
2
|
# 示例:请替换为你仓库中对应的 inference 脚本
python basicsr/test.py -opt options/test/SIDD/NAFNet-width64.yml
|
指标计算
如果测试脚本不自动汇总,可用 BasicSR 指标脚本补算:
1
2
3
4
|
python scripts/metrics/calculate_psnr_ssim.py \
--gt datasets/SIDD/val/gt \
--restored results/NAFNet_SIDD_custom/visualization \
--crop_border 0
|
建议同时记录:
- PSNR / SSIM(主指标)
- 单图最差 Top-K(坏例分析)
- 吞吐(img/s)与显存占用
6) 回归门禁(上线前)
建议硬门槛:
- 平均 PSNR 不低于基线 - 0.10 dB
- 平均 SSIM 不低于基线 - 0.001
- 坏例 Top-20 中主观不可接受样本 ≤ 2
CI/自动化建议:
- 每次新 checkpoint 自动跑小验证集;
- 若触发门禁失败,OpenClaw 直接推送报警到聊天渠道;
- 仅通过门禁的模型允许进入部署队列。
7) 与 Agent 的结合点(最实用)
在 BasicSR 任务里,Agent 最有价值的不是“替你发明网络结构”,而是:
- 自动扫参(lr/patch/batch/aug)
- 自动生成实验报告(指标表 + 对比图)
- 自动回归判定(通过/失败)
- 自动通知与定时重训
如果你在用 OpenClaw,可以把这些动作收敛为固定命令模板,由计划任务触发并把结果回传到 QQ。
参考资料
- BasicSR: https://github.com/XPixelGroup/BasicSR
- BasicSR HOWTOs: https://github.com/XPixelGroup/BasicSR/blob/master/docs/HOWTOs.md
- NAFNet: https://github.com/megvii-research/NAFNet
- Real-ESRGAN(说明依赖 BasicSR 训练/推理):https://github.com/xinntao/Real-ESRGAN
- OpenClaw Docs: https://docs.openclaw.ai