Yolov5实时目标检测:在Python中使用OpenCV实现
2024.01.17 13:36浏览量:19简介:本文将介绍如何使用Python和OpenCV库实现Yolov5的实时目标检测。我们将一步步地展示如何设置环境、加载模型、处理实时视频流,并在屏幕上显示检测结果。
千帆应用开发平台“智能体Pro”全新上线 限时免费体验
面向慢思考场景,支持低代码配置的方式创建“智能体Pro”应用
首先,确保你已经安装了所有必要的库。你可以使用以下命令安装:
pip install torch torchvision
pip install opencv-python
pip install numpy
pip install tensorboard
pip install matplotlib
接下来,你需要下载Yolov5模型。你可以从这里下载预训练模型:https://github.com/ultralytics/yolov5。解压后,你会得到一个yolov5s.pt
文件,这是我们将在下一步中使用的模型。
现在,我们开始编写Python代码:
```python
import cv2
import torch
import numpy as np
import time
import os
from yolov5.utils.general import non_max_suppression, scale_coords
from yolov5.utils.torch_utils import select_device
from yolov5.models.experimental import attempt_load
加载模型
model = attempt_load(‘yolov5s.pt’, map_location=select_device(‘’))
设置为评估模式
model.eval()
初始化所有参数的均值和标准差,这些参数将在TensorBoard中跟踪
writer = SummaryWriter()
for m in model.modules():
if isinstance(m, Detect):
m.init_size(model.forward_img_size) # 设置初始图像大小
m.init_tracking(model) # 初始化跟踪参数
视频流路径(请根据你的实际情况修改)
cap = cv2.VideoCapture(‘rtsp://your_rtsp_stream’) # 使用你的RTSP流地址替换’your_rtsp_stream’
while True:
从视频流中读取一帧图像
ret, frame = cap.read()
if not ret: # 如果读取失败,则跳出循环
break
将图像从BGR转换为RGB格式,并缩放到模型的输入尺寸(默认为640x640)
img = frame.copy()[:, :, ::-1] # BGR to RGB (opencv reads as BGR)
img = torch.from_numpy(img).to(device) # 移动到指定的设备上(CPU或GPU)
img = img.float() / 255.0 # 归一化图像像素值到[0,1]区间
if img.ndimension() == 3: # 如果图像是单通道(灰度图)或三通道(RGB图)的,则将其扩展到四通道(RGBA)
img = img.unsqueeze(0) # 在新维度上添加批处理维度(batch dimension)
运行模型并获取预测结果(检测框、类别、分数等)
pred = model(img)[0] # 只获取第一个预测结果(如果有多个预测结果的话)
pred = non_max_suppression(pred, conf_thres=0.5, iou_thres=0.5) # 进行非极大值抑制操作,消除重叠的检测框,只保留最好的那个框
if len(pred): # 如果存在检测结果,则进行可视化显示和保存操作
for det in pred[0]: # 遍历每个检测结果(检测框、类别、分数等)
if det is not None and len(det): # 如果检测结果不为空并且长度不为零,则进行可视化显示和保存操作
det[:, :4] = scale_coords(img.shape[2:], det[:, :4], frame.shape).round() # 将检测框坐标从模型输入尺寸缩放到原始图像尺寸,并四舍五入到最接近的整数坐标值
for *xyxy, conf, cls in reversed(det): # 遍历每个检测框、类别和分数,进行可视化显示和保存操作(从最后一个开始是为了先显示在前的框)
c = int(cls) # 将类别索引转换为整数类型
label = f’{model.names[c]} {conf:.2f}’ # 根据类别和分数创建标签字符串
plot_one_box(xyxy, frame, label=label, color=colors(c, True), line_thickness=3) # 在

发表评论
登录后可评论,请前往 登录 或 注册