经过自定义训练的 YOLOv7 可逐帧检测视频中的对象

Custom trained YOLOv7 detect object frame by frame in a video

提问人:Andrei 提问时间:4/24/2023 最后编辑:Andrei 更新时间:4/24/2023 访问量:329

问:

我想逐帧处理视频,并针对每一帧处理视频,以使用已经自定义训练的 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)

enter image description here

Python OpenCV PyTorch 计算机视觉 Yolov7

评论

0赞 Christoph Rackwitz 4/24/2023
你还没有尝试过,或者,是吗?res = model(frame)res = model([frame])
0赞 Andrei 4/24/2023
我为图像尝试了这个,这个 approch 有点问题,因为它为同一图像提供了不同的结果。当我使用图像的路径时,它给出了很好的结果,但是当我使用加载的图像时,它给出了非常糟糕的结果(大多数情况下它什么也检测到)。
1赞 Christoph Rackwitz 4/25/2023
在对 pytorch 或 torchhub 了解不多的情况下,也许这件事被 OpenCV 的 BGR 颜色通道顺序所困扰,或者它可能想要转置输入(从 HWC 到 NCHW/NHWC)
0赞 Brock Brown 4/26/2023
@ChristophRackwitz 这听起来对,实际上,pytorch 中的图像应该格式化为 .discuss.pytorch.org/t/dimensions-of-an-input-image/19439batch_size x rgb_channels x height x width

答: 暂无答案