es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿Cómo puedo recuperar la imagen resultante como una matriz (numpy array) a partir de los resultados devueltos por yolov5 en pytorch?

He estado aprendiendo cómo implementar yolo pre-entrenado usando pytorch, y quiero mostrar la imagen de salida usando el método cv2.imshow() de openCV.
La imagen de salida se puede mostrar usando la función .show() y guardarla usando la función .save(), pero yo quiero mostrarla usando cv2.imshow(), y para eso necesitaría la imagen en forma de una matriz numpy.
Desconozco cómo hacer eso o si es posible.
Aquí está el código para ello.

import torch

model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
imgs = ['img.png']  # lote de imágenes

results = model(imgs)

results.print()
results.show()  # o .save(), muestra/guarda la misma imagen con cajas delimitadoras alrededor de los objetos detectados

<h1>¿Mostrar 'results' usando el método cv2.imshow() de openCV?</h1>

results.xyxy[0]  # predicciones de img1 (tensor)
print(results.pandas().xyxy[0])  # predicciones de img1 (pandas)

Una forma más larga de resolver este problema sería crear nosotros mismos las cajas delimitadoras sobre los objetos detectados en la imagen y mostrarla, pero considérame perezoso :p.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para mostrar la imagen de salida utilizando el método cv2.imshow() de OpenCV, necesitamos convertir la imagen de un formato de Image de PIL a un arreglo de numpy. Esto se puede hacer utilizando el método numpy() de Image de PIL. Luego podemos usar cv2.imshow() para mostrar la imagen. Aquí está el código modificado:

    import torch
    import cv2
    import numpy as np
    
    model = torch.hub.load('ultralytics/yolov5', 'yolov5s', pretrained=True)
    imgs = ['img.png']  # lote de imágenes
    
    results = model(imgs)
    
    results.print()
    results.show()  # o .save(), muestra/guarda la misma imagen con cuadros delimitadores alrededor de los objetos detectados
    
    # ¿Mostrar 'results' utilizando el método cv2.imshow() de OpenCV?
    
    img = np.array(results.render()[0])  # convertir Image de PIL a arreglo de numpy
    cv2.imshow("Imagen", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    
    

    Aquí, el método render() del objeto results devuelve una Image de PIL. Convertimos esto a un arreglo de numpy utilizando el método np.array() y luego mostramos la imagen utilizando el método cv2.imshow(). No olvides llamar a cv2.destroyAllWindows() después de que se muestre la imagen.

Comments are closed.