使用YOLO(You Only Look Once)进行实时视频流目标检测是一个常见的计算机视觉任务。YOLO因其快速的推理速度和较高的准确性,成为许多实时应用的理想选择。以下是完整的步骤,从环境搭建到实际部署,帮助你实现这一功能。
在开始之前,确保你的开发环境已经安装了必要的依赖项。
pip install torch torchvision opencv-python-headless numpy
如果需要GPU支持,安装特定版本的torch
和torchvision
,例如:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
YOLO有多个版本(如YOLOv3、YOLOv4、YOLOv5等),其中YOLOv5是最常用的版本之一。你可以从官方仓库下载预训练权重文件。
git clone https://github.com/ultralytics/yolov5.git
cd yolov5
YOLOv5提供了多种权重文件(如yolov5s.pt
、yolov5m.pt
等)。这里以yolov5s.pt
为例:
python detect.py --weights yolov5s.pt --img 640 --conf 0.4
以下是基于YOLOv5的完整代码示例,展示如何对实时视频流进行目标检测。
import cv2
from yolov5 import YOLOv5
# 加载YOLOv5模型
model = YOLOv5('yolov5s.pt', device='cuda') # 使用GPU加速
# 打开摄像头或读取视频文件
cap = cv2.VideoCapture(0) # 0表示默认摄像头
while True:
ret, frame = cap.read()
if not ret:
print("无法捕获视频流")
break
# 调整图像大小以匹配模型输入
img = cv2.resize(frame, (640, 640))
# 进行目标检测
results = model.predict(img)
# 解析检测结果
for result in results.xyxy[0]: # xyxy表示边界框坐标
x1, y1, x2, y2, conf, cls = result
label = f'{model.names[int(cls)]} {conf:.2f}'
cv2.rectangle(frame, (int(x1), int(y1)), (int(x2), int(y2)), (0, 255, 0), 2)
cv2.putText(frame, label, (int(x1), int(y1) - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
# 显示结果
cv2.imshow('YOLOv5 Detection', frame)
# 按下 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
以下是整个流程的Mermaid代码表示:
graph TD; A[开始] --> B[加载YOLO模型]; B --> C[打开视频流]; C --> D[逐帧读取视频]; D --> E[调整图像大小]; E --> F[进行目标检测]; F --> G[绘制边界框和标签]; G --> H[显示结果]; H --> I{是否继续?}; I -->|是| D; I -->|否| J[结束];
为了提高实时性,可以考虑以下优化策略:
conf
参数来减少计算量。yolov5n.pt
或yolov5s.pt
。conf
和iou
参数,或者使用更适合场景的自定义训练模型。