PyTorch与yolov5:彩色通道和结果显示

ergxz8rk  于 2023-08-05  发布在  其他
关注(0)|答案(3)|浏览(154)

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

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')

字符串
下面我尝试import torch并使用我之前训练的模型,

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?


我的问题:
1.与cv2.imshow()相比,result.show()显示的图像具有错误的颜色通道,如何确保馈送到model的图像处于正确的通道?
1.分类和检测的性能急剧下降相比,训练验证,也许是因为1?
1.你知道如何像cv2.imshow()一样在一个窗口中显示带有边界框的结果模型图像吗?(result.show()为每个帧打开一个新的Paint进程示例)?如何将此结果图像保存到磁盘,并找到更多关于如何与model对象交互的文档?

06odsfpq

06odsfpq1#

以下方法起作用:result = model(cv2.cvtColor(scr, cv2.COLOR_BGR2RGB), size=400)这解决了精度问题,model.save()具有当前不可更改的预定义输出名称,它没有参数。model.show()示出了当馈送正确的颜色通道作为输入时的正确的颜色通道输出。

xv8emn3q

xv8emn3q2#

我相信cvtColor操作应该与YOLOv5 PyTorch Hub tutorial中提供的通道顺序反转相同。这在两个测试环境中返回True(colab notebook python 3.6和MacOS python 3.9)

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))

字符串

wd2eg0qa

wd2eg0qa3#

答案3:您可以使用函数render()渲染图像上的框和标签,然后使用cv::imshow在需要的窗口中显示:

renderedResult = result.render()
cv2.imshow("Result", renderedResult[0])

字符串

相关问题