共计 2741 个字符,预计需要花费 7 分钟才能阅读完成。
BSD100 数据集简介
BSD100(Berkeley Segmentation Dataset 100)是图像超分辨率(Super-Resolution, SR)领域的经典基准数据集,由加州大学伯克利分校发布。它包含 100 张高质量自然图像,涵盖城市景观、人物、动物等多种场景,广泛用于评估超分辨率算法的性能。在学术论文中,BSD100 常与 Set5、Set14 等数据集并列作为标准测试集。

数据集结构解析
解压后的 BSD100 目录通常包含以下结构:
BSD100/
├── HR/ # 高分辨率图像(Ground Truth)│ ├── 0801.png
│ └── ...
└── LR_bicubic/X4/ # 双三次插值降采样的低分辨率图像(4 倍下采样)├── 0801x4.png
└── ...
- 高分辨率(HR)图像:原始图像,分辨率约 1024×1024
- 低分辨率(LR)图像:通过
bicubic interpolation生成,文件名格式为原编号 x4.png
数据加载与预处理
以下是使用 Python 加载数据的完整示例(需安装 OpenCV 和 PIL):
import cv2
import numpy as np
from pathlib import Path
from PIL import Image
def load_bsd100(data_dir):
"""加载 BSD100 数据集"""
hr_dir = Path(data_dir) / 'HR'
lr_dir = Path(data_dir) / 'LR_bicubic/X4'
# 确保文件对应
hr_paths = sorted(hr_dir.glob('*.png'))
lr_paths = sorted(lr_dir.glob('*x4.png'))
assert len(hr_paths) == len(lr_paths) == 100
# 标准化到 [0,1] 范围并转为 YCbCr 格式(超分辨率常用)pairs = []
for hr_path, lr_path in zip(hr_paths, lr_paths):
hr = np.array(Image.open(hr_path)) / 255.0
lr = np.array(Image.open(lr_path)) / 255.0
# 保留 EXIF 信息(通过 PIL)with Image.open(hr_path) as img:
exif = img.info.get('exif')
pairs.append((lr, hr, exif))
return pairs
数据增强与注意事项
训练集增强技巧
- 随机裁剪:从 HR 图像随机截取 64×64 patches
- 几何变换:水平翻转(概率 50%)、90°旋转
- 色彩抖动:亮度±10%、对比度±15%
def augment_pair(lr, hr):
"""数据增强示例"""
h, w = lr.shape[:2]
# 随机裁剪
size = 64
x = np.random.randint(0, w - size)
y = np.random.randint(0, h - size)
lr_patch = lr[y:y+size, x:x+size]
hr_patch = hr[4*y:4*(y+size), 4*x:4*(x+size)] # 注意 4 倍关系
# 随机翻转
if np.random.rand() > 0.5:
lr_patch, hr_patch = lr_patch[:, ::-1], hr_patch[:, ::-1]
return lr_patch, hr_patch
关键注意事项
- 测试集污染:绝对不要在测试图像(通常为 BSD100 的 30%)上做任何增强
- 数据划分:按原始论文建议,70 张训练,30 张测试(可固定随机种子确保可复现)
- EXIF 保留:评估时可能需要原始色彩空间信息
降采样方法对比
BSD100 官方提供的是双三次插值降采样,但实践中可尝试其他方法:
def downsample(hr_img, method='bicubic', scale=4):
"""不同降采样方法对比"""
h, w = hr_img.shape[:2]
new_size = (w//scale, h//scale)
if method == 'bicubic':
lr = cv2.resize(hr_img, new_size, interpolation=cv2.INTER_CUBIC)
elif method == 'nearest':
lr = cv2.resize(hr_img, new_size, interpolation=cv2.INTER_NEAREST)
elif method == 'area':
lr = cv2.resize(hr_img, new_size, interpolation=cv2.INTER_AREA)
else:
raise ValueError(f'Unknown method: {method}')
return lr
| 方法 | 特点 | 适用场景 |
|---|---|---|
| 双三次插值 | 边缘平滑,学术标准 | 传统超分辨率 |
| 最近邻插值 | 保留锐利边缘 | 像素艺术图像 |
| 区域插值 | 抗锯齿效果好 | 大幅降采样 |
评估指标计算
超分辨率常用 PSNR(峰值信噪比)和 SSIM(结构相似性):
from skimage.metrics import peak_signal_noise_ratio, structural_similarity
def evaluate(hr, sr):
"""计算 PSNR 和 SSIM"""
# 转换到 YCbCr 的 Y 通道(亮度)hr_y = cv2.cvtColor(hr, cv2.COLOR_BGR2YCrCb)[:, :, 0]
sr_y = cv2.cvtColor(sr, cv2.COLOR_BGR2YCrCb)[:, :, 0]
psnr = peak_signal_noise_ratio(hr_y, sr_y, data_range=1.0)
ssim = structural_similarity(hr_y, sr_y, data_range=1.0)
return {'PSNR': psnr, 'SSIM': ssim}
延伸思考
- 多数据集融合:如何将 BSD100 与 DIV2K(更大规模数据集)结合使用?
- 建议:先用 DIV2K 训练,再用 BSD100 微调
- 跨数据集验证:在 BSD100 上训练的模型,在 Urban100 测试表现如何?
- 现实场景适配:BSD100 的插值降采样与真实手机拍摄的 LR 图像有何差异?
参考文献
- 官方数据集主页:https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/
- 原始论文:『A Database of Human Segmented Natural Images』
通过本文的实践指导,希望读者能避开 BSD100 使用中的常见陷阱,为超分辨率研究打下坚实基础。在实际项目中,建议同时关注其他指标如推理速度、显存占用等,毕竟 BSD100 只是评估基准之一。
正文完
