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 blkidCompruebe 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.shAhora, Java se acaba aquí, así que tenemos que hacer las siguientes modificaciones:
$ sudo vi scripts/bootstrap/compile.shBusca 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 tensorflowNo 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 $ ./configureRechaza la mayoría de las cosas, incluido OpenCL, tal y como se muestra en la Figura 1.
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 matchEn 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-installedAl 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-installedLuego, 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 platformBusqué 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-8Al 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.0Parece 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-kerasDescá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.h5A continuación, edita el archivo de configuración y cambia el modelo a "Tiny Yolo":
$ vi config.jsonDescarga una imagen de un mapache:
$ wget https://upload.wikimedia.org/wikipedia/commons/b/be/Racoon_in_Vancouver.jpgLuego, ejecuta el script:
$ python2 predict.py -c config.json -i Racoon_in_Vancouver.jpg -w tiny_yolo_raccoon.h5Falta el paquete imgaug, de modo que lo agregaremos y sus dependencias:
$ sudo pip2 install imgaug $ sudo pip2 install keras $ sudo pip2 install h5pyTanto h5py como scipy tardan un poco en instalarse. ¿Puedes encontrar el mapache en la Figura 2?
Figura 2 - Una imagen de prueba de un mapache
$ python2 predict.py -c config.json -i Racoon_in_Vancouver.jpg -w tiny_yolo_raccoon.h5Efectivamente, ¡ahora es un mapache detectado!
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