CARPK数据集实战指南:从数据解析到模型训练的全流程解析

1次阅读
没有评论

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

image.webp

CARPK 数据集实战指南:从数据解析到模型训练的全流程解析

1. CARPK 数据集背景介绍

CARPK 数据集是一个专门用于车辆检测的公开数据集,由 UIUC 的研究团队于 2017 年发布。该数据集采集自无人机航拍视角,包含超过 1,400 张高分辨率图像,标注了约 89,000 辆汽车。数据集的主要特点包括:

CARPK 数据集实战指南:从数据解析到模型训练的全流程解析

  • 图像分辨率高(1280×720 像素)
  • 单一类别标注(仅包含车辆)
  • 密集小目标场景(停车场航拍)
  • PASCAL VOC 格式的 XML 标注文件

这个数据集非常适合用来研究小目标检测和密集场景下的目标检测问题。

2. 数据解析

2.1 数据集目录结构

CARPK 数据集的标准目录结构如下:

CARPK/
├── Annotations/        # 存放 XML 标注文件
├── Images/             # 存放原始图像
├── ImageSets/          # 包含训练 / 验证 / 测试划分文件
└── README.txt          # 数据集说明文档

2.2 标注格式解析

CARPK 使用 PASCAL VOC 格式的 XML 文件存储标注信息。每个 XML 文件对应一张图像,包含以下关键信息:

  • 图像尺寸(width, height)
  • 目标数量
  • 每个目标的边界框坐标(xmin, ymin, xmax, ymax)

以下是解析标注文件的 Python 代码示例:

import xml.etree.ElementTree as ET

def parse_annotation(xml_file):
    tree = ET.parse(xml_file)
    root = tree.getroot()

    size = root.find('size')
    width = int(size.find('width').text)
    height = int(size.find('height').text)

    boxes = []
    for obj in root.iter('object'):
        bbox = obj.find('bndbox')
        box = [int(bbox.find('xmin').text),
            int(bbox.find('ymin').text),
            int(bbox.find('xmax').text),
            int(bbox.find('ymax').text)
        ]
        boxes.append(box)

    return {
        'width': width,
        'height': height,
        'boxes': boxes
    }

3. 数据预处理

3.1 图像增强

针对 CARPK 数据集的特点,建议使用以下增强策略:

  • 随机水平翻转(p=0.5)
  • 随机裁剪(保留至少 70% 原图)
  • 色彩抖动(亮度、对比度、饱和度)
  • 高斯模糊(对小目标检测有益)

以下是使用 Albumentations 库实现的增强代码:

import albumentations as A

def get_train_transform():
    return A.Compose([A.HorizontalFlip(p=0.5),
        A.RandomSizedCrop(min_max_height=(int(0.7 * 720), 720),
            height=720, width=1280, p=0.5
        ),
        A.ColorJitter(p=0.5),
        A.GaussianBlur(p=0.3),
    ], bbox_params=A.BboxParams(format='pascal_voc'))

3.2 标注转换

由于 YOLOv5 需要特定格式的标注文件,我们需要将 PASCAL VOC 格式转换为 YOLO 格式:

  1. 将边界框坐标归一化到 [0,1] 范围
  2. 转换为中心点坐标 + 宽高格式
  3. 保存为.txt 文件,每行格式:class_id x_center y_center width height

转换代码如下:

def voc_to_yolo(box, img_width, img_height):
    # Convert from [xmin, ymin, xmax, ymax] to [x_center, y_center, width, height]
    x_center = (box[0] + box[2]) / 2 / img_width
    y_center = (box[1] + box[3]) / 2 / img_height
    width = (box[2] - box[0]) / img_width
    height = (box[3] - box[1]) / img_height
    return [x_center, y_center, width, height]

4. 模型训练

4.1 准备 YOLOv5

首先克隆官方 YOLOv5 仓库并安装依赖:

git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt

4.2 创建数据集配置文件

在 data/ 目录下创建 carpk.yaml 文件:

# CARPK dataset configuration
path: ../CARPK
train: Images/train
val: Images/val

# Classes
names:
  0: car

4.3 开始训练

使用以下命令启动训练:

python train.py --img 640 --batch 16 --epochs 50 --data data/carpk.yaml --weights yolov5s.pt

关键参数说明:

  • --img 640: 输入图像尺寸
  • --batch 16: 批次大小
  • --epochs 50: 训练轮次
  • --weights yolov5s.pt: 使用预训练的 YOLOv5s 模型

5. 性能评估

训练完成后,在测试集上评估模型性能:

python val.py --data data/carpk.yaml --weights runs/train/exp/weights/best.pt

典型评估指标包括:

  • mAP@0.5: 0.5 IoU 阈值下的平均精度
  • mAP@0.5:0.95: 不同 IoU 阈值下的平均精度
  • Precision: 精确率
  • Recall: 召回率

在 CARPK 数据集上,YOLOv5s 通常可以达到:

  • mAP@0.5: ~0.85
  • mAP@0.5:0.95: ~0.45

6. 避坑指南

6.1 常见问题

  1. 内存不足:CARPK 图像分辨率高,训练时可能出现 OOM 错误
  2. 解决方案:减小批次大小或图像尺寸

  3. 小目标检测效果差:车辆在航拍图中占比较小

  4. 解决方案:使用更小的 anchor box 或 FPN 结构

  5. 标注文件格式错误:YOLO 格式要求严格

  6. 解决方案:仔细检查转换后的.txt 文件格式

6.2 优化建议

  • 使用更大的模型(如 YOLOv5l)提高精度
  • 尝试不同的学习率策略(如余弦退火)
  • 添加更多针对小目标的增强(如随机缩放)

结语

通过本文的完整流程,你应该已经掌握了 CARPK 数据集的基本使用方法,并能够训练出自己的车辆检测模型。CARPK 作为密集小目标检测的典型数据集,对算法在小目标检测上的能力提出了挑战。建议读者在掌握基础流程后,进一步尝试不同的模型结构和训练策略,以获得更好的检测性能。

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