首页
/ 使用Supervision处理计算机视觉数据集的完整指南

使用Supervision处理计算机视觉数据集的完整指南

2025-07-05 05:16:32作者:滑思眉Philip

前言

在计算机视觉项目中,数据处理是模型训练前的重要环节。Supervision库为开发者提供了一套强大的工具集,可以高效地加载、处理、增强和可视化各种格式的计算机视觉数据集。本文将详细介绍如何使用Supervision处理分类、目标检测和分割任务的数据集。

数据集准备

获取数据集

在开始之前,我们需要准备一个数据集。Supervision支持多种主流格式:

  1. COCO格式:JSON标注文件
  2. YOLO格式:TXT标注文件
  3. Pascal VOC格式:XML标注文件

如果你还没有数据集,可以使用公开数据集资源获取所需数据。

安装依赖

pip install roboflow supervision

数据集加载

Supervision提供了便捷的方法来加载不同格式的数据集。

COCO格式加载

import supervision as sv

ds_train = sv.DetectionDataset.from_coco(
    images_directory_path='path/to/train/images',
    annotations_path='path/to/train/annotations.json'
)

YOLO格式加载

ds_train = sv.DetectionDataset.from_yolo(
    images_directory_path='path/to/train/images',
    annotations_directory_path='path/to/train/labels',
    data_yaml_path='path/to/data.yaml'
)

Pascal VOC格式加载

ds_train = sv.DetectionDataset.from_pascal_voc(
    images_directory_path='path/to/train/images',
    annotations_directory_path='path/to/train/labels'
)

数据集分割

如果数据集尚未划分训练集、验证集和测试集,可以使用Supervision的split方法:

ds = sv.DetectionDataset(...)

# 先分出80%作为训练集
ds_train, remaining = ds.split(split_ratio=0.8, shuffle=True)

# 剩下的20%再平分验证集和测试集
ds_valid, ds_test = remaining.split(split_ratio=0.5, shuffle=True)

数据集合并

当有多个数据集需要合并时:

ds1 = sv.DetectionDataset(...)
ds2 = sv.DetectionDataset(...)

merged_ds = sv.DetectionDataset.merge([ds1, ds2])

数据集遍历

Supervision提供了两种遍历数据集的方式:

# 方式1:直接迭代
for image_path, image, annotations in ds:
    # 处理每张图片和标注
    pass

# 方式2:按索引访问
for idx in range(len(ds)):
    image_path, image, annotations = ds[idx]
    # 处理特定索引的数据

数据集可视化

可视化是检查数据质量的重要步骤:

box_annotator = sv.BoxAnnotator()
label_annotator = sv.LabelAnnotator()

annotated_images = []
for i in range(16):  # 可视化前16张图片
    _, image, annotations = ds[i]
    labels = [ds.classes[class_id] for class_id in annotations.class_id]
    
    annotated_image = image.copy()
    annotated_image = box_annotator.annotate(annotated_image, annotations)
    annotated_image = label_annotator.annotate(annotated_image, annotations, labels)
    annotated_images.append(annotated_image)

# 创建可视化网格
grid = sv.create_tiles(
    annotated_images,
    grid_size=(4, 4),  # 4x4网格
    single_tile_size=(400, 400)  # 每张图片大小
)

数据集保存

处理后的数据集可以保存为不同格式:

保存为COCO格式

ds.as_coco(
    images_directory_path='output/images',
    annotations_path='output/annotations.json'
)

保存为YOLO格式

ds.as_yolo(
    images_directory_path='output/images',
    annotations_directory_path='output/labels',
    data_yaml_path='output/data.yaml'
)

保存为Pascal VOC格式

ds.as_pascal_voc(
    images_directory_path='output/images',
    annotations_directory_path='output/labels'
)

数据增强

数据增强是提高模型泛化能力的重要手段。Supervision可以与Albumentations库配合使用:

import albumentations as A

# 定义增强管道
augmentation = A.Compose([
    A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
    A.Rotate(limit=30, p=0.5)
], bbox_params=A.BboxParams(format='pascal_voc', label_fields=['category']))

# 应用增强
_, image, annotations = ds[0]
augmented = augmentation(
    image=image,
    bboxes=annotations.xyxy,
    category=annotations.class_id
)

# 获取增强后的数据
augmented_image = augmented['image']
augmented_annotations = replace(
    annotations,
    xyxy=np.array(augmented['bboxes']),
    class_id=np.array(augmented['category'])
)

最佳实践

  1. 数据检查:在开始处理前,先可视化部分数据检查质量
  2. 版本控制:对处理后的数据集进行版本管理
  3. 数据平衡:确保各类别样本数量均衡
  4. 增强多样性:使用多种增强技术提高数据多样性
  5. 性能优化:对于大型数据集,考虑使用生成器而非一次性加载

结语

Supervision提供了一套完整的工具链,使计算机视觉数据集的处理变得简单高效。通过本文介绍的方法,开发者可以轻松完成从数据加载到增强的整个流程,为后续的模型训练打下坚实基础。

记住,高质量的数据处理是构建优秀计算机视觉模型的关键第一步。合理利用Supervision提供的功能,可以显著提升你的开发效率和数据质量。