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.

No se puede importar la biblioteca cv2 con OpenVino.

Estoy intentando hacer una inferencia con OpenVino Model Optimizer como se detalla en el siguiente enlace: aquí.

Hasta ahora, el código que tengo se ejecuta sin instalar cv2, pero no puedo avanzar más porque al intentar importar cv2 constantemente se produce un error. El código es:

import openvino
from openvino.inference_engine import IECore, IENetwork 
import cv2

ie = IECore()

net =  ie.read_network(model='saved_model.xml', weights='saved_model.bin')

Esto se ejecuta sin el import de cv2. Sin embargo, cada vez que se incluye la importación de cv2, se produce el siguiente error:

File "/opt/intel/openvino_2021/python/python3.9/cv2/__init__.py", línea 129, en <module>
    bootstrap()
  File "/opt/intel/openvino_2021/python/python3.9/cv2/__init__.py", línea 112, en bootstrap
    import cv2
ImportError: dlopen(/opt/intel/openvino_2021.4.752/python/python3.9/cv2/python-3/cv2.so, 2): Symbol not found: _objc_alloc_init
  Referenced from: /opt/intel/openvino_2021.4.752/python/python3.9/cv2/python-3/../../../../opencv/lib/libopencv_videoio.4.5.dylib (which was built for Mac OS X 10.15)
  Expected in: /usr/lib/libobjc.A.dylib
 in /opt/intel/openvino_2021.4.752/python/python3.9/cv2/python-3/../../../../opencv/lib/libopencv_videoio.4.5.dylib

He intentado reducir la versión de cv2 a varias versiones anteriores, pero esto no parece ayudar. Se necesita cv2 para el método cv2.dnn.blobFromImage que estoy intentando usar en este script.

¿Alguien ha visto este problema antes? No estoy seguro de cómo interpretar este mensaje de error.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que el mensaje de error está relacionado con un símbolo faltante (_objc_alloc_init) en la biblioteca opencv_videoio.4.5.dylib, la cual fue construida para Mac OS X 10.15. Una posible solución es actualizar la versión de OpenCV a una versión compatible con la versión instalada de OpenVino. Puedes intentar instalar una versión diferente de OpenCV que sea compatible con tu máquina y la versión de OpenVino. Otra posible solución es construir OpenCV desde el código fuente con las banderas de configuración correctas.

    Si las soluciones anteriores no funcionan, puedes intentar usar un método diferente para crear el blob de la imagen de entrada. En lugar de utilizar cv2.dnn.blobFromImage, puedes utilizar el siguiente código para crear el blob de entrada:

    import numpy as np
    
    # Cargar la imagen de entrada
    imagen = cv2.imread('imagen.jpg')
    
    # Redimensionar la imagen al tamaño de entrada requerido por el modelo
    imagen_redimensionada = cv2.resize(imagen, (ancho_entrada, alto_entrada))
    
    # Convertir la imagen en un arreglo numpy en el formato (tamaño_lote, canales, alto, ancho)
    blob_entrada = np.transpose(imagen_redimensionada, (2, 0, 1))
    blob_entrada = np.expand_dims(blob_entrada, axis=0)
    

    Este código carga primero una imagen de entrada utilizando cv2.imread, la redimensiona al tamaño de entrada requerido por el modelo y luego la convierte en un arreglo numpy en el formato (tamaño_lote, canales, alto, ancho) utilizando np.transpose y np.expand_dims. Luego puedes utilizar este blob de entrada para ejecutar la inferencia con OpenVino.

    Otra opción es utilizar el método cv2.dnn.blobFromImages, el cual crea un blob a partir de una lista de imágenes. Aquí tienes un ejemplo:

    import numpy as np
    
    # Cargar las imágenes de entrada
    imagen1 = cv2.imread('imagen1.jpg')
    imagen2 = cv2.imread('imagen2.jpg')
    
    # Redimensionar las imágenes al tamaño de entrada requerido por el modelo
    imagen_redimensionada1 = cv2.resize(imagen1, (ancho_entrada, alto_entrada))
    imagen_redimensionada2 = cv2.resize(imagen2, (ancho_entrada, alto_entrada))
    
    # Crear una lista de imágenes redimensionadas
    lista_imagenes = [imagen_redimensionada1, imagen_redimensionada2]
    
    # Convertir la lista de imágenes en un arreglo numpy en el formato (tamaño_lote, canales, alto, ancho)
    blob_entrada = cv2.dnn.blobFromImages(lista_imagenes, scalefactor=1.0, size=(ancho_entrada, alto_entrada),
                                        mean=(0, 0, 0), swapRB=True, crop=False)
    

    Este código carga primero dos imágenes de entrada utilizando cv2.imread, las redimensiona al tamaño de entrada requerido por el modelo y luego crea una lista de imágenes redimensionadas. Luego utiliza cv2.dnn.blobFromImages para crear un blob a partir de la lista de imágenes. El blob está en el formato (tamaño_lote, canales, alto, ancho), donde tamaño_lote es el número de imágenes en la lista. Luego puedes utilizar este blob de entrada para ejecutar la inferencia con OpenVino.

Comments are closed.