YOLO(You Only Look Once)是由Joseph Redmon等人提出的单阶段目标检测算法,自2016年发布以来经历了多次迭代:
YOLOv8在保持YOLO系列一贯的高速检测特性的同时,在精度和易用性上有了显著提升:
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 |
# 安装YOLOv8
pip install ultralytics
# 安装OpenCV
pip install opencv-python
# 安装PyTorch(可选,用于自定义训练)
pip install torch torchvision
# 安装其他依赖
pip install numpy matplotlib pillow
from ultralytics import YOLO
# 加载模型
model = YOLO("yolov8n.pt")
# 打印模型信息
model.info()
如果输出模型的详细信息,则说明安装成功。
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 inenumerate(results):
result.save(filename=f"result_{i}.jpg")
# 视频文件检测
results = model("test.mp4", save=True)
# 实时摄像头检测
results = model(0, show=True, save=True)# 0表示默认摄像头
YOLOv8支持实例分割任务,可以同时检测目标并分割其轮廓:
# 加载分割模型
model = YOLO("yolov8n-seg.pt")
# 分割检测
results = model("test.jpg")
# 保存分割结果
results[0].save(filename="segment_result.jpg")
YOLOv8可以检测人体关键点,用于姿态分析:
# 加载姿态估计模型
model = YOLO("yolov8n-pose.pt")
# 姿态检测
results = model("person.jpg")
# 保存姿态估计结果
results[0].save(filename="pose_result.jpg")
YOLOv8还支持图像分类任务:
# 加载分类模型
model = YOLO("yolov8n-cls.pt")
# 图像分类
results = model("cat.jpg")
# 打印分类结果
print(results[0].probs)# 概率分布
print(results[0].probs.top1)# 最高置信度类别
YOLOv8支持COCO格式的数据集,数据集结构如下:
dataset/
├── images/
│ ├── train/
│ └── val/
└── labels/
├── train/
└── val/
# 加载模型
model = YOLO("yolov8n.pt")
# 训练模型
results = model.train(
data="dataset.yaml",# 数据集配置文件
epochs=100,# 训练轮数
batch=16,# 批次大小
imgsz=640,# 输入图片尺寸
device="cuda:0",# 使用GPU训练
project="my_project",# 项目名称
name="exp1"# 实验名称
)
# 评估模型
results = model.val()
# 打印评估结果
print(results.box.map)# mAP@0.5
print(results.box.map50)# mAP@0.5:0.95
print(results.box.map75)# mAP@0.75
# 导出为ONNX格式
model.export(format="onnx")
# 导出为TensorRT格式
model.export(format="engine")
# 导出为CoreML格式
model.export(format="coreml")
# 导出量化模型
model.export(format="onnx", int8=True)# 8位量化
model.export(format="onnx", fp16=True)# 16位浮点量化
# 自定义NMS阈值
results = model("test.jpg", conf=0.5, iou=0.7)
# 只检测特定类别
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:# 只保留置信度>0.7的结果
print(f"{model.names[int(box.cls[0])]}: {box.conf[0]:.2f}")
# 多GPU训练
results = model.train(
data="dataset.yaml",
epochs=100,
batch=32,
device=[0,1]# 使用GPU 0和1
)
# 混合精度训练
results = model.train(
data="dataset.yaml",
epochs=100,
amp=True# 自动混合精度
)
from ultralytics import YOLO
import cv2
import time
import smtplib
from email.mime.text import MIMEText
# 加载模型
model = YOLO("yolov8n.pt")
# 打开摄像头
cap = cv2.VideoCapture(0)
# 异常行为检测函数
defdetect_abnormal(results):
abnormal =False
for result in results:
boxes = result.boxes
for box in boxes:
cls = box.cls[0]
# 检测火灾(类别0)和烟雾(类别1)
ifint(cls)in[0,1]:
abnormal =True
print(f"检测到异常行为:{model.names[int(cls)]}")
return abnormal
# 报警函数
defsend_alert(message):
msg = MIMEText(message)
msg["Subject"]="监控系统报警"
msg["From"]="your_email@example.com"
msg["To"]="recipient@example.com"
with smtplib.SMTP("smtp.example.com",587)as server:
server.starttls()
server.login("your_email@example.com","your_password")
server.send_message(msg)
# 主循环
whileTrue:
ret, frame = cap.read()
ifnot ret:
break
# 检测物体
results = model(frame)
# 检测异常行为
if detect_abnormal(results):
send_alert("监控画面中检测到异常行为!")
# 显示结果
cv2.imshow("Smart Monitoring", results[0].plot())
# 按ESC键退出
if cv2.waitKey(1)&0xFF==27:
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
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)]
# 主循环
whileTrue:
ret, frame = cap.read()
ifnot 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:
ifint(cls)==2:# 汽车
car_count +=1
elifint(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)
# 按ESC键退出
if cv2.waitKey(1)&0xFF==27:
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
# 生成报告
print(f"交通流量统计报告:")
print(f"汽车数量:{car_count}")
print(f"摩托车数量:{bike_count}")
A: 尝试使用虚拟环境隔离依赖:
# 创建虚拟环境
python -m venv yolov8_env
# 激活虚拟环境
# Windows
yolov8_env\Scripts\activate
# Linux/Mac
source yolov8_env/bin/activate
# 安装依赖
pip install ultralytics
A: 可以手动下载模型文件并放置在~/.ultralytics/models/目录下。模型下载地址:https://github.com/ultralytics/assets/releases
A: 确保已安装与CUDA版本匹配的PyTorch:
# 查看CUDA版本
nvcc --version
# 安装对应版本的PyTorch
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
A: 尝试以下解决方案:
A: 可能的原因和解决方案:
A: 尝试以下解决方案:
A: 尝试以下优化策略:
A: 可能的原因和解决方案:
A: 调整NMS阈值(iou参数):
results = model("test.jpg", iou=0.5)# 降低iou阈值可以减少重叠
A: 确保已安装ONNX和ONNX Runtime:
pip install onnx onnxruntime
A: 尝试以下优化策略:
A: 检查以下内容:
A: 请确保你的图片文件和Python代码在同一个文件夹里,或者在代码中写清楚图片的完整路径,比如:image = cv2.imread("C:/Users/你的名字/Pictures/test.jpg")
A: 可以尝试使用更小的模型,比如yolov8n.pt(nano),它是最快的模型。如果需要更高的精度,可以使用yolov8s.pt(small)、yolov8m.pt(medium)等。
A: 只需要把代码中的cv2.imread("test.jpg")换成cv2.VideoCapture("test.mp4"),然后循环读取视频帧即可。
通过这个教程,你已经学会了如何使用Python和YOLOv8进行目标检测。YOLOv8是一个非常强大的工具,可以应用在很多领域,比如安防监控、自动驾驶、智能交通等等。
如果你想学习更多关于YOLOv8的知识,可以访问官方文档和GitHub仓库,那里有更详细的教程和示例代码。