使用 YOLOv8 与自定义 VOC 数据集进行目标检测的实践
目标检测是计算机视觉领域的一项核心任务,它不仅要识别图片中的物体,还要在图片中找到物体的具体位置并用边界框标记出来。这在自动驾驶、智能监控、无人机等应用中非常重要。本文将介绍如何基于 YOLOv8 模型和自定义的 VOC 数据集进行目标检测任务,并会深入探讨 YOLO 系列的演进历程,最后通过一个完整的实践过程帮助你快速上手。
一、目标检测任务介绍
目标检测是计算机视觉领域的一种技术,目的是识别图像或视频中的目标物体,并返回每个目标的位置(以边界框的形式表示)及其类别。一个典型的目标检测任务会产生以下输出:
- 类别标签:物体的类别,如"人"、“汽车”、"猫"等。
- 边界框:框出物体的位置,通常由四个值表示(左上角的 x、y 坐标和宽度、高度)。
- 置信度分数:模型对目标检测结果的置信程度。
目标检测广泛应用于自动驾驶车辆中的行人检测、视频监控中的异常行为识别、无人机对地面物体的识别等。
二、自定义 VOC 数据集介绍
PASCAL VOC(Visual Object Classes)是一个常用于目标检测任务的公开数据集,最早发布于 2007 年,支持图像分类、目标检测、语义分割等任务。不过在本文中,我们使用了一个自定义格式的 VOC 数据集,已经将数据集转换为 YOLOv8 所要求的格式。
自定义 VOC 数据集的文件结构:
voc2007myself/
├── images/ # 存储图像文件
│ ├── train/ # 训练集图像
│ ├── val/ # 验证集图像
│ └── test/ # 测试集图像
├── labels/ # 存储 YOLO 格式的标签文件
│ ├── train/ # 训练集标签
│ ├── val/ # 验证集标签
│ └── test/ # 测试集标签
├── train.cache # 训练集的缓存文件,用于加速训练
├── val.cache # 验证集的缓存文件
└── 其他 cache 文件
自定义 VOC 数据集结构说明
在这个自定义的 VOC 数据集中:
- images/ 文件夹包含了
train
、val
和test
子文件夹,分别存放训练集、验证集和测试集的图像。 - labels/ 文件夹中存放的是 YOLO 格式的标签文件,标签与图像文件一一对应,并且描述了图像中物体的类别和边界框。
- cache 文件 是 YOLOv8 生成的缓存文件,用于加速数据加载,尤其在重新训练时非常有用。
YOLO 标签格式
YOLO 格式的标签文件是 .txt
文件,每一行代表一个目标的标注,格式为:
class_id x_center y_center width height
- class_id:目标的类别编号,从 0 开始编号。
- x_center、y_center:目标边界框中心的坐标,已归一化到图像尺寸范围 [0, 1]。
- width、height:边界框的宽度和高度,也归一化到图像尺寸范围 [0, 1]。
三、YOLO 系列的演变历程
YOLO(You Only Look Once)是一种基于深度学习的目标检测算法,它的核心思想是将目标检测任务转化为一个回归问题,通过一次前向传播完成图像的检测。与传统的检测算法(如 R-CNN 系列)相比,YOLO 只需一次前向传播即可完成所有物体的检测,从而大大提高了检测速度。
YOLO 从最早的版本 YOLOv1 到最新的 YOLOv8 版本,经历了多次迭代,性能不断提升:
1. YOLOv1(2016 年)
YOLOv1 首次提出了 “一次检测” 的概念,它通过将图像划分为 S x S 网格,每个网格负责检测一个物体的位置和类别。虽然 YOLOv1 提出了新的思路,但其对小物体的检测效果不够理想。
2. YOLOv2(2017 年)
YOLOv2 引入了锚框机制,并使用了更深的网络结构(Darknet-19),有效提升了检测精度。YOLOv2 还支持多尺度输入,在检测小物体方面取得了较大改进。
3. YOLOv3(2018 年)
YOLOv3 使用了Darknet-53 网络,支持在多尺度特征图上进行检测。通过不同层级的特征图来处理不同大小的物体,解决了小物体检测的问题。YOLOv3 的检测速度和精度都得到了大幅提升。
4. YOLOv4(2020 年)
YOLOv4 引入了多种优化技术(如CSPNet 和 Mish 激活函数),使得模型在保证高速度的前提下进一步提高了检测精度。它在实际应用中对小型设备和嵌入式系统的适配性更好。
5. YOLOv5(2020 年)
虽然 YOLOv5 是由 Ultralytics 团队开发的,并未出自 YOLO 官方,但它凭借其简单易用的特点,迅速受到开发者的欢迎。YOLOv5 支持非常简单的 API 接口,且支持多种硬件平台。
6. YOLOv6、YOLOv7(2022 年)
YOLOv6 和 YOLOv7 引入了更多高效的网络结构,如E-ELAN 模块等,优化了轻量化和速度,使得在低计算资源设备上也能实现较好的检测性能。
7. YOLOv8(2023 年)
YOLOv8 是 Ultralytics 团队发布的最新版本。它结合了 YOLOv5 的易用性,借鉴了 YOLOv7 的高效检测机制,进一步提升了检测精度与速度。YOLOv8 还支持模型压缩、自动超参数优化等功能,适合更多的实际场景应用。
四、基于 YOLOv8 和自定义 VOC 数据集进行目标检测的完整实践
接下来,我们将基于 YOLOv8 和自定义的 VOC 数据集进行目标检测任务的实践操作。我们将使用 Ultralytics YOLOv8 库,这个库已经封装好了大部分所需的功能,非常适合初学者使用。
以下是完整的代码,包含所有的步骤。你只需要按顺序复制粘贴即可。
1. 环境配置与安装
首先,确保你已经安装了 Ultralytics YOLO
库。你可以通过以下命令进行安装:
!pip install ultralytics
2. 完整代码实现
# 1. 导入所需库
import torch
from ultralytics import YOLO
import os
import matplotlib.pyplot as plt
from PIL import Image
# 2. 禁用 W&B(Weights and Biases)
os.environ['WANDB_MODE'] = 'disabled' # 禁用 W&B,防止在训练过程中记录
# 3. 创建并写入 voc.yaml 配置文件
voc_yaml_content = """
path: /kaggle/input/voc2007myself # 自定义 VOC 数据集根路径
train: images/train # 训练集图像路径
val: images/val # 验证集图像路径
test: images/test # 测试集图像路径
# 数据集类别列表
names:
- aeroplane
- bicycle
- bird
- boat
- bottle
- bus
- car
- cat
- chair
- cow
- diningtable
- dog
- horse
- motorbike
- person
- pottedplant
- sheep
- sofa
- train
- tvmonitor
"""
# 将配置文件保存到当前工作目录中
yaml_file_path = '/kaggle/working/voc.yaml'
with open(yaml_file_path, 'w') as f:
f.write(voc_yaml_content)
print(f"配置文件已保存到 {yaml_file_path}")
# 4. 加载 YOLO
v8 预训练模型并开始训练
model = YOLO('yolov8n.pt') # 使用 nano 模型,速度快
# 开始训练 YOLOv8
results = model.train(
data=yaml_file_path, # 指定 VOC 数据集的配置文件路径
epochs=50, # 训练周期数
imgsz=640, # 输入图像大小,YOLOv8 默认是 640x640
batch=16, # 每批次 16 张图像
device=0 # 使用 GPU 训练
)
# 5. 评估模型
metrics = model.val()
print(f"评估结果: {metrics}")
# 6. 使用训练好的模型进行预测
predictions = model.predict(source='/kaggle/input/voc2007myself/images/test', save=True)
# 7. 自动选择存在的图片进行可视化
# 选择存在的图片文件路径进行可视化
test_image_dir = '/kaggle/input/voc2007myself/images/test'
test_images = os.listdir(test_image_dir)
# 检查是否有图片
if len(test_images) > 0:
# 选择一张图片
image_path = os.path.join(test_image_dir, test_images[0])
print(f"选择的测试图片: {image_path}")
else:
print("测试集没有图片,请检查路径和数据集是否正确")
# 可视化预测结果
def plot_prediction(image_path, result):
img = Image.open(image_path)
plt.figure(figsize=(10, 10))
plt.imshow(img)
# 获取预测结果中的边界框
boxes = result[0].boxes.xyxy.cpu().numpy() # 边界框坐标
scores = result[0].boxes.conf.cpu().numpy() # 置信度
labels = result[0].boxes.cls.cpu().numpy() # 类别
# 绘制边界框和标签
for i, box in enumerate(boxes):
label = int(labels[i])
score = scores[i]
plt.gca().add_patch(plt.Rectangle((box[0], box[1]), box[2] - box[0], box[3] - box[1],
edgecolor='red', facecolor='none', linewidth=2))
plt.text(box[0], box[1] - 5, f'{model.names[label]} {score:.2f}', color='red', fontsize=12)
plt.axis('off')
plt.show()
# 调用可视化函数显示预测结果
plot_prediction(image_path, predictions)
# 8. 保存模型为 ONNX 格式
model.export(format='onnx') # 将模型导出为 ONNX 格式,便于部署
print("模型已导出为 ONNX 格式")
代码解析
-
环境配置和安装:首先安装所需的
ultralytics
库,并设置环境变量禁用 Weights and Biases(W&B)。 -
准备数据集:确保自定义的 VOC 数据集已被格式化为 YOLO 格式,放置在正确的目录结构中。
-
创建配置文件:生成
voc.yaml
文件,其中指定了训练、验证和测试集的路径,以及数据集的类别名称。 -
模型训练:使用 YOLOv8 的 nano 版本进行训练,设置训练参数,如 epoch 数、输入图片大小和批次大小。
-
模型评估:使用验证集对训练好的模型进行评估,并输出相关指标。
-
模型预测:加载训练好的模型,使用测试集中的图片进行预测,并将结果保存到本地。
-
自动选择图片可视化:代码会自动从
test
文件夹中选择第一张图片,并对其进行预测结果的可视化展示。 -
保存模型:将训练好的模型导出为 ONNX 格式,便于后续在不同设备或框架中部署。
总结
本文详细介绍了基于 YOLOv8 和自定义 VOC 数据集进行目标检测的完整流程。无论你是初学者还是有一定经验的开发者,通过本文的实践代码,你可以轻松上手 YOLOv8,并在自己的数据集上训练和推理目标检测模型。你只需按照文中步骤执行,即可实现高效、准确的目标检测。如果你对目标检测有更多兴趣,欢迎进一步探索和优化模型参数以提升性能。
获取自定义 VOC 数据集
如果你需要使用与本文中一致的自定义 VOC 数据集,可以关注微信公众号【算法最TOP】,回复关键词 “voc2007”,将自动获得该数据集的下载链接。