YOLOv8 目标检测
bash pip install ultralytics
如果希望利用 GPU 加速(强烈推荐),请确保已安装 CUDA 和对应的 PyTorch 版本。你可以通过以下命令快速检查环境:
```python
import torch
print(torch.cuda.is_available()) # 应输出 True
验证安装
安装完成后,在终端运行以下命令,如果能正常输出模型信息,即表示安装成功:
yolo predict model=yolov8n.pt source='https://ultralytics.com/images/bus.jpg'
该命令会自动下载最小规模的 yolov8n 模型,并对示例图片进行目标检测,结果保存在 runs/detect/predict 目录中。
快速上手:直接用预训练模型推理
无需任何训练,你就能立即使用 YOLOv8 对图像或视频进行检测。这里介绍两种方式:命令行和 Python 脚本。
命令行推理
处理单张图片:
yolo detect predict model=yolov8n.pt source='path/to/your/image.jpg'
处理视频文件:
yolo detect predict model=yolov8n.pt source='path/to/video.mp4'
使用摄像头实时检测:
yolo detect predict model=yolov8n.pt source=0
参数说明:
model:指定预训练模型,可选yolov8n.pt, yolov8s.pt, yolov8m.pt, yolov8l.pt, yolov8x.pt,首次使用会自动下载。source:输入源,可以是图片、视频、目录、YouTube 链接或摄像头索引。
Python API 推理
from ultralytics import YOLO
# 加载预训练模型
model = YOLO("yolov8n.pt")
# 对单张图片进行推理
results = model("bus.jpg")
# 显示结果
results[0].show() # 弹出窗口显示检测结果
# 保存结果到文件
results[0].save("output.jpg")
results 是一个列表,包含每张输入图片的检测结果,可以通过 boxes 属性获取边界框、类别、置信度等信息。
准备自定义数据集
在实际项目中,我们通常需要训练自己的数据。YOLOv8 支持多种标注格式,最常用的是 YOLO 格式:每张图片对应一个同名的 .txt 文件,每行代表一个目标,格式为 class_id x_center y_center width height(归一化坐标)。
目录结构
数据集应按以下结构组织:
datasets/
└── my_data/
├── images/
│ ├── train/
│ │ ├── img1.jpg
│ │ └── ...
│ └── val/
│ ├── img101.jpg
│ └── ...
└── labels/
├── train/
│ ├── img1.txt
│ └── ...
└── val/
├── img101.txt
└── ...
创建数据配置文件
新建一个 my_data.yaml 文件,内容如下:
path: ../datasets/my_data # 数据集根目录
train: images/train # 训练集图片相对路径
val: images/val # 验证集图片相对路径
# 类别名称
names:
0: person
1: bicycle
2: car
...
请根据你的实际类别数量修改 names 列表,从 0 开始编号。
标注工具推荐
- LabelImg:简单易用的矩形框标注工具,支持导出 YOLO 格式。
- CVAT:功能强大的在线标注平台,适合团队协作。
- Roboflow:提供标注、预处理和管理数据集的全流程服务,可直接导出 YOLOv8 格式。
训练自定义模型
准备好数据集后,训练只需一条命令或几行 Python 代码。
命令行训练
yolo detect train data=my_data.yaml model=yolov8n.pt epochs=100 imgsz=640
常用参数:
data:数据配置文件的路径。model:预训练模型权重(推荐从预训练开始迁移学习)或模型配置文件。epochs:训练的轮数。imgsz:输入图片的尺寸,默认为 640。batch:批量大小,根据 GPU 显存调整(默认 16)。device:指定训练设备,例如0表示第一块 GPU,cpu表示使用 CPU。project/name:分别指定结果保存的目录和实验名称。
训练过程会自动保存最佳模型、最后模型以及各种日志曲线在 runs/detect/train 目录下。
Python 训练脚本
from ultralytics import YOLO
# 加载预训练模型
model = YOLO("yolov8n.pt")
# 开始训练
results = model.train(
data="my_data.yaml",
epochs=100,
imgsz=640,
batch=16,
device=0
)
训练完成后,模型权重保存在 runs/detect/train/weights/ 下,best.pt 是验证集上表现最好的权重,last.pt 是最后一轮权重。
训练日志与可视化
Ultralytics 会自动生成 TensorBoard 日志和大量曲线,你可以启动 TensorBoard 查看:
tensorboard --logdir runs/detect/train
主要关注 mAP50, mAP50-95, box_loss, cls_loss 等指标,确认模型是否收敛。
评估与验证模型
对训练好的模型进行评估,能够了解其在测试集或验证集上的具体性能。
命令行评估
yolo detect val model=path/to/best.pt data=my_data.yaml
这将输出精确率、召回率、mAP 等详细指标,并在 runs/detect/val 中生成混淆矩阵、PR 曲线等图表。
Python 评估脚本
from ultralytics import YOLO
model = YOLO("runs/detect/train/weights/best.pt")
metrics = model.val(data="my_data.yaml")
print(metrics.box.map) # mAP50-95
print(metrics.box.map50) # mAP50
模型推理与部署
训练好的模型可以用于检测新图像、视频或摄像头流,使用方法与预训练模型完全一致。
model = YOLO("runs/detect/train/weights/best.pt")
results = model("test_image.jpg", save=True, conf=0.25)
save=True将检测结果图片保存到runs/detect/predict。conf调整置信度阈值,过滤掉低置信度框。
如果要批量处理文件夹中所有图片:
yolo detect predict model=best.pt source='path/to/image_folder/'
导出模型格式
YOLOv8 支持将模型导出为多种推理格式,以便部署到不同平台。
yolo export model=best.pt format=onnx # 导出 ONNX 格式
支持的格式包括 TorchScript, ONNX, OpenVINO, TensorRT, CoreML, TFLite 等。只需修改 format 参数即可。
导出后可以集成到自己的应用程序中,使用 ONNX Runtime 或 OpenCV DNN 等后端进行高效推理。
进阶技巧与调优
调整检测参数
在推理时,可以通过以下参数优化结果:
iou:NMS 的 IoU 阈值,默认 0.7,增大可获得更多重叠框,减小则抑制更强。max_det:每张图最多检测目标数。classes:仅检测指定类别,例如classes=[0,2]只检测人和汽车。
超参数进化
YOLOv8 提供了自动超参数优化功能,能够在验证集上搜索更优的学习率、数据增强等参数组合。
yolo detect tune data=my_data.yaml model=yolov8n.pt epochs=30 iterations=300
数据增强
YOLOv8 默认启用了丰富的在线数据增强,包括 Mosaic、MixUp、HSV 抖动等,这些可以在配置文件或代码中调整,以适应小样本或特定场景。
解决小目标和遮挡问题
- 使用更高输入分辨率(如
imgsz=1280)。 - 尝试较大的模型容量(如 yolov8l.pt 或 yolov8x.pt)。
- 加入更多包含小目标的训练样本,或开启
copy-paste增强。
常见问题与故障排除
Q: 训练时出现 “CUDA out of memory” 错误怎么办?
A: 减小 batch 大小,或降低 imgsz (如 320),还可以在 train 参数中设置 amp=False 关闭混合精度(牺牲速度节省显存)。
Q: 标注文件格式不正确导致训练失败?
A: 检查标签文件是否采用归一化坐标,且每一行只有 5 个数值。可以利用 YOLOv8 的数据集检查功能:
from ultralytics.data.utils import check_det_dataset
check_det_dataset("my_data.yaml")