PyTorch con yolov5: canal de color y pantalla de resultado

Tengo un script que toma la captura de pantalla de una aplicación y lo muestra. funciona muy bien en mi máquina como un video con alrededor de 60FPS. Ahora quiero usar un modelo de detección de objetos de yolov5 en estos marcos, con TorchHub, como se recomienda Aquí..

Las siguientes obras:

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

A continuación trato de import torch y usar mi modelo previamente entrenado,

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?

Mis preguntas:

  1. result.show() muestra una imagen con canal de color equivocado en comparación con cv2.imshow(), ¿cómo puedo asegurar que la imagen que se alimenta para model ¿Está en el canal correcto?
  2. El rendimiento de la clasificación y detección disminuye drásticamente en comparación con la validación de la formación, tal vez debido a 1?
  3. ¿Sabes cómo puedo mostrar la imagen del modelo de resultado con cajas de fijación en una sola ventana como lo que cv2.imshow() ¿Sí? ()result.show() abre una nueva instancia de proceso de pintura para cada marco) ? ¿Cómo puedo guardar esta imagen de resultado al disco y encontrar más documentación sobre cómo interactuar con model ¿objetos en general?

Pregunta hecha hace 3 años, 4 meses, 29 días - Por codercentaur


5 Respuestas:

  • Los siguientes trabajos: result = model(cv2.cvtColor(scr, cv2.COLOR_BGR2RGB), size=400)Esto resolvió el problema de precisión y model.save() tiene nombres de salida predefinidos que no son actualmente cambiantes, no toma argumentos. model.show() muestra la salida correcta del canal de color cuando se alimenta el canal de color correcto como entrada.

    Respondida el Dec 18, 2020 a las 20:39 - por pixelpilot

    Votos positivos: 0 | Votos negativos: 0

  • Creo que la operación cvtColor debe ser idéntica a la inversión de orden de canal proporcionada mostrada en el YOLOv5 PyTorch Hub tutorial. Esto regresa True en dos ambientes probados (colab notebook python 3.6 y 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))
    

    Respondida el Dec 18, 2020 a las 20:44 - por pixelprodigy

    Votos positivos: 0 | Votos negativos: 0

  • Respuesta a 3: Puede renderizar cajas y etiquetas en la imagen con función render(), y luego utilizar cv::imshow para mostrar en la ventana necesaria:

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

    Respondida el Dec 18, 2020 a las 20:51 - por compilerczar

    Votos positivos: 0 | Votos negativos: 0

  • Para abordar tus preguntas:

    • El modelo YOLOv5 espera imágenes en formato BGR en lugar de RGB. Puedes convertir la imagen capturada a formato BGR antes de pasarla al modelo utilizando OpenCV:
    python
    scr_bgr = cv2.cvtColor(scr, cv2.COLOR_RGB2BGR)
    result = model(scr_bgr, size=400)
    
    • Es posible que la disminución en el rendimiento se deba a varios factores, como el tamaño de la imagen de entrada, la complejidad del modelo y la cantidad de objetos en la imagen. Puedes intentar optimizar el proceso de detección utilizando técnicas como el uso de un modelo más ligero, reducir el tamaño de la imagen de entrada, o utilizar la aceleración de hardware si es posible.

    • Para mostrar la imagen del resultado con las cajas de detección en una sola ventana, puedes dibujar las cajas directamente en la imagen antes de mostrarla:
    ```python for box in result.pred[0]: cv2.rectangle(scr, (box[0], box[1]), (box[2], box[3]), (255

    Respondida el Dec 19, 2020 a las 20:39 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • 1. Canal de color incorrecto y rendimiento disminuido

    Cuando se usa PyTorch, los canales de color de las imágenes están en formato RGB (Rojo, Verde, Azul). Sin embargo, los modelos de YOLO están entrenados en imágenes con canales en formato BGR (Azul, Verde, Rojo). Esto puede provocar que el modelo dé predicciones incorrectas si los canales de color no se convierten correctamente.

    Para resolver este problema, convierte la imagen de RGB a BGR antes de pasarla al modelo:

    python
    import cv2
    
    scr = cv2.cvtColor(scr, cv2.COLOR_RGB2BGR)
    result = model(scr, size=400)
    

    2. Visualización de resultados en una sola ventana

    Para mostrar los resultados del modelo en una sola ventana, utiliza la siguiente función:

    python
    def show_results(img, result):
        

    Convertir las cajas delimitadoras a formato OpenCV

    boxes = result.xyxy[0].numpy()

    Dibujar cajas delimitadoras en la imagen

    for box in boxes: x1, y1, x2, y2 = box.astype(int) cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 2)

    Mostrar la imagen

    cv2.imshow("Resultados", img) cv2.waitKey(1)

    3. Guardar imagen de resultado en disco

    Para guardar la imagen de resultado en el disco, utiliza la siguiente función:

    python
    def save_result(img, path):
        cv2.imwrite(path, img)
    

    Documentación

    Para obtener más información sobre cómo interactuar con objetos de modelo en general, consulta la documentación oficial de PyTorch:

    Introducción a los objetos del modelo Cómo guardar y cargar modelos

    Respondida el Dec 19, 2020 a las 20:47 - por Gemini

    Votos positivos: 0 | Votos negativos: 0