作为一名长期从事图像超分辨率(Single Image Super-Resolution, SISR)模型训练的研究者,我经常面临一个核心矛盾:训练数据集的规模与质量如何平衡?过去一年里,我训练发布了超过100个基于不同架构的SISR模型,包括MoSR、RealPLKSR、DRCT等15种以上结构。这些实战经验让我深刻认识到:数据质量对模型性能的影响往往被低估。本文将分享我开发的BHI(Blockiness, HyperIQA, IC9600)数据集过滤方法,它能将DF2K数据集缩减69%的同时提升模型验证指标。
在SISR领域,DIV2K和Flickr2K组成的DF2K数据集是公认的基准训练集。但实际使用中发现两个关键问题:
注意:直接使用原始数据集会导致模型学习到压缩伪影,这在Real-ESRGAN等经典论文中已被证实
传统处理方法主要依赖人工筛选或简单启发式规则:
BHI方法通过三个正交维度评估图像质量:
| 维度 | 评估指标 | 作用 | 阈值选择依据 |
|---|---|---|---|
| 压缩伪影 | Blockiness | 检测JPEG块效应 | Rethinking SR论文中的实验数据 |
| 视觉质量 | HyperIQA | 评估模糊/噪声/畸变 | 本文的阈值实验 |
| 信息复杂度 | IC9600 | 量化纹理/边缘/结构丰富度 | 收敛速度与指标平衡 |
采用基于DCT系数分析的算法:
python复制def calculate_blockiness(image):
# 提取8x8块边界差异
blocks = view_as_blocks(image, block_shape=(8,8))
horizontal_diff = np.mean(np.abs(blocks[:,1:] - blocks[:,:-1]))
vertical_diff = np.mean(np.abs(blocks[1:,:] - blocks[:-1,:]))
return (horizontal_diff + vertical_diff) / 2
阈值设定为30,这与CVPR 2022《Rethinking Image SR》论文中的实验结论一致。
使用预训练的ResNet50基础模型:
bash复制python -m pyiqa -m hyperiqa -i ./dataset -o ./scores.csv
关键发现:仅剔除得分<0.2的底部1%图像即可提升指标,过高阈值反而损害性能。
基于图像梯度直方图和色彩分布特征:
python复制ic9600 = IC9600Calculator()
scores = []
for img in tqdm(dataset):
scores.append(ic9600.compute(img))
实验显示0.4-0.5是最佳阈值区间,可保留足够训练样本同时提升信息密度。
bash复制python tile_dataset.py --input ./DF2K --output ./tiled --size 512
python复制from PIL import Image
lr_img = img.resize((w//4, h//4), Image.BICUBIC)
sql复制SELECT * FROM images
WHERE blockiness < 30
AND hyperiqa >= 0.2
AND ic9600 >= 0.4
使用PLKSR-tiny架构的典型参数:
yaml复制# config_plksr.yml
optimizer:
type: AdamW
lr: 1e-4
betas: [0.9, 0.99]
scheduler:
type: MultiStepLR
milestones: [60000, 120000]
loss:
type: L1Loss
weight: 1.0
| 模型类型 | 数据量 | PSNR↑ | SSIM↑ | DISTS↓ | 训练时间 |
|---|---|---|---|---|---|
| 原始数据集 | 21,387 | 28.71 | 0.823 | 0.142 | 48h |
| BHI过滤后 | 6,620 | 29.03 | 0.831 | 0.138 | 22h |
| 仅HyperIQA过滤 | 18,477 | 28.89 | 0.827 | 0.140 | 42h |
关键发现:
在ImageNet和LSDIR数据集上重复实验:
ImageNet结果:
LSDIR结果:
问题1:过滤后数据量过少
bash复制python merge_datasets.py DF2K-BHI ImageNet-BHI --output merged-BHI
问题2:指标波动大
问题3:复杂场景性能下降
python复制# 动态调整IC9600权重
if is_complex_scene(img):
ic9600_threshold *= 0.8
当前成果已应用于我的三个实际项目:
值得探索的延伸方向:
经过半年多的实践验证,BHI方法已成为我个人工作流的标准预处理步骤。最近在训练一个新的SPAN架构模型时,仅用常规数据集30%的数据量就达到了原有性能指标,这再次验证了数据质量重于数量的核心观点。建议读者先从DF2K数据集开始尝试,相关代码和预计算分数已开源在GitHub仓库。