📖 引言:为什么需要单类别多目标检测?

在计算机视觉领域,目标检测是一个重要的任务,它不仅需要识别图像中的目标,还需要精确定位目标的位置。YOLO(You Only Look Once)是一种高效的目标检测算法,能够同时实现目标分类和定位。

本项目将带你从零开始,使用YOLOv8构建一个单类别多目标检测模型,能够自动检测图像中的多个目标。这是一个很好的YOLOv8检测模型入门实践,适合想要学习计算机视觉和深度学习的初学者。

🚀 项目概览:我们要做什么?

这是一个基于YOLOv8的单类别多目标检测训练平台,用于训练、验证、评估和推理YOLO模型,以检测图像中的多个目标。主要功能包括:

  • ✅ 自动数据处理:数据初始化、预处理和自动划分
  • ✅ YOLOv8检测模型训练:支持自定义训练参数和断点续训
  • ✅ 模型验证与评估:详细的性能指标和结果保存
  • ✅ 多场景推理:支持单张/批量图像推理
  • ✅ 可视化输出:直观展示检测结果
  • ✅ 模型导出:支持ONNX等格式,便于部署
  • ✅ Web应用:提供友好的Web界面,支持在线推理

🛠️ 环境准备:开始前的准备工作

1. 安装依赖

首先,确保你已经安装了Python 3.8+,然后安装项目所需的依赖:

# 安装YOLOv8
pip install ultralytics

# 安装其他依赖
pip install opencv-python numpy pyyaml fastapi jinja2 uvicorn

2. 获取项目代码

将项目代码克隆到本地:

# 如果你是直接获取的代码,可以跳过此步骤
# git clone <项目仓库地址>

📁 项目结构解析:理解代码组织

在开始实践之前,先了解一下项目的目录结构,这有助于你理解代码的组织方式:

yolo_multi_target/
├── __init__.py          # 包初始化文件
├── config.py            # 配置管理类,负责加载和解析配置文件
├── config.yaml          # 核心配置文件,定义训练、推理等参数
├── model.py             # YOLO检测模型类,封装了模型的创建和基本操作
├── trainer.py           # 训练器类,负责模型训练和验证
├── inferencer.py        # 推理器类,负责模型推理和结果处理
├── data_splitter.py     # 数据分割器,负责将原始数据分为训练集和验证集
├── data_initializer.py  # 数据初始化类,负责数据预处理
├── data_processor.py    # 数据处理类,负责数据格式转换
├── main.py              # 命令行入口,提供了所有功能的命令行接口
├── data/                # 数据目录
│   ├── raw/             # 原始处理后数据
│   ├── train/           # 训练数据
│   ├── val/             # 验证数据
│   └── data.yaml        # 数据配置文件
├── origin/              # 原始数据目录
│   ├── images/          # 原始图像存放处
│   └── labels/          # 原始标签存放处(YOLO格式)
├── initData/            # 初始化数据目录
├── output/              # 模型输出目录,训练好的模型会保存在这里
├── web/                 # Web应用目录
│   ├── app/             # Web应用主程序
│   └── templates/       # Web模板
└── README.md            # 项目说明文档

📊 数据准备:构建你的数据集

1. 准备原始图像和标签

将你的原始图像放入 origin/images 目录,对应的标签文件放入 origin/labels 目录。标签文件格式为YOLO格式(.txt文件),每个图像对应一个标签文件,文件名相同,扩展名不同。

2. YOLO格式标签说明

YOLO格式的标签文件每行包含一个目标的信息,格式如下:

<class_id> <x_center> <y_center> <width> <height>

其中:

  • <class_id>:目标类别ID(单类别检测时,所有目标的class_id都为0)
  • <x_center>:目标中心x坐标(归一化到0-1之间)
  • <y_center>:目标中心y坐标(归一化到0-1之间)
  • <width>:目标宽度(归一化到0-1之间)
  • <height>:目标高度(归一化到0-1之间)

3. 示例数据结构

origin/
├── images/
│   ├── image_1.jpg       # 原始图像
│   └── image_2.jpg       # 原始图像
└── labels/
    ├── image_1.txt       # 对应image_1.jpg的标签文件
    └── image_2.txt       # 对应image_2.jpg的标签文件

4. 示例标签文件内容

对于单类别检测,所有目标的class_id都为0:

# image_1.txt(包含2个目标)
0 0.3 0.4 0.2 0.3
0 0.7 0.5 0.15 0.25

⚙️ 配置文件详解:定制你的训练参数

核心配置文件是 config.yaml,它定义了模型训练、推理和数据处理的各项参数。让我们来详细了解一下:

1. 数据路径配置

