提问人:Andrei 提问时间:4/24/2023 最后编辑:Andrei 更新时间:4/24/2023 访问量:329
经过自定义训练的 YOLOv7 可逐帧检测视频中的对象
Custom trained YOLOv7 detect object frame by frame in a video
问:
我想逐帧处理视频,并针对每一帧处理视频,以使用已经自定义训练的 YOLOv7 模型检测某个对象是否出现。我看到这对于一个图像或一组图像来说非常简单,因为在加载模式后,您可以使用图像的路径,然后您可以提取重要的特征,如左上角、右下角、置信度和类,如以下代码所示:
model=torch.hub.load('WongKinYiu/yolov7','custom','best.pt',force_reload=True)
res=model(img_path)
df=res.pandas().xyxy[0]
但是我不知道如何将此模型用于使用 opencv 模块在变量中读取的图像:
import cv2
cap=cv2.VideoCapture('iohannis1.mp4')
while cap.isOpened():
ret,frame=cap.read()
if not ret:
break
cv2.imshow('Frame',frame)
if cv2.waitKey(1) & 0xFF==ord('q'):
break
cap.release()
cv2.destroyAllWindows()
在这种情况下,我想将模型应用于框架,并获取包含重要数据的列表,例如左上角、右下角、置信度和类。一个非常虚拟的选择是保存每一帧,然后将该帧的路径提供给模型,但我认为这将非常耗时。而且我不想使用 yolov7 的检测脚本,因为该选项非常受限,它会解析视频,在感兴趣的区域周围制作正方形并保存视频。我想对从每一帧获得的数据进行进一步处理。
我可以使用火炬完成此任务,还是应该将模型转换为其他类型并使用其他框架(如 tensorflow 或 onnx)加载该模型?
我试图转换模型并使用它,但我没有成功使用它。我尝试将模型用于加载的图像和图像的路径,我注意到有 2 个不同的结果。对于路径来说,这是一个很好的结果,而对于加载的图像来说,这是一个糟糕的结果。
import torch
import cv2
model=torch.hub.load('WongKinYiu/yolov7','custom','best.pt')
source_path="img_iohannis1.jpg"
img=cv2.imread(source_path)
res1=model(source_path)
res2=model(img)
df1=res1.pandas().xyxy[0]
df2=res2.pandas().xyxy[0]
print("Result 1 from image path is")
print(df1)
print("Result 2 from loaded image is")
print(df2)
答: 暂无答案
评论
res = model(frame)
res = model([frame])
batch_size x rgb_channels x height x width