引自免费微信小程序:皆我百晓生
要实现YOLOv5在屏幕上显示并识别特定对象(例如:边框),您需要执行以下步骤:
- 加载预训练的YOLOv5模型。
- 为模型指定一个输入输出窗口。
- 在主循环中更新图像,并运行模型进行预测。
以下是Python代码示例:
import cv2
from PIL import Image
import numpy as np
import os
import torch
from torchvision.models.detection.faster_rcnn import FastRCNNPredictor
from models.common import DetectMultiBackend
from utils.datasets import LoadImages, LoadStreams
from utils.general import (LOGGER, check_img_size, non_max_suppression, scale_coords,
xyxy2xywh)
from utils.plots import Annotator, colors
from utils.torch_utils import select_device, time_synchronized
# 配置YOLOv5模型
device = torch.device("cuda")
model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
model.eval()
model.to(device).eval()
# 指定输入输出窗口
window_name = 'YOLOv5'
cv2.namedWindow(window_name, cv2.WND_PROP_VISIBLE)
# 创建一个视频流对象
cap = cv2.VideoCapture(r'path_to_your_video_file.mp4') # 更改为您的视频文件路径
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 使用YOLOv5模型进行预测
results = model(frame)
# 更新图像
img = results.render()
# 将结果转换回PIL格式
pil_img = Image.fromarray(np.uint8(img))
# 从PIL图片读取像素值
pixel_values = np.array(pil_img)
# 转换为numpy数组以便处理
pixel_values = np.ascontiguousarray(pixel_values.transpose((1, 2, 0)))
# 转换为PyTorch张量
tensor = torch.from_numpy(pixel_values).to(device)
# 进行预测
with torch.no_grad():
outputs = model([tensor])[0]
# 获取检测框坐标信息
boxes = outputs['boxes'].cpu().numpy()
scores = outputs['scores'].cpu().numpy()
classes = outputs['labels'].cpu().numpy()
# 对于每个框,计算其宽度、高度
widths = boxes[:, 2] - boxes[:, 0] + 1
heights = boxes[:, 3] - boxes[:, 1] + 1
# 计算总面积
total_area = widths * heights
# 选择得分最高的框
max_scores = scores.max(axis=1)
selected_boxes = boxes[max_scores > 0.5, :].astype(int)
# 对所有选定框应用非极大抑制
result_boxes = scale_coords(results.image_shape[:2], selected_boxes, img.shape[:2]).round()
# 将筛选后的框绘制到原始图像上
for box in result_boxes:
x, y, w, h = box.astype(int)
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
cv2.putText(frame, f'{classes[y, x]} {max_scores[y, x]:.2f}', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)
# 显示最终结果
cv2.imshow(window_name, frame)
# 检查是否按下Esc键退出程序
key = cv2.waitKey(1)
if key == 27: # Esc键
break
# 清理资源
cap.release()
cv2.destroyAllWindows()
这段代码首先加载了预训练的YOLOv5模型,然后创建了一个视频流对象。当视频流中的帧被读取时,它会使用YOLOv5模型对每一帧进行预测。对于每一个框,它将计算其宽度、高度,以及与图像大小的比例。然后,根据这些信息,它将筛选出最高得分的框,并将其应用于非极大抑制算法。最后,它将在原图像上绘制筛选出的框,并显示给用户。
请注意,这个例子是基于YOLOv5的,如果您使用的是其他版本的YOLOv5,可能需要调整一些设置。此外,确保安装了必要的库(opencv-python
, Pillow
, torchvision
, pyyaml
等)。