data:
  origin_data_path: "origin"      # 原始数据根目录
  origin_images: "origin/images"   # 原始图像目录
  origin_labels: "origin/labels"   # 原始标签目录
  raw_data_path: "data/raw"        # 处理后原始数据目录
  train_data_path: "data/train"    # 训练数据目录
  val_data_path: "data/val"        # 验证数据目录
  data_config: "data/data.yaml"    # 数据配置文件路径

2. 模型配置

model:
  type: "yolov8"                  # 模型类型
  pretrained: true                 # 是否使用预训练权重
  pretrained_model: "yolov8n.pt"   # 预训练模型路径
  device: "0"                      # 设备,"0"表示使用第一块GPU
  single_class: true               # 是否为单类别检测
  output_dir: "output"             # 模型输出目录

3. 训练参数配置

train:
  batch_size: 16     # 批量大小,根据你的GPU内存调整
  epochs: 50         # 训练轮数,建议50-100轮
  lr0: 0.01          # 初始学习率
  lrf: 0.1           # 学习率衰减
  imgsz: 640         # 图像大小,YOLOv8默认640
  workers: 4         # 工作线程数
  patience: 10       # 早停轮数,如果10轮没有提升则停止
  resume: false      # 是否从上次训练中断处继续

4. 推理参数配置

infer:
  conf_thres: 0.5    # 置信度阈值
  iou_thres: 0.45    # IOU阈值
  imgsz: 640         # 推理时的图像大小
  device: "0"        # 推理设备
  single_cls: true   # 是否为单类别检测

5. 验证参数配置

val:
  batch_size: 16     # 验证批量大小
  imgsz: 640         # 验证图像大小
  device: "0"        # 验证设备
  conf_thres: 0.5    # 验证置信度阈值
  iou_thres: 0.45    # 验证IOU阈值

🧪 实战环节:从零开始训练你的模型

现在,让我们开始实战吧!按照以下步骤,你将能够训练出自己的单类别多目标检测模型。

1. 数据分割:准备训练和验证数据

首先,我们需要将原始数据分割为训练集和验证集:

# 执行数据分割命令
python main.py split

预期输出

INFO:root:开始执行数据分割
INFO:root:找到 X 张图像
INFO:root:数据分割完成: 训练集 Y 张, 验证集 Z 张
INFO:root:数据分割完成,训练集: Y 张, 验证集: Z 张

执行完成后,数据会被自动处理并复制到 data/rawdata/traindata/val 目录。

2. 模型训练:让模型学习目标特征

接下来,我们开始训练模型:

# 执行模型训练命令
python main.py train

预期输出

INFO:root:开始执行模型训练
INFO:root:开始训练YOLO多目标检测模型
INFO:root:数据配置: data/data.yaml
INFO:root:训练参数: epochs=50, batch_size=16, lr0=0.01, imgsz=640
# ... 训练过程日志 ...
INFO:root:模型训练完成
INFO:root:训练结果保存在: output/yolo_multi_target_exp

训练过程中,你可以看到损失值、准确率、IOU等指标的变化。训练完成后,模型会保存在 output/yolo_multi_target_exp 目录下,包括:

  • best.pt:验证集上表现最好的模型
  • last.pt:最后一轮训练的模型
  • results.csv:训练结果记录
  • confusion_matrix.png:混淆矩阵

3. 模型验证:评估模型性能

训练完成后,我们可以验证模型的性能:

# 执行模型验证命令
python main.py val --weights output/yolo_multi_target_exp/weights/best.pt

预期输出

INFO:root:开始执行模型验证
INFO:root:开始验证YOLO多目标检测模型
INFO:root:数据配置: data/data.yaml
INFO:root:验证参数: imgsz=640, batch_size=16
# ... 验证过程日志 ...
INFO:root:模型验证完成
INFO:root:验证结果: precision=0.XX, recall=0.XX, mAP50=0.XX, mAP50-95=0.XX

验证结果会显示模型的精确率、召回率、mAP50和mAP50-95等指标,帮助你评估模型的性能。

4. 模型评估:详细评估模型表现

除了验证,我们还可以进行更详细的模型评估:

# 执行模型评估命令
python main.py eval --weights output/yolo_multi_target_exp/weights/best.pt --save-results

预期输出

INFO:root:开始执行模型评估
INFO:root:开始评估YOLO多目标检测模型
INFO:root:数据配置: data/data.yaml
# ... 评估过程日志 ...
INFO:root:模型评估完成
INFO:root:评估结果保存在: output/yolo_multi_target_exp/eval_results

评估结果会保存在指定目录,包括详细的评估报告和可视化结果。

5. 模型推理:用训练好的模型检测目标

现在,我们可以使用训练好的模型进行推理了:

# 执行单张图像推理,并保存结果
python main.py infer --weights output/yolo_multi_target_exp/weights/best.pt --source test_image.jpg --save-result

# 执行批量图像推理
python main.py infer --weights output/yolo_multi_target_exp/weights/best.pt --source test_images/ --save-result

预期输出

INFO:root:开始YOLO多目标检测推理: test_image.jpg
INFO:root:推理完成,处理了 1 张图像
INFO:root:图像: test_image.jpg
INFO:root:  检测到 2 个目标
INFO:root:  推理结果保存: infer_results/test_image.jpg

推理结果会显示图像中检测到的目标数量,并将可视化结果保存到 infer_results 目录。

6. 模型导出:准备部署你的模型

如果你想将模型部署到其他平台,可以将其导出为ONNX等格式:

# 导出为ONNX格式
python main.py export --weights output/yolo_multi_target_exp/weights/best.pt --format onnx

预期输出

INFO:root:开始执行模型导出
INFO:root:模型导出完成: output/yolo_multi_target_exp/weights/best.onnx

导出的模型会保存在模型输出目录下,便于后续部署和使用。

🌐 Web应用:在线使用你的模型

该项目还提供了Web应用界面,方便你在线上传图像进行推理。

1. 启动Web应用

# 启动主程序(包含Web应用)
python main.py

2. 访问Web应用

在浏览器中输入 http://localhost:8000/yolo_multi_target,即可访问Web应用界面。

3. 使用Web应用

  • 点击"选择文件"按钮上传图像
  • 点击"开始推理"按钮进行推理
  • 等待推理完成,查看结果
  • 可以下载推理结果图像

📈 结果分析:如何解读训练和推理结果

1. 训练结果分析

训练完成后,results.csv 文件会记录训练过程中的各项指标,包括:

  • epoch:训练轮数
  • train/box_loss:训练集边界框损失
  • train/cls_loss:训练集分类损失
  • train/dfl_loss:训练集分布式焦点损失
  • metrics/precision:验证集精确率
  • metrics/recall:验证集召回率
  • metrics/mAP50:验证集mAP50指标
  • metrics/mAP50-95:验证集mAP50-95指标
  • val/box_loss:验证集边界框损失
  • val/cls_loss:验证集分类损失
  • val/dfl_loss:验证集分布式焦点损失
  • lr/pg0:学习率
  • lr/pg1:学习率
  • lr/pg2:学习率

对于检测模型,我们主要关注:

  • metrics/precision:精确率,模型预测为正例的样本中实际为正例的比例
  • metrics/recall:召回率,实际为正例的样本中被模型预测为正例的比例
  • metrics/mAP50:IOU=0.5时的平均精度,反映模型在较高IOU阈值下的性能
  • metrics/mAP50-95:IOU从0.5到0.95的平均精度,反映模型在不同IOU阈值下的综合性能

2. 推理结果分析

推理结果包含以下信息:

  • 检测到的目标数量
  • 每个目标的位置(边界框坐标)
  • 每个目标的置信度
  • 可视化结果(带边界框的图像)

❌ 常见问题和解决方案

1. 数据分割时找不到图像

问题:执行 python main.py split 后,日志显示"找到 0 张图像"

解决方案

  • 检查 origin/images 目录是否存在图像文件
  • 确保图像文件格式正确(支持 .jpg, .jpeg, .png, .bmp, .tiff)
  • 检查图像和标签文件是否一一对应,文件名相同

2. 训练时内存不足

问题:训练过程中出现 CUDA out of memory 错误

解决方案

  • 减小 config.yaml 中的 batch_size 参数(例如从16改为8或4)
  • 减小 config.yaml 中的 imgsz 参数(例如从640改为320)
  • 使用更小的预训练模型(例如 yolov8n.pt 改为 yolov8s.pt)

3. 模型准确率低

问题:验证时模型准确率低于预期

解决方案

  • 增加训练轮数(调整 config.yaml 中的 epochs 参数)
  • 增加数据集大小,确保有足够的样本
  • 检查数据集质量,确保标签正确
  • 调整学习率(调整 config.yaml 中的 lr0 参数)
  • 尝试不同的预训练模型

4. 推理时模型加载失败

问题:执行推理命令时,提示模型文件不存在

解决方案

  • 检查模型文件路径是否正确
  • 确保模型文件存在(output/yolo_multi_target_exp/weights/best.pt
  • 检查模型文件名是否正确

5. Web应用无法访问

问题:启动主程序后,无法在浏览器中访问Web应用

解决方案

  • 检查端口是否被占用(默认使用8000端口)
  • 检查防火墙设置,确保端口已开放
  • 尝试使用其他浏览器访问

📚 参考资料

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