BSD100数据集入门指南:从零开始掌握图像超分辨率基准数据

1次阅读
没有评论

共计 2741 个字符,预计需要花费 7 分钟才能阅读完成。

image.webp

BSD100 数据集简介

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

BSD100 数据集入门指南:从零开始掌握图像超分辨率基准数据

数据集结构解析

解压后的 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

数据增强与注意事项

训练集增强技巧

  1. 随机裁剪:从 HR 图像随机截取 64×64 patches
  2. 几何变换:水平翻转(概率 50%)、90°旋转
  3. 色彩抖动:亮度±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}

延伸思考

  1. 多数据集融合:如何将 BSD100 与 DIV2K(更大规模数据集)结合使用?
  2. 建议:先用 DIV2K 训练,再用 BSD100 微调
  3. 跨数据集验证:在 BSD100 上训练的模型,在 Urban100 测试表现如何?
  4. 现实场景适配:BSD100 的插值降采样与真实手机拍摄的 LR 图像有何差异?

参考文献

  • 官方数据集主页:https://www2.eecs.berkeley.edu/Research/Projects/CS/vision/bsds/
  • 原始论文:『A Database of Human Segmented Natural Images』

通过本文的实践指导,希望读者能避开 BSD100 使用中的常见陷阱,为超分辨率研究打下坚实基础。在实际项目中,建议同时关注其他指标如推理速度、显存占用等,毕竟 BSD100 只是评估基准之一。

正文完
 0
评论(没有评论)