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

1次阅读
没有评论

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

image.webp

CARPK 数据集背景介绍

CARPK 数据集是专为车辆检测任务设计的开源数据集,由美国加利福尼亚大学圣地亚哥分校(UCSD)的研究团队于 2017 年发布。该数据集采集自无人机航拍视角,主要包含停车场场景的俯视图。数据集具有以下特点:

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

  • 规模:包含 1,448 张高分辨率图像(1,280×720 像素)
  • 标注:总计 89,777 个车辆边界框标注
  • 场景多样性:覆盖不同天气条件(晴天 / 阴天)和停车场布局
  • 挑战性:包含车辆密集、遮挡严重等现实场景

数据解析

目录结构

原始数据集解压后目录结构如下:

CARPK/
├── Annotations/
│   ├── 2015-10-22-16-21-13_00001.json
│   └── ...
├── Images/
│   ├── 2015-10-22-16-21-13_00001.jpg
│   └── ...
└── README.txt

标注格式解析

标注文件采用 JSON 格式,每个文件对应一张图像,关键字段说明:

{
  "image_path": "2015-10-22-16-21-13_00001.jpg",
  "image_size": {"width": 1280, "height": 720, "depth": 3},
  "objects": [
    {"bbox": {"xmin": 50, "ymin": 60, "xmax": 120, "ymax": 90},
      "label": "car"
    },
    # 更多标注...
  ]
}

数据加载示例

使用 Python 加载数据集的完整代码:

import json
from pathlib import Path
import cv2

class CARPKDataset:
    def __init__(self, root_dir):
        self.root = Path(root_dir)
        self.annotations = sorted(list((self.root/'Annotations').glob('*.json')))

    def __len__(self):
        return len(self.annotations)

    def __getitem__(self, idx):
        with open(self.annotations[idx]) as f:
            ann = json.load(f)

        img_path = self.root/'Images'/ann['image_path']
        image = cv2.imread(str(img_path))

        # 转换为 YOLO 格式的标注 [class_idx, x_center, y_center, width, height]
        boxes = []
        for obj in ann['objects']:
            bbox = obj['bbox']
            x_center = (bbox['xmin'] + bbox['xmax'])/2 / ann['image_size']['width']
            y_center = (bbox['ymin'] + bbox['ymax'])/2 / ann['image_size']['height']
            width = (bbox['xmax'] - bbox['xmin']) / ann['image_size']['width']
            height = (bbox['ymax'] - bbox['ymin']) / ann['image_size']['height']
            boxes.append([0, x_center, y_center, width, height])  # 类别 0 表示 car

        return image, np.array(boxes)

数据预处理

图像增强策略

针对航拍车辆检测的特点,推荐使用以下增强组合:

import albumentations as A

transform = A.Compose([A.HorizontalFlip(p=0.5),
    A.RandomBrightnessContrast(p=0.2),
    A.CLAHE(p=0.3),
    A.RandomGamma(p=0.2),
    # 保持空间变换与标注同步
], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))

标注格式转换

将原始 JSON 标注转换为 YOLO 格式的文本文件:

def convert_to_yolo_format(root_dir):
    dataset = CARPKDataset(root_dir)
    output_dir = Path(root_dir)/'labels'
    output_dir.mkdir(exist_ok=True)

    for i in range(len(dataset)):
        _, boxes = dataset[i]
        ann_file = output_dir/f'{dataset.annotations[i].stem}.txt'
        np.savetxt(ann_file, boxes, fmt='%d %.6f %.6f %.6f %.6f')

模型训练

YOLOv5 训练配置

  1. 安装 YOLOv5 环境:
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
  1. 准备数据集 YAML 文件:
# carpk.yaml
path: ../CARPK
train: Images
test: Images

nc: 1  # 类别数
names: ['car']
  1. 启动训练:
python train.py --img 640 --batch 16 --epochs 100 --data carpk.yaml --weights yolov5s.pt

关键训练参数说明

  • --img 640:输入图像尺寸
  • --batch 16:根据 GPU 显存调整
  • --epochs 100:典型训练轮次
  • --weights yolov5s.pt:使用预训练的小模型

性能评估

评价指标

在测试集上获得的典型指标(YOLOv5s 模型):

指标
mAP@0.5 0.78
mAP@0.5:0.95 0.52
Precision 0.81
Recall 0.73

可视化检测结果

# 使用训练好的模型进行推理
model = torch.hub.load('ultralytics/yolov5', 'custom', path='runs/train/exp/weights/best.pt')
results = model('test.jpg')
results.show()  # 显示检测结果

避坑指南

常见问题及解决方案

  1. 标注坐标越界
  2. 现象:训练时出现Loss is NaN
  3. 解决:检查标注归一化后的值是否在 [0,1] 范围内

  4. 类别不平衡

  5. 现象:模型偏向预测负样本
  6. 解决:使用 Focal Loss 或在数据增强时侧重小目标

  7. 显存不足

  8. 现象:CUDA out of memory
  9. 解决:减小 --batch-size 或使用 --img 缩小输入尺寸

  10. 过拟合

  11. 现象:训练集指标高但测试集差
  12. 解决:增加数据增强强度或使用更大的模型

总结

通过对 CARPK 数据集的完整实践,我们实现了从数据解析到模型训练的全流程。关键收获包括:

  1. 航拍车辆检测需要特殊的数据增强策略
  2. YOLOv5 在小目标检测场景表现良好
  3. 合理的标注格式转换能显著提升训练效率

建议进一步尝试的方向:

  • 使用更大的 YOLOv5 模型(如 yolov5x)提升精度
  • 尝试其他检测框架如 Faster R-CNN 对比效果
  • 加入额外的停车场场景数据进行迁移学习
正文完
 0
评论(没有评论)