我将我的网络摄像头设置为我的model.predict()函数的输入,并希望在函数检测到某个对象时触发一些代码。然而,当使用网络摄像头时,model.predict()函数似乎永远不会终止,因此这是不可能的。我只是想知道这个问题的解决方案。
from ultralytics import YOLO
from ultralytics.yolo.v8.detect.predict import DetectionPredictor
import cv2
print('hi')
model = YOLO("C:/Users/User/Downloads/best.pt")
outs = model.predict(source="0", show=True)
print('hey')
# hi gets printed but not hey
如果我在预测函数中包含参数verbose=true,则我需要的信息被打印到终端,但我不知道如何在变量中访问该信息以触发更多代码。也许多线程可以帮助,但肯定会有一个更简单的方法?
问题不在你的代码中,问题在Ultralytics包中使用的hydra包中。
它正在处理"0"传递给"source"作为空值,因此没有获得任何输入并对默认资产进行预测。如果您尝试使用任何本地图像或web上的图像,代码将正常工作。
你可以试着这样做:
model = YOLO("model.pt")
camera = cv2.VideoCapture(0)
img_counter = 0
while True:
ret, frame = camera.read()
if not ret:
print("failed to grab frame")
break
cv2.imshow("test", frame)
k = cv2.waitKey(1)
if k%256 == 27:
# ESC pressed
print("Escape hit, closing...")
break
elif k%256 == 32:
# SPACE pressed
img_path = "path/opencv_frame_{}.png".format(img_counter)
cv2.imwrite(img_path, frame)
outs = model.predict(img_path)
img_counter += 1
camera.release()
我们在这里做的是,我们试图将图像写入一个文件,然后对该文件进行推断。
如果你想在检测时保存,可以尝试以下操作:
inputs = [frame] # or if you have multiple images [frame1, frame2, etc.]
results = model(inputs) # list of Results objects -> perform inference using the model
if results:
cv2.imwrite(img_path, frame)
for result in results:
boxes = result.boxes # Boxes object for bbox outputs
# Do something with the bounding boxes
从YOLOv8模型获取结果并将其可视化
from ultralytics import YOLO
import torch
import cv2
import numpy as np
import pathlib
import matplotlib.pyplot as plt
img = cv2.imread("BUS.jpg")
model = YOLO("best.pt")
results = model(img)
res_plotted = results[0].plot()
您还可以从下面的代码
中获得box, mask和prods。for result in results:
boxes = result.boxes # Boxes object for bbox outputs
masks = result.masks # Masks object for segmentation masks outputs
probs = result.probs # Class probabilities for classification outputs