26备战秋招day5——基于voc的yolov8目标检测


使用 YOLOv8 与自定义 VOC 数据集进行目标检测的实践

目标检测是计算机视觉领域的一项核心任务,它不仅要识别图片中的物体,还要在图片中找到物体的具体位置并用边界框标记出来。这在自动驾驶、智能监控、无人机等应用中非常重要。本文将介绍如何基于 YOLOv8 模型和自定义的 VOC 数据集进行目标检测任务,并会深入探讨 YOLO 系列的演进历程,最后通过一个完整的实践过程帮助你快速上手。

一、目标检测任务介绍

目标检测是计算机视觉领域的一种技术,目的是识别图像或视频中的目标物体,并返回每个目标的位置(以边界框的形式表示)及其类别。一个典型的目标检测任务会产生以下输出:

  1. 类别标签:物体的类别,如"人"、“汽车”、"猫"等。
  2. 边界框:框出物体的位置,通常由四个值表示(左上角的 x、y 坐标和宽度、高度)。
  3. 置信度分数:模型对目标检测结果的置信程度。

目标检测广泛应用于自动驾驶车辆中的行人检测、视频监控中的异常行为识别、无人机对地面物体的识别等。

二、自定义 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/ 文件夹包含了 trainvaltest 子文件夹,分别存放训练集、验证集和测试集的图像。
  • 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 引入了多种优化技术(如CSPNetMish 激活函数),使得模型在保证高速度的前提下进一步提高了检测精度。它在实际应用中对小型设备和嵌入式系统的适配性更好。

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 格式")

代码解析

  1. 环境配置和安装:首先安装所需的 ultralytics 库,并设置环境变量禁用 Weights and Biases(W&B)。

  2. 准备数据集:确保自定义的 VOC 数据集已被格式化为 YOLO 格式,放置在正确的目录结构中。

  3. 创建配置文件:生成 voc.yaml 文件,其中指定了训练、验证和测试集的路径,以及数据集的类别名称。

  4. 模型训练:使用 YOLOv8 的 nano 版本进行训练,设置训练参数,如 epoch 数、输入图片大小和批次大小。

  5. 模型评估:使用验证集对训练好的模型进行评估,并输出相关指标。

  6. 模型预测:加载训练好的模型,使用测试集中的图片进行预测,并将结果保存到本地。

  7. 自动选择图片可视化:代码会自动从 test 文件夹中选择第一张图片,并对其进行预测结果的可视化展示。

  8. 保存模型:将训练好的模型导出为 ONNX 格式,便于后续在不同设备或框架中部署。


总结

本文详细介绍了基于 YOLOv8 和自定义 VOC 数据集进行目标检测的完整流程。无论你是初学者还是有一定经验的开发者,通过本文的实践代码,你可以轻松上手 YOLOv8,并在自己的数据集上训练和推理目标检测模型。你只需按照文中步骤执行,即可实现高效、准确的目标检测。如果你对目标检测有更多兴趣,欢迎进一步探索和优化模型参数以提升性能。


获取自定义 VOC 数据集

如果你需要使用与本文中一致的自定义 VOC 数据集,可以关注微信公众号【算法最TOP】,回复关键词 “voc2007”,将自动获得该数据集的下载链接。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值