388 lines
9.0 KiB
Markdown
388 lines
9.0 KiB
Markdown
|
||
# YOLO 模型测试流程指南
|
||
|
||
本文档基于知乎文章整理,帮助你从零开始完成一个 YOLO 目标检测项目的完整流程。
|
||
|
||
***
|
||
|
||
## 目录
|
||
|
||
1. [环境准备](#1-环境准备)
|
||
2. [数据收集与准备](#2-数据收集与准备)
|
||
3. [数据标注](#3-数据标注)
|
||
4. [配置数据集](#4-配置数据集)
|
||
5. [模型训练](#5-模型训练)
|
||
6. [模型评估与测试](#6-模型评估与测试)
|
||
|
||
***
|
||
|
||
## 1. 环境准备
|
||
|
||
### 1.1 安装 Python 环境
|
||
|
||
确保 Python 版本 >= 3.8
|
||
|
||
```bash
|
||
python --version
|
||
```
|
||
|
||
### 1.2 创建虚拟环境
|
||
|
||
为了避免影响全局 Python 环境,建议为项目创建独立的虚拟环境。
|
||
|
||
**方式一:使用 conda
|
||
|
||
**首先安装 Anaconda 或 Miniconda:**
|
||
1. 下载 Miniconda(推荐,更轻量):<https://docs.conda.io/en/latest/miniconda.html>
|
||
2. 运行安装程序,勾选 "Add Miniconda to PATH"(或安装后手动配置)
|
||
3. 验证安装:
|
||
|
||
```bash
|
||
conda --version
|
||
```
|
||
|
||
**创建并激活虚拟环境:**
|
||
|
||
```bash
|
||
# 首次使用需要接受服务条款
|
||
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/main
|
||
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/r
|
||
conda tos accept --override-channels --channel https://repo.anaconda.com/pkgs/msys2
|
||
|
||
# 切换用清华的源
|
||
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main
|
||
|
||
# 创建虚拟环境
|
||
conda create -n yolo_demo python=3.10 -y
|
||
|
||
# 激活虚拟环境
|
||
conda activate yolo_demo
|
||
conda env list
|
||
|
||
# 安装 pytorch(GPU 支持,需要 CUDA)
|
||
# 首先卸载 CPU 版本(如果已安装)
|
||
conda uninstall pytorch torchvision torchaudio -y
|
||
|
||
# 安装 PyTorch CUDA 版本(推荐 CUDA 12.1)
|
||
conda install -v pytorch torchvision torchaudio pytorch-cuda=12.1 -c pytorch -c nvidia -y
|
||
# pip 来安装 PyTorch 更稳定
|
||
conda activate yolo_demo ; pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
|
||
|
||
# 验证安装是否成功
|
||
python -c "import torch; print(f'PyTorch版本: {torch.__version__}'); print(f'CUDA可用: {torch.cuda.is_available()}')"
|
||
```
|
||
|
||
**查看已创建的环境:**
|
||
|
||
```bash
|
||
conda env list
|
||
```
|
||
|
||
**常见问题:**
|
||
如果遇到 `CondaToSNonInteractiveError` 错误,需要先运行上面的 `conda tos accept` 命令接受服务条款。
|
||
|
||
**验证虚拟环境已激活:**
|
||
激活后,终端提示符前会显示虚拟环境名称:
|
||
|
||
```bash
|
||
(yolo_demo) D:\Codes\AI\Yolo\YoloDemo>
|
||
```
|
||
|
||
**退出虚拟环境:**
|
||
|
||
```bash
|
||
# conda:
|
||
conda deactivate
|
||
```
|
||
|
||
### 1.3 安装 YOLOv8(推荐)
|
||
|
||
```bash
|
||
conda activate yolo_demo ; pip install ultralytics
|
||
```
|
||
|
||
### 1.4 验证安装
|
||
|
||
```bash
|
||
python -c "from ultralytics import YOLO; print('YOLOv8 安装成功')"
|
||
```
|
||
|
||
### 1.5 检查 GPU 支持(可选但推荐)
|
||
|
||
```bash
|
||
python -c "import torch; print(f'CUDA可用: {torch.cuda.is_available()}')"
|
||
```
|
||
|
||
***
|
||
|
||
## 2. 数据收集与准备
|
||
|
||
### 2.1 确定检测目标
|
||
|
||
首先明确你要检测的类别,例如:
|
||
- car(汽车)
|
||
- person(行人)
|
||
- bicycle(自行车)
|
||
|
||
### 2.2 数据量建议
|
||
|
||
| 项目类型 | 每类最少图片 | 推荐图片数 |
|
||
| ---- | ------- | ------ |
|
||
| 快速原型 | 100-200 张 | 500 张 |
|
||
| 生产应用 | 1000 张 | 3000 张 |
|
||
|
||
### 2.3 数据来源
|
||
|
||
**方式一:使用公开数据集**
|
||
- COCO 数据集:<https://cocodataset.org>
|
||
- Open Images:<https://storage.googleapis.com/openimages>
|
||
|
||
**方式二:自己拍摄/收集图片**
|
||
- 确保图片清晰,目标可见
|
||
- 覆盖不同场景、光照、角度
|
||
- 统一格式为 JPG 或 PNG
|
||
|
||
***
|
||
|
||
## 3. 数据标注
|
||
|
||
### 3.1 选择标注工具
|
||
|
||
推荐使用以下工具之一:
|
||
|
||
- **VisioFirm**(推荐标注工具)⭐
|
||
- **TjMakeBot**(在线工具,支持 AI 辅助标注):<https://www.tjmakebot.com>
|
||
- **LabelImg**(本地工具)
|
||
- **Roboflow**(在线工具)
|
||
|
||
**快速启动 VisioFirm:**
|
||
|
||
```powershell
|
||
# 在项目根目录运行
|
||
.\start_visiofirm.ps1
|
||
```
|
||
|
||
详细的 VisioFirm 使用说明请查看:[VisioFirm 标注工具使用指南](./2.VisioFirm标注工具使用指南.md)
|
||
|
||
### 3.2 YOLO 标注格式说明
|
||
|
||
每张图片对应一个 `.txt` 文件,格式如下:
|
||
|
||
```
|
||
class_id center_x center_y width height
|
||
```
|
||
|
||
示例:
|
||
|
||
```
|
||
0 0.5 0.5 0.3 0.4
|
||
1 0.2 0.3 0.1 0.2
|
||
```
|
||
|
||
**说明:**
|
||
- `class_id`:类别 ID(从 0 开始)
|
||
- `center_x, center_y`:边界框中心点坐标(归一化 0-1)
|
||
- `width, height`:边界框宽高(归一化 0-1)
|
||
|
||
***
|
||
|
||
## 4. 配置数据集
|
||
|
||
### 4.1 数据集目录结构
|
||
|
||
支持多种数据集组织方式:
|
||
|
||
**方式一:VisioFirm 导出(推荐)**
|
||
```
|
||
dataset/tags/visiofirm/20260505_01/
|
||
├── data.yaml
|
||
├── train/images/
|
||
├── train/labels/
|
||
├── val/images/
|
||
├── val/labels/
|
||
└── test/images/
|
||
└── test/labels/
|
||
```
|
||
|
||
**方式二:LabelImg 标注**
|
||
```
|
||
dataset/tags/LabelImg/20260505_01/
|
||
├── data.yaml
|
||
├── train/images/
|
||
├── train/labels/
|
||
├── val/images/
|
||
├── val/labels/
|
||
└── test/images/
|
||
└── test/labels/
|
||
```
|
||
|
||
### 4.2 配置 dataset.yaml
|
||
|
||
在项目根目录创建 `dataset.yaml` 文件,配置示例见:[configs/dataset-traditional.yaml](../configs/dataset-traditional.yaml)
|
||
|
||
**关键配置项:**
|
||
- `path`: 数据集根目录(支持相对路径)
|
||
- `train`: 训练集图片目录(相对于 path)
|
||
- `val`: 验证集图片目录(相对于 path)
|
||
- `test`: 测试集图片目录(相对于 path)
|
||
- `nc`: 类别数量
|
||
- `names`: 类别名称列表
|
||
|
||
**示例配置:**
|
||
```yaml
|
||
path: ./dataset/tags/visiofirm/20260505_01
|
||
train: train/images
|
||
val: val/images
|
||
test: test/images
|
||
|
||
nc: 2
|
||
names:
|
||
- person
|
||
- bicycle
|
||
```
|
||
|
||
### 4.3 验证数据集
|
||
|
||
使用 [src/validate_dataset.py](../src/validate_dataset.py) 脚本验证数据集:
|
||
|
||
```bash
|
||
python src/validate_dataset.py
|
||
```
|
||
|
||
***
|
||
|
||
## 5. 模型训练
|
||
|
||
### 5.1 开始训练
|
||
|
||
使用 [src/train.py](../src/train.py) 脚本训练模型:
|
||
|
||
```bash
|
||
python src/train.py
|
||
```
|
||
|
||
常用参数:
|
||
- `--config`: dataset.yaml 配置文件路径(默认使用项目根目录)
|
||
- `--model`: 预训练模型(默认: yolov8n.pt)
|
||
- `--epochs`: 训练轮数(默认: 100)
|
||
- `--batch`: 批次大小(默认: 16)
|
||
- `--imgsz`: 输入图片尺寸(默认: 640)
|
||
- `--lr`: 初始学习率(默认: 0.01)
|
||
- `--device`: 设备(cuda/cpu,默认自动检测)
|
||
|
||
### 5.2 模型选择建议
|
||
|
||
| 模型 | 参数量 | 速度 | 精度 | 适用场景 |
|
||
| ---- | ----- | -- | -- | ---- |
|
||
| yolov8n | 3.2M | 最快 | 较低 | 实时检测 |
|
||
| yolov8s | 11.2M | 快 | 中等 | 平衡 |
|
||
| yolov8m | 25.9M | 中等 | 较高 | 生产环境 |
|
||
| yolov8l | 43.7M | 较慢 | 高 | 高精度 |
|
||
|
||
***
|
||
|
||
## 6. 模型评估与测试
|
||
|
||
### 6.1 评估模型
|
||
|
||
使用 [src/evaluate.py](../src/evaluate.py) 脚本评估模型:
|
||
|
||
```bash
|
||
python src/evaluate.py
|
||
```
|
||
|
||
**特点:**
|
||
- 自动查找最新训练的模型(无需手动指定路径)
|
||
- 支持从多个可能的位置查找已保存模型
|
||
|
||
参数:
|
||
- `--model`: 模型路径(默认:自动查找最新模型)
|
||
- `--config`: dataset.yaml 配置文件路径(默认使用项目根目录)
|
||
- `--split`: 评估集(train/val/test,默认: val)
|
||
|
||
### 6.2 预测
|
||
|
||
使用 [src/predict.py](../src/predict.py) 脚本进行预测:
|
||
|
||
```bash
|
||
python src/predict.py
|
||
```
|
||
|
||
**特点:**
|
||
- 自动查找最新训练的模型(无需手动指定路径)
|
||
- 自动从 dataset.yaml 读取测试集路径
|
||
|
||
参数:
|
||
- `--model`: 模型路径(默认:自动查找最新模型)
|
||
- `--source`: 预测源(图片/目录,默认:读取 dataset.yaml)
|
||
- `--conf`: 置信度阈值(默认: 0.25)
|
||
- `--nosave`: 不保存结果(默认保存)
|
||
|
||
### 6.3 模型导出为 ONNX 格式
|
||
|
||
使用 [src/export_onnx.py](../src/export_onnx.py) 脚本将 PyTorch (.pt) 模型导出为 ONNX 格式:
|
||
|
||
```bash
|
||
python src/export_onnx.py
|
||
```
|
||
|
||
**特点:**
|
||
- 自动查找最新训练的模型(无需手动指定路径)
|
||
- 支持模型简化,减小文件体积
|
||
- 可自定义输入尺寸和 ONNX opset 版本
|
||
|
||
参数:
|
||
- `--model`: 模型路径(默认:自动查找最新模型)
|
||
- `--imgsz`: 输入图片尺寸(默认: 640)
|
||
- `--simplify`: 简化模型(默认: True)
|
||
- `--no-simplify`: 不简化模型
|
||
- `--opset`: ONNX opset 版本(默认: 12)
|
||
|
||
**使用示例:**
|
||
```bash
|
||
# 导出最新训练的模型(自动查找)
|
||
python src/export_onnx.py
|
||
|
||
# 导出指定模型
|
||
python src/export_onnx.py --model runs/detect/my_model/weights/best.pt
|
||
|
||
# 自定义输入尺寸
|
||
python src/export_onnx.py --imgsz 1280
|
||
|
||
# 不简化模型
|
||
python src/export_onnx.py --no-simplify
|
||
|
||
# 自定义 opset 版本
|
||
python src/export_onnx.py --opset 17
|
||
```
|
||
|
||
***
|
||
|
||
## 快速开始命令汇总
|
||
|
||
**注意:请在项目根目录(YoloDemo)下运行以下命令**
|
||
|
||
```bash
|
||
# 1. 配置 dataset.yaml(首次使用)
|
||
# 复制 configs/dataset-traditional.yaml 到项目根目录,修改 path 指向你的数据集
|
||
|
||
# 2. 验证数据集
|
||
python src/validate_dataset.py
|
||
|
||
# 3. 训练模型
|
||
python src/train.py
|
||
|
||
# 4. 评估模型(自动查找最新训练好的模型)
|
||
python src/evaluate.py
|
||
|
||
# 5. 预测(自动查找最新模型)
|
||
python src/predict.py
|
||
|
||
# 6. 导出为 ONNX 格式(自动查找最新模型)
|
||
python src/export_onnx.py
|
||
```
|
||
|
||
***
|
||
|
||
祝训练顺利!
|