共计 2958 个字符,预计需要花费 8 分钟才能阅读完成。
CARPK 数据集背景介绍
CARPK 数据集是专为车辆检测任务设计的开源数据集,由美国加利福尼亚大学圣地亚哥分校(UCSD)的研究团队于 2017 年发布。该数据集采集自无人机航拍视角,主要包含停车场场景的俯视图。数据集具有以下特点:

- 规模:包含 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 训练配置
- 安装 YOLOv5 环境:
git clone https://github.com/ultralytics/yolov5
cd yolov5
pip install -r requirements.txt
- 准备数据集 YAML 文件:
# carpk.yaml
path: ../CARPK
train: Images
test: Images
nc: 1 # 类别数
names: ['car']
- 启动训练:
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() # 显示检测结果
避坑指南
常见问题及解决方案
- 标注坐标越界:
- 现象:训练时出现
Loss is NaN -
解决:检查标注归一化后的值是否在 [0,1] 范围内
-
类别不平衡:
- 现象:模型偏向预测负样本
-
解决:使用 Focal Loss 或在数据增强时侧重小目标
-
显存不足:
- 现象:
CUDA out of memory -
解决:减小
--batch-size或使用--img缩小输入尺寸 -
过拟合:
- 现象:训练集指标高但测试集差
- 解决:增加数据增强强度或使用更大的模型
总结
通过对 CARPK 数据集的完整实践,我们实现了从数据解析到模型训练的全流程。关键收获包括:
- 航拍车辆检测需要特殊的数据增强策略
- YOLOv5 在小目标检测场景表现良好
- 合理的标注格式转换能显著提升训练效率
建议进一步尝试的方向:
- 使用更大的 YOLOv5 模型(如 yolov5x)提升精度
- 尝试其他检测框架如 Faster R-CNN 对比效果
- 加入额外的停车场场景数据进行迁移学习
正文完
