跳到主要内容Python YOLOv8 进阶教程 | 极客日志PythonAI算法
Python YOLOv8 进阶教程
YOLOv8 是 Ultralytics 团队推出的单阶段目标检测算法,支持检测、分割、姿态估计等任务。本文涵盖环境搭建、核心功能(图片/视频检测、实例分割、姿态估计、分类)、自定义训练、模型优化部署及实战案例。通过代码示例展示如何使用 ultralytics 库进行推理和训练,并提供常见问题解决方案。
Python YOLOv8 进阶教程
一、YOLOv8 技术深度解析
1.1 YOLO 算法发展历程
YOLO(You Only Look Once)是由 Joseph Redmon 等人提出的单阶段目标检测算法,自 2016 年发布以来经历了多次迭代:
- YOLOv1:首次提出单阶段检测思想,将目标检测转化为回归问题
- YOLOv2:引入批量归一化、锚框机制和多尺度训练,提升检测精度
- YOLOv3:使用 Darknet-53 骨干网络,引入多尺度预测和残差连接
- YOLOv4:结合 CSPNet、Mosaic 数据增强等多种优化技术
- YOLOv5:Ultralytics 团队推出的版本,以易用性和高性能著称
YOLOv6:美团团队推出的工业级目标检测框架YOLOv7:提出可微辅助分支和动态标签分配等创新技术YOLOv8:Ultralytics 团队 2023 年推出的最新版本,支持检测、分割、姿态估计等多种任务1.2 YOLOv8 核心特性
YOLOv8 在保持 YOLO 系列一贯的高速检测特性的同时,在精度和易用性上有了显著提升:
- 多任务支持:目标检测、实例分割、姿态估计、分类等
- 模型架构:采用 C2f 模块替代 C3 模块,提升特征提取能力
- 损失函数:使用 CIoU 损失替代 IoU 损失,优化边界框回归
- 标签分配:动态标签分配策略,提升小目标检测性能
- 部署友好:支持 ONNX、TensorRT、CoreML 等多种部署格式
1.3 YOLOv8 模型家族
YOLOv8 提供了多种尺寸的模型,以平衡检测速度和精度:
| 模型 | 输入尺寸 | 参数量 (M) | FLOPs(B) | COCO mAP | 速度 (ms) |
|---|
| n | 640x640 | 3.2 | 8.7 | 53.9 | 0.9 |
| s | 640x640 | 11.2 | 28.6 | 60.9 | 2.0 |
| m | 640x640 | 25.9 | 78.9 | 64.8 | 2.7 |
| l | 640x640 | 43.7 | 165.2 | 67.2 | 4.6 |
| x | 640x640 | 68.2 | 257.8 | 68.8 | 6.8 |
二、环境搭建与配置
2.1 安装依赖
pip install ultralytics
pip install opencv-python
pip install torch torchvision
pip install numpy matplotlib pillow
2.2 验证安装
from ultralytics import YOLO
model = YOLO("yolov8n.pt")
model.info()
三、核心功能详解
3.1 目标检测基础
3.1.1 图片检测
from ultralytics import YOLO
import cv2
model = YOLO("yolov8n.pt")
results = model("test.jpg")
results = model(["test1.jpg", "test2.jpg", "test3.jpg"])
for i, result in enumerate(results):
result.save(filename=f"result_{i}.jpg")
3.1.2 视频检测
results = model("test.mp4", save=True)
results = model(0, show=True, save=True)
3.2 实例分割
YOLOv8 支持实例分割任务,可以同时检测目标并分割其轮廓:
model = YOLO("yolov8n-seg.pt")
results = model("test.jpg")
results[0].save(filename="segment_result.jpg")
3.3 姿态估计
model = YOLO("yolov8n-pose.pt")
results = model("person.jpg")
results[0].save(filename="pose_result.jpg")
3.4 图像分类
model = YOLO("yolov8n-cls.pt")
results = model("cat.jpg")
print(results[0].probs)
print(results[0].probs.top1)
四、高级应用技巧
4.1 自定义模型训练
4.1.1 数据集准备
YOLOv8 支持 COCO 格式的数据集,数据集结构如下:
dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
4.1.2 训练配置
model = YOLO("yolov8n.pt")
results = model.train(
data="dataset.yaml",
epochs=100,
batch=16,
imgsz=640,
device="cuda:0",
project="my_project",
name="exp1"
)
4.1.3 模型评估
results = model.val()
print(results.box.map)
print(results.box.map50)
print(results.box.map75)
4.2 模型优化与部署
4.2.1 模型导出
model.export(format="onnx")
model.export(format="engine")
model.export(format="coreml")
4.2.2 模型量化
model.export(format="onnx", int8=True)
model.export(format="onnx", fp16=True)
4.3 高级后处理
4.3.1 NMS(非极大值抑制)
results = model("test.jpg", conf=0.5, iou=0.7)
4.3.2 过滤检测结果
results = model("test.jpg", classes=[0, 2, 5])
for result in results:
boxes = result.boxes
for box in boxes:
if box.conf[0] > 0.7:
print(f"{model.names[int(box.cls[0])]}: {box.conf[0]:.2f}")
4.4 性能优化
4.4.1 多 GPU 训练
results = model.train(
data="dataset.yaml",
epochs=100,
batch=32,
device=[0, 1]
)
4.4.2 混合精度训练
results = model.train(
data="dataset.yaml",
epochs=100,
amp=True
)
五、实战项目案例
5.1 智能监控系统
5.1.1 功能需求
- 实时检测监控画面中的异常行为
- 支持火灾、烟雾、人员打架等检测
- 自动报警和记录
5.1.2 代码实现
from ultralytics import YOLO
import cv2
import time
import smtplib
from email.mime.text import MIMEText
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture(0)
def detect_abnormal(results):
abnormal = False
for result in results:
boxes = result.boxes
for box in boxes:
cls = box.cls[0]
if int(cls) in [0, 1]:
abnormal = True
print(f"检测到异常行为:{model.names[int(cls)]}")
return abnormal
def send_alert(message):
msg = MIMEText(message)
msg["Subject"] = "监控系统报警"
msg["From"] = "[email protected]"
msg["To"] = "[email protected]"
with smtplib.SMTP("smtp.example.com", 587) as server:
server.starttls()
server.login("[email protected]", "your_password")
server.sendmail(msg["From"], [msg["To"]], msg.as_string())
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)
if detect_abnormal(results):
send_alert("监控画面中检测到异常行为!")
cv2.imshow("Smart Monitoring", results[0].plot())
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
5.2 交通流量统计系统
5.2.1 功能需求
- 统计道路上的车辆数量
- 分析车辆行驶方向
- 生成交通流量报告
5.2.2 代码实现
from ultralytics import YOLO
import cv2
import numpy as np
model = YOLO("yolov8n.pt")
cap = cv2.VideoCapture("traffic.mp4")
car_count = 0
bike_count = 0
roi = [(100, 200), (500, 200), (500, 400), (100, 400)]
while True:
ret, frame = cap.read()
if not ret:
break
results = model(frame)
for result in results:
boxes = result.boxes
for box in boxes:
x1, y1, x2, y2 = box.xyxy[0]
cls = box.cls[0]
if cv2.pointPolygonTest(np.array(roi, np.int32), ((x1 + x2) / 2, (y1 + y2) / 2), False) >= 0:
if int(cls) == 2:
car_count += 1
elif int(cls) == 3:
bike_count += 1
cv2.putText(frame, f"Cars: {car_count}", (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.putText(frame, f"Bikes: {bike_count}", (10, 70), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
cv2.imshow("Traffic Monitoring", frame)
if cv2.waitKey(1) & 0xFF == 27:
break
cap.release()
cv2.destroyAllWindows()
print(f"交通流量统计报告:")
print(f"汽车数量:{car_count}")
print(f"摩托车数量:{bike_count}")
六、常见问题与解决方案
6.1 安装与配置问题
Q: 安装 ultralytics 时出现依赖冲突
python -m venv yolov8_env
yolov8_env\Scripts\activate
source yolov8_env/bin/activate
pip install ultralytics
A: 确保已安装与 CUDA 版本匹配的 PyTorch:
nvcc --version
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
6.2 模型训练问题
Q: 训练时出现"Out of Memory"错误
- 减小批次大小(batch size)
- 使用更小的模型(如 yolov8n.pt)
- 减小输入图片尺寸(imgsz)
- 启用混合精度训练(amp=True)
- 数据集质量差:检查数据集标注是否准确
- 训练轮数不足:增加 epochs 参数
- 学习率设置不当:调整 lr0 参数
- 数据增强不足:启用更多数据增强策略
- 检查数据加载是否正确
- 调整学习率(通常需要降低学习率)
- 检查模型初始化是否正确
- 增加训练数据量
6.3 模型推理问题
- 使用更小的模型(如 yolov8n.pt)
- 减小输入图片尺寸
- 启用 FP16 量化
- 导出为 TensorRT 格式
- 使用 GPU 加速
- 模型不匹配:确保使用的模型与任务类型匹配
- 置信度阈值设置不当:调整 conf 参数
- 输入图片质量差:提高图片分辨率和清晰度
- 场景不匹配:使用更适合当前场景的模型
results = model("test.jpg", iou=0.5)
6.4 模型部署问题
A: 确保已安装 ONNX 和 ONNX Runtime:
pip install onnx onnxruntime
- 使用 nano 模型(yolov8n.pt)
- 启用 INT8 量化
- 导出为 CoreML 或 TensorFlow Lite 格式
- 优化输入图片尺寸
- 依赖版本是否匹配
- 模型文件是否完整
- 输入数据格式是否正确
- 部署环境是否支持 GPU 加速
七、更多资源
总结
通过这个教程,你已经学会了如何使用 Python 和 YOLOv8 进行目标检测。YOLOv8 是一个非常强大的工具,可以应用在很多领域,比如安防监控、自动驾驶、智能交通等等。
如果想学习更多关于 YOLOv8 的知识,可以访问官方文档和 GitHub 仓库,那里有更详细的教程和示例代码。
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online
- Base64 字符串编码/解码
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
- Base64 文件转换器
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online