Hace tiempo conseguí una Intel Neural Compute Stick 2 (NCS 2) el cual es una unidad de procesamiento externo para dispotivos. Basicamente es un pequeño dispositivo USB el cual puedes conectar a una PC (pensado para proyectos de IoT que usan sistemas como una Raspberry Pi) para que se encarge de correr las inferencias de una red neuronal hecha para visión computacional.

Mi idea es utilizarlo para correr proyectos de detección de objetos sobre una Raspberry Pi para usarlo como dispositivo de edge computing

Raspberry Pi con Intel NCS 2

¿Qué es y qué no es la intel neural compute stick?

Al parecer hay algo de confusión en algunas personas sobre que es lo que se puede hacer con la neiral compute stick y que esta fuera del alcance asi que esta es una pequeña lista de sus capacidades y limitantes.

Que SI es:

  • Un dispositivo para acelerar predicciones sobre imágenes
  • Un complemento para proyectos de visión por computadora en sistemas limitados como una Raspberry Pi o una computadora muy limitada en hardware

Que NO es:

  • Una tarjeta gráfica compacta (GPU)
  • Un dispositivo para entrenar modelos de inteligencia artificial
  • Una computadora portatil (como una Raspberry Pi, NVIDIA Jetson o Google Coral)

Impresiones del NCS 2

Estuve corriendo algunos proyectos de visión por computadora en una Raspberry Pi con la Intel NCS 2 y estas son mis impresiones.

Intel OpenVino

Lo primero es que para poder usar la NCS tenemos que instalar en nuestros equipos el toolkit de intel (tanto en la PC que tiene los modelos entrenados como el dispositivo que estaá corriendo las predicciones) llamado OpenVino.

OpenVino es una paqueteria diseñada para poder correr nuestros modelos de manera optimizada en la NCS2, OpvenVino quiere decir "Inferencia visual y optimización de redes neuronales" por sus siglas en inglés. Para correr cualquier modelo que tengamos en Tensorflow, Caffe, MXNET y ONNX tenemos que convertirlo a una version IR o Representacion intermedia la cual es la versión de los modelos optimizado para correr en OpenVino. Por ejemplo, no se puede correr un modelo de tensorflow de manera directa.

Para poder empezar a la NCS OpenVino viene con varios demos y ejemplos de modelos para detección de objetos, estimación de poses humanas, clasificación de imágenes, transferencia de estilo etc. Pero si nosotros tenemos un modelo en específico que querramos correr tendremos que llevar a cabo algunos pasos.

Flujo para correr nuestros propios modelos en la NCS

Como mencioné para correr un modelo que tengamos hecho en tensorflow, pytorch, caffe etc no es tan sencillo como correrlo y ya, tenemos que llevar a cabo los siguientes pasos:

1) Entrenar modelo de manera "local"

Lo primero que se debe de hacer es entrenar el modelo que se quiere desplegar en una computadora que tenga la potencia para llevar a cabo esta tarea. Despues de este entrenamiento terminaremos con un archivo .pb para tensorflow, .caffemodel para caffe y .json y .params en el caso de MXNET

1.a) Convertir un modelo no soportado por OpenVino a un formato que pueda optimizar OpenVino [OPCIONAL]

En caso de estar entrenando tu modelo con pytorch, keras o algún otro framework no compatible con OpenVino lo que tendrás que hacer es convertir ese archivo a ONNX

ONNX tiene la ventaja de tener herramientas para convertir modelos de varios frameworks distintos a ONNX, esto lo tendrémos que hacer en caso de haber entrenado en un framework no compatible, ya que ONNX si es compatible con OpenVino

2) Optimizar el modelo

Una vez que ya contamos con nuestro modelo entrenado en uno de los formatos mencionados previamente, tendremos que optimizar nuestro modelo para que pueda correr en la NCS2.

OpenVino toolkit viene con herramientas para poder hacer esta conversion, asi que lo único que tenemos que hacer es correr el optimizador sobre nuestros modelos entrenados y de esto resultaran dos archivos, un .xml y un .bin estos dos archivos son todos los pesos y parametros de nuestra red neuronal que estará leyendo la NCS2

3) Crear script de inferencia

Ya que contamos con nuestros modelos en .xml y .bin solo tenemos que hacer un script el cual los cargue y procese las entradas (comúnmente imagenes) y genere una salida específica.

Este script es muy sencillo de generar, ya que los xml y bin contienen toda la información sobre la infraestructura de nuestra red neuronal por lo cual no tenemos que "crear el caparazón" de la red neuronal para despues cargarle los pesos correspondientes como tendriamos que hacerlo en tensorflow, pytorch u otro framework.

4) Correr el modelo sobre el dispositivo final y la NCS2

Ya que tenemos esto podemos correr nuestro script sobre la maquina que estara conectada con el NCS2, como puede ser una raspberry Pi.

Cabe mencionar que tambien el dispositivo que estara conectada a la NCS2 debe tener instalado el OpenVino Toolkit para poderse comunicar con el compute stick.

Ejemplo de estimación de pose humana (5.52 fps)

Conclusiones

Ok, ahora es momento de dar mi opinión sobre el producto y los resultados que obtuve corriendolo sobre mi Raspberry Pi 4 de 4 GB.

Logré correr un modelo de detección de objetos al igual que un estimador de poses humanas en la Raspberry Pi junto con la NCS 2, ambos fueron en tiempo real. Para detección de objetos obtuve 15 cuadros por segundo, lo cual me parece muy bien dado que no estaba corriendo YOLO sino fasterRCNN.

Para el modelo de detección de poses humanas en tiempo real pude obtener al rededor de 7 cuadros por segundo. Este mismo modelo corrió en mi procesador Core i5 dándome casi el doble de cuadros por segundo.

¿Recomiendo el NCS 2?

Si y no, las NCS 2 esta pensada para que puedas hacer pruebas sobre su procesador MYRIAD y ya que esté funcional lo migres a un sistema mas pequeño (una PCB ya con un procesador MYRIAD integrado).

No lo recomendaría para gente que esta empezando a jugar con este tipo de tecnologías ya que si requiere un poco de experiencia poder correr los modelos ya en la NCS2, si ya tienes una Raspberry Pi y la NCS excelente! pues aproevchalo se pueden hacer cosas muy interesantes.

Pero si aún no haz comprado nada de hardware y quieres correr modelos de IA en una computadora pequeña como una raspberry Pi, recomendaría la NVIDIA Jetson Nano la cual es una computadora completa con un procesador ARM y un GPU que te servirá para correr entrenamientos y predicciones de una gran variedad de modelos y en mi opinión es mas facil de usar para principiantes.