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:
result.show()
muestra una imagen con canal de color equivocado en comparación concv2.imshow()
, ¿cómo puedo asegurar que la imagen que se alimenta paramodel
¿Está en el canal correcto?- 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?
- ¿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 conmodel
¿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 ymodel.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 utilizarcv::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:
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