Coral USB inference no funciona en Windows 10 (ValueError: Failed to load delegate from edgetpu.dll)

Actualización: Parece que el error se ha solucionado con la versión del instalador del 24 de octubre de 2022.

Siguiendo las instrucciones de instalación de Windows en el Página web del coralMe ha aparecido el siguiente error:

Max@Rhea MINGW64 /c/Business-2022/pi3g e.K/Marketing/2022 Präsentation für Ric/Coral on Windows/coral/pycoral (master)
$ pyenv exec python examples/classify_image.py \N - - modelo datos_de_prueba
> --model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite \N-
> --labels test_data/inat_bird_labels.txt \N -input test_data/inat_bird_quant_edgetpu.tflite
> --input test_data/parrot.jpg
Traceback (most recent call last):
  File "C:\sers\Max\.pyenv\pyenv-win\versions\3.9.13\lib\site-packages\tflite_runtime\interpreter.py", line 160, in load_delegate
    delegate = Delegate(library, options)
  File "C:\Users\Max\.pyenv\pyenv-win\versions\3.9.13\lib\site-packages\tflite_runtime\interpreter.py", line 119, in __init__
    raise ValueError(capture.message)
ValueError

Durante el manejo de la excepción anterior, se produjo otra excepción:

Traceback (most recent call last):
  File "C:\Business-2022\pi3g e.K\Marketing\2022 Präsentation für Ric\Coral on Windows\coral\pycoral\examples\classify_image.py", line 121, in .
    main()
  File "C:\Business-2022\pi3g e.K\Marketing\2022 Präsentation für Ric\Coral on Windows\coral\pycoral\examples\classify_image.py", line 71, in main
    intérprete = make_interpreter(*args.model.split('@'))
  File "C:\Users\Max\.pyenv\pyenv-win\versions\3.9.13\lib\site-packages\pycoral\utils\edgetpu.py", line 87, in make_interpreter
    delegates = [load_edgetpu_delegate({'device': device} if device else {})]
  File "C:\sers\Max\.pyenv\pyenv-win\versions\3.9.13\lib\site-packages\coral\utils\edgetpu.py", line 52, in load_edgetpu_delegate
    return tflite.load_delegate(_EDGETPU_SHARED_LIB, options or {})
  File "C:\Users\Max\.pyenv\pyenv-win\versions\3.9.13\lib\site-packages\tflite_runtime\interpreter.py", line 162, in load_delegate
    raise ValueError('Fallo al cargar el delegado de {}\n{}'.format(
ValueError: Fallo al cargar el delegado de edgetpu.dll

La última línea, "ValueError: Fallo al cargar el delegado de edgetpu.dll" suele significar que no se ha podido reconocer ningún dispositivo USB de Coral. (Si desenchufa su dispositivo USB de Coral, debería seguir viendo el mismo error).

He podido averiguar que se trata de un error (creo) en el script de instalación para Windows.

El error está presente en el más reciente dos versiones de libedgetpu.

El script de instalación, que el equipo de Coral envía y que yo ejecuté se llama instalar.bat

La línea 52 de este script (puedes abrirlo con un editor de texto, por ejemplo el Notepad++) dice

¡start /wait msiexec /i "%ROOTDIR%\third_party\usbdk\UsbDk_*.msi" /quiet /qb! /norestart

Se supone que esto instala UsbDk. Y esto debe se ven así:

Entonces - se abre un instalador externo para UsbDk, y lo instala. Durante la pantalla de seguridad de Windows (UAC, control de cuentas de usuario, pantalla) algo sobre RedHat se menciona.

Supongo que esta aplicación nunca se abre ni se instala en tu ordenador, ¿verdad?

Pero es necesario por la pila de aplicaciones USB de Coral, se trata de un software especial que permite a las aplicaciones acceder a dispositivos USB personalizados.

Aquí tengo una buena y una mala noticia para ti.

Empecemos por las buenas noticias: he conseguido crear una solución para ello.

La solución para que UsbDk no se instale / Fallo al cargar el delegado de edgetpu.dll

Actualización 5.11.2022:

¡Buenas noticias! Hemos publicado un archivo ZIP del instalador de tiempo de ejecución parcheadoque resuelve dos errores y le permite instalar el último tiempo de ejecución de Coral contenida en 20220308.

Este funciona con el tiempo de ejecución más reciente, ya que también cambia libusb-1.0.dll a una versión que funciona (tomada de un paquete anterior). Hemos probado esto en Windows 8.1 y Windows 10. Este paquete parcheado resuelve el error "Failed to delegate", y también los fallos de segmentación.

Informa de cualquier problema en los comentarios de abajo.

contenido histórico que explica los antecedentes

Antes de que intentes el arreglo, lee también las malas noticias. (El arreglo funciona, pero hay un problema diferente ¡que probablemente sólo Google puede resolver! Lo recomiendo: Ir a la tercera solución "La mejor noticia" por ahora)

Sólo para estar seguros, la primera ejecución desinstalar.bat

Sobrescriba esta línea (línea 52) con dos nuevas líneas como sigue:

¡:: start /wait msiexec /i "%ROOTDIR%\third_party\\Nusbdk\UsbDk_*.msi" /quiet /qb! /norestart
¡start /wait msiexec /i "%ROOTDIR%\third_party\usbdk\UsbDk_1.0.22_x64.msi" /quiet /qb! /norestart

Los dos puntos dobles comentarán la línea original (prefiero dejar las líneas originales en el código para estas correcciones, para que podamos ver lo que se ha modificado)

Ahora, cuando se ejecuta instalar.bat haciendo doble clic en él, instalará UsbDk.

Instalación de UsbDk

Nota: mientras se instala UsbDk, puedo oír el conocido sonido de desenchufar/volver a enchufar el USB de Windows.

Eliminación de UsbDk

Tenga en cuenta que el desinstalar.bat tiene el mismo problema. Edite la línea 51

¡:: start /wait msiexec /x "%ROOTDIR%\third_party\\Nusbdk\UsbDk_*.msi" /quiet /qb! /norestart
¡start /wait msiexec /x "%ROOTDIR%\third_party\usbdk\UsbDk_1.0.22_x64.msi" /quiet /qb! /norestart

Esto le permitirá ejecutar el instalador de UsbDk para ejecutar la desinstalación.

Alternativamente, también puede (probablemente sin efectos secundarios) vaya al directorio third_party/usbdk dentro de la carpeta edgetpu Runtime, y haga clic con el botón derecho en UsbDk para desinstalarlo:

Una vez más, durante la desinstalación debería verse el instalador de UsbDk y también debería oírse el característico sonido de "desconexión" del USB que hace Windows.

La mala noticia: fallo de segmentación

El error pasa a ser un fallo de segmentación.

$ pyenv exec python examples/classify_image.py --model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels test_data/inat_bird_labels.txt --input test_data/parrot.jpg
Fallo de segmentación

Nota - También escucho un sonido de desconexión del USB de Windows cuando esto se ejecuta. Esto es de esperar - El dispositivo de Coral se accede en un modo en primer lugar, como yo entiendo para empujar la información de inferencia en él, y luego se supone que se desconecta.

Este fallo de segmentación es un paso adelante, aunque no te lo parezca. Posiblemente alguna depuración más podría resolver este problema, o posiblemente el equipo de Google pueda investigarlo.

He añadido mis ideas a este hilo de GitHub, esperemos que eso pueda orientar a los desarrolladores de Google en la dirección correcta...

Si has probado esto y te funciona, ¡deja un comentario abajo!

La mejor noticia: ¡una versión de Coral Runtime que funciona!

Hay una versión del Coral Runtime que no tiene este error (error de instalación de UsbDk descrito anteriormente), y que tampoco tiene el fallo de segmentación.

El único inconveniente es que esta versión sólo es compatible con la versión 13 del tiempo de ejecución (por lo que faltarán algunas características de la versión 14).

https://coral.ai/software/#edgetpu-runtime

Utilice edgetpu_runtime_20210119 (Frogfish)

El instalador instalará UsbDk. Tenga en cuenta que se trata de una versión de UsbDk más antigua (versión UsbDk_1.0.21_x64.msi) que se incluye con la versión 20210119, posiblemente esta sea una de las razones por las que funciona.

Con esto debería ser capaz de ejecutar el Inferencias del loro USB del coral ejemplo en Windows 10:

$ pyenv exec python examples/classify_image.py --model test_data/mobilenet_v2_1.0_224_inat_bird_quant_edgetpu.tflite --labels test_data/inat_bird_labels.txt --input test_data/parrot.jpg
C:\Business-2022\pi3g e.K\Marketing\2022 Präsentation für Ric\Coral on Windows\coral\pycoral\examples\classify_image.py:79: DeprecationWarning: ANTIALIAS está obsoleto y será eliminado en la almohadilla 10 (2023-07-01). Utilice Resampling.LANCZOS en su lugar.
  image = Image.open(args.input).convert('RGB').resize(size, Image.ANTIALIAS)
----INFERENCIA TIEMPO----
Nota: La primera inferencia en Edge TPU es lenta porque incluye la carga del modelo en la memoria de Edge TPU.
12.5ms
2.8ms
2,8ms
2.7ms
2,7ms
-------RESULTS--------
Ara macao (guacamayo escarlata): 0.75781

Probablemente añadiré pronto un escrito sobre cómo instalar el USB Coral en Windows 10 paso a paso, o posiblemente crearé un vídeo para nuestro canal de YouTube.

Comprar aceleradores USB de Coral

Somos uno de los distribuidores de USB de Coral. Por favor, póngase en contacto con nuestro equipo de ventas si desea solicitar un volumen del Coral USB, o si desea convertirse en revendedor.

Si quieres comprar uno para ti, pruebe con uno de nuestros distribuidores, o puede comprar un acelerador USB Coral en nuestra propia tienda, buyzero.de

Consultoría de Coral USB

Como habrás notado en esta entrada del blog, podemos apoyarte con consultoría para tu proyecto basado en Coral USB. Si desea discutir las posibilidades de aceleración de Coral EdgeTPU para su plataforma, necesita que alguien implemente una solución para usted, o necesita otra forma de consultoría / apoyo comercial, por favor póngase en contacto con nuestro equipo de ventas.

Otros errores

ImportError: La carga de la DLL falló al importar _pywrap_coral: El módulo especificado no pudo ser encontrado.

Este error le indica que el install.bat no se ha ejecutado.

    raise ValueError('Fallo al cargar el delegado de {}\n{}'.format(
ValueError: Fallo al cargar el delegado de edgetpu.dll

Después de arreglar el problema de UsbDk, como se ha descrito anteriormente, este error debería significar que su dispositivo USB Coral no está conectado a su ordenador Windows 10.

Compruébelo con el Administrador de dispositivos de Windows. Si está conectado, debería aparecer:

También verifique que el acelerador USB de Coral aparece como funcionando normalmente:

raise ValueError('Fallo al cargar el delegado de {}\n{}'.format(
ValueError: Fallo al cargar el delegado de edgetpu.dll

Si obtienes este error Y el Acelerador USB de Coral aparece como "Funcionando correctamente" en el administrador de dispositivos, entonces vuelve a comprobar si el software UsbDk está instalado, como he descrito anteriormente. Deberías ver una entrada "UsbDk Runtime Libraries" en tu Apps & features: