Python 带有yolov5的Pytork:彩色通道和结果显示

Python 带有yolov5的Pytork:彩色通道和结果显示,python,opencv,pytorch,yolo,Python,Opencv,Pytorch,Yolo,我有一个脚本,可以抓取应用程序的屏幕截图并显示出来。它在我的机器上运行得很好,就像一个每秒60帧左右的视频。现在我想在这些帧上使用yolov5对象检测模型,如建议的那样,使用TorchHub 以下工作: import os os.getcwd() from PIL import ImageGrab import numpy as np import cv2 import pyautogui import win32gui import time from mss import mss from

我有一个脚本,可以抓取应用程序的屏幕截图并显示出来。它在我的机器上运行得很好,就像一个每秒60帧左右的视频。现在我想在这些帧上使用yolov5对象检测模型,如建议的那样,使用TorchHub

以下工作:

import os
os.getcwd()
from PIL import ImageGrab
import numpy as np
import cv2
import pyautogui
import win32gui
import time
from mss import mss
from PIL import Image
import tempfile
os.system('calc')
sct = mss()
xx=1
tstart = time.time()
while xx<10000:
    hwnd = win32gui.FindWindow(None, 'Calculator')
    left_x, top_y, right_x, bottom_y = win32gui.GetWindowRect(hwnd)
    #screen = np.array(ImageGrab.grab( bbox = (left_x, top_y, right_x, bottom_y ) ) )
    bbox = {'top': top_y, 'left': left_x, 'width': right_x-left_x, 'height':bottom_y-top_y }
    screen = sct.grab(bbox)
    scr = np.array(screen)
    
    cv2.imshow('window', scr)
    if cv2.waitKey(25) & 0xFF == ord('q'):
        cv2.destroyAllWindows()
        break
    xx+=1
cv2.destroyAllWindows()
tend = time.time()
print(xx/(tend-tstart))
print((tend-tstart))
os.system('taskkill /f /im calculator.exe')
我的问题是:

  • result.show()
    显示与
    cv2.imshow()
    相比颜色通道错误的图像,如何确保馈送至
    型号的图像位于正确的通道上
  • 与训练验证相比,分类和检测的性能急剧下降,可能是因为1
  • 您知道如何在单个窗口中显示带有边界框的结果模型图像,如
    cv2.imshow()
    所做的那样吗?(
    result.show()
    为每个帧打开一个新的绘制过程实例)?如何将此结果图像保存到磁盘,并查找有关如何与
    模型
    对象交互的更多文档

  • 以下工作:
    result=model(cv2.cvtColor(scr,cv2.COLOR\u BGR2RGB),size=400)
    这解决了准确性问题,并且
    model.save()
    具有预定义的输出名称,这些名称当前不可更改,不接受任何参数。
    model.show()
    在输入正确的颜色通道时显示正确的颜色通道输出。

    我认为cvtColor操作应该与YOLOv5 PyTorch Hub中显示的提供的通道顺序反转相同。在两个测试环境(colab笔记本电脑python 3.6和MacOS python 3.9)中,返回
    True

    screen = sct.grab(bbox)
    scr = np.array(screen)    
    result = model(scr, size=400)  
    result.save("test.png") #this gives a TypeError: save() takes 1 positional argument but 2 were given
    result.show() #this opens a new Paint instance for every frame instead of keeping the same window. 
    # The shown image is also in a wrong color channel
    scr = cv2.imread("test.png")
    # How can I use the `result` as argument to cv2.imshow(),
    # without saving to disk if possible?
    
    import cv2
    import numpy as np
    
    file = 'data/images/bus.jpg'
    im1 = cv2.imread(file)[:, :, ::-1]
    im2 = cv2.cvtColor(cv2.imread(file), cv2.COLOR_BGR2RGB)
    print(np.allclose(im1, im2))