Ejecutando YOLO en ODROID: YOLODROID

ODROID Magazine YOLODROID

YOLO (https://pjreddie.com/darknet/yolo/) es un modelo de red neuronal capaz de reconocer objetos cotidianos muy rápido a partir de imágenes. También está TinyYOLO (http://machinethink.net/blog/object-detection-with-yolo/), que funciona bien en dispositivos móviles. Esta guía te ayudará a instalar y ejecutar TinyYOLO en tu ODROID-XU4. Para continuar, inicia sesión en tu ODROID y ejecuta los comandos que se muestran en las siguientes secciones.

Instalar TensorFlow

En primer lugar, nos aseguraremos de que todo esté actualizado:

$ sudo apt-get update
$ sudo apt-get upgrade -y
$ sudo apt-get dist-upgrade -y
$ sudo reboot

Conseguir un poco de memoria de intercambio

Bazel no se compilará sin utilizar memoria de intercambio en el ODROID-XU4. Conecta una unidad USB de 8GB vacía, la cual borraremos y ejecuta el siguiente comando:

$ sudo blkid
Compruebe el nombre del dispositivo, generalmente /dev/sda1, con este nombre ejecuta:
$ sudo mkswap /dev/sda1
$ sudo swapon /dev/sda1
$ sudo swapon

Instalar los requisitos

Necesitaremos el verdadero Java Oracle, en lugar de OpenJDK. Lo intenté con OpenJDK, compilé Bazel con él, pero falló en las descargas hash SHA-1, así que fue inútil. De modo que tenemos que instalar los siguientes paquetes:

$ sudo apt-get install pkg-config zip g++ zlib1g-dev unzip
$ sudo apt-get install gcc-4.8 g++-4.8
$ sudo update-alternatives --install /usr/bin/gcc gcc /usr/bin/gcc-4.8 100
$ sudo update-alternatives --install /usr/bin/g++ g++ /usr/bin/g++-4.8 100
$ sudo apt-get install python-pip python-numpy swig python-dev
$ sudo pip install wheel
$ sudo add-apt-repository ppa:webupd8team/java
$ sudo apt-get update
$ sudo apt-get install oracle-java8-installer
$ sudo apt-get install oracle-java8-set-default
$ java -version

Instalar el sistema de compilación Bazel

Google compila las cosas usando Bazel. TensorFlow es de Google. Por lo tanto, necesitamos compilar Bazel en primer lugar. Esto llevara alrededor de una media hora, vete a buscar algo de comer mientras se ejecuta:

$ wget https://github.com/bazelbuild/bazel/releases/download/0.5.4/bazel-0.5.4-dist.zip
$ unzip -d bazel bazel-0.5.4-dist.zip
$ cd bazel
$ sudo ./compile.sh
Ahora, Java se acaba aquí, así que tenemos que hacer las siguientes modificaciones:
$ sudo vi scripts/bootstrap/compile.sh
Busca la línea que empieza con "run" y añade algunos delimitadores de memoria, cámbiala con lo siguiente:
run “${JAVAC}” -J-Xms256m -J-Xmx384m -classpath “${classpath}” -sourcepath “${sourcepath}”
Luego, compila de nuevo:
$ sudo ./compile.sh
$ sudo cp output/bazel /usr/local/bin/bazel

Descargar y configurar TensorFlow

Ahora podemos descargar y configurar TensorFlow:

$ git clone --recurse-submodules https://github.com/tensorflow/tensorflow.git
$ cd tensorflow
No pude instalar la última versión de TensorFlow, ya que tenía problemas de compilación BoringSSL C99. Para solucionar esto, revise la versión 1.4.0 y configure:
$ git checkout tags/v1.4.0
$ ./configure
Rechaza la mayoría de las cosas, incluido OpenCL, tal y como se muestra en la Figura 1.

ODROID Magazine Figure 1 - Configuring TensorFlow Figura 1 - Configurando TensorFlow

Compilar TensorFlow

Después, tenemos que compilar Tensorflow. Si pensabas que Bazel tardó mucho tiempo en compilarse, entonces es que no has desarrollado software antes. Sujétate bien el sombrero, porque el paseo va a ser largo:

$ bazel build -c opt --copt="-mfpu=neon-vfpv4" --copt="-funsafe-math-optimizations" --copt="-ftree-vectorize" --copt="-fomit-frame-pointer" --local_resources 8192,8.0,1.0 --verbose_failures tensorflow/tools/pip_package:build_pip_package
 Building…
 1,900 / 4,909 files… error.
¡Oop!, NEON no funciona. De acuerdo, vamos a desactivarlo. Aunque solucionaremos esto más adelante:
$ bazel build -c opt --copt="-funsafe-math-optimizations" --copt="-ftree-vectorize" --copt="-fomit-frame-pointer" --local_resources 8192,8.0,1.0 --verbose_failures tensorflow/tools/pip_package:build_pip_package
 3,700 / 4,622 files… error.
 In file included from tensorflow/compiler/xla/service/llvm_ir/llvm_util.cc:30:0:
 ./tensorflow/core/lib/core/casts.h: In instantiation of 'Dest tensorflow::bit_cast(const Source&) [with Dest = long long int; Source = void (*)(const char*, long long int)]':
 tensorflow/compiler/xla/service/llvm_ir/llvm_util.cc:400:67: required from here
 ./tensorflow/core/lib/core/casts.h:91:3: error: static assertion failed: Sizes do not match
En este caso, es XLA el que está causando problemas. Es nuevo y no es necesario, así que vamos a dejarlo por ahora, reconfiguramos y recompilamos sin él:

2,345 / 3,683 files… 3,112 / 3,683 files… 3,682 / 3,683 files…

Target //tensorflow/tools/pip_package:build_pip_package up-to-date: bazel-bin/tensorflow/tools/pip_package/build_pip_package

Luego, instálalo:

$ bazel-bin/tensorflow/tools/pip_package/build_pip_package /tmp/tensorflow_pkg
$ sudo pip2 install /tmp/tensorflow_pkg/tensorflow-1.4.0-cp27-cp27mu-linux_armv7l.whl --upgrade --ignore-installed
Al principio, cuando ejecuté el siguiente comando, éste se ejecutó usando Python 3 y fallo la instalación, así que después de buscar en Google y conocer un poco las reglas de los nombres de archivos pip, descubrí el fallo y simplemente usé pip2:
$ sudo pip install /tmp/tensorflow_pkg/tensorflow-1.4.0-cp27-cp27mu-linux_armv7l.whl --upgrade --ignore-installed
Luego, lo más divertido fue cuando ejecuté por primera vez "import tensorflow", recibí este mensaje:
>>> import tensorflow
 Traceback (most recent call last):
 File “”, line 1, in 
 File “tensorflow/__init__.py”, line 24, in 
 from tensorflow.python import *
 File “tensorflow/python/__init__.py”, line 49, in 
 from tensorflow.python import pywrap_tensorflow
 File “tensorflow/python/pywrap_tensorflow.py”, line 25, in 
 from tensorflow.python.platform import self_check
 ImportError: No module named platform
Busqué en Google el problema, y parecía tratarse de un tema de configuraciones regionales, tal y como aparece en https://github.com/tensorflow/tensorflow/issues/36. So, Así que apliqué en primer lugar una configuración regional, luego además parecía que necesitaba ser la capital de EE. UU. (http://bit.ly/2ifyle4), y recompilé, aun así aparecia el mismo problema:
$ export LC_ALL=en_US.UTF-8
$ export LANG=en_us.UTF-8
Al día siguiente, con el poder de Google, descubrí que, en realidad, el problema era que solo lo estaba ejecutando en el directorio de compilación. Tiene un directorio llamado tensorflow, y Python lo estaba buscando para encontrar cosas. Entonces, simplemente cambiando los directorios se solucionó el problema.
$ python2
 >>> import tensorflow
 >>> print(tensorflow.__version__)
 1.4.0
Parece que todo está funcionando bien, así que ahora es el turno de YOLO.

Ejecutar YOLO

Estoy seguro que hay algunas implementaciones de YOLO por ahí, así que vamos a elegir una de https://github.com/experiencor/basic-yolo-keras:

$ git clone https://github.com/experiencor/basic-yolo-keras.git
$ cd basic-yolo-keras
Descárgate los archivos de https://1drv.ms/f/s!ApLdDEW3ut5fec2OzK4S4RpT-SU, o desde https://1drv.ms/f/s!ApLdDEW3ut5feoZAEUwmSMYdPlY
$ wget /tiny_yolo_features.h5
$ wget /tiny_yolo_raccoon.h5
A continuación, edita el archivo de configuración y cambia el modelo a "Tiny Yolo":
$ vi config.json
Descarga una imagen de un mapache:
$ wget https://upload.wikimedia.org/wikipedia/commons/b/be/Racoon_in_Vancouver.jpg
Luego, ejecuta el script:
$ python2 predict.py -c config.json -i Racoon_in_Vancouver.jpg -w tiny_yolo_raccoon.h5
Falta el paquete imgaug, de modo que lo agregaremos y sus dependencias:
$ sudo pip2 install imgaug
$ sudo pip2 install keras
$ sudo pip2 install h5py
Tanto h5py como scipy tardan un poco en instalarse. ¿Puedes encontrar el mapache en la Figura 2?

ODROID Magazine Figure 2 - A test image of a raccoonFigura 2 - Una imagen de prueba de un mapache

$ python2 predict.py -c config.json -i Racoon_in_Vancouver.jpg -w tiny_yolo_raccoon.h5
Efectivamente, ¡ahora es un mapache detectado!

ODROID Magazine Figure 3 - YOLO has detected the image of the raccoon Figura 3 - YOLO ha detectado la imagen del mapache

Para comentarios, preguntas y sugerencias, visita el artículo original en https://medium.com/@TomPJacobs/running-yolo-on-odroid-yolodroid-5a89481ec141.

Be the first to comment

Leave a Reply