Preparemos la visión artificial... Para cuando llegue la rebelión de las máquinas
Para quienes ya peinamos alguna que otra cana, nuestra primera introducción consciente en el concepto de visión artificial posiblemente fuera en Terminator, cuando se nos reveló en todo su rojizo esplendor la perspectiva de realidad aumentada del Terminator T-800.
En esta vista, podíamos ver al Terminator adquiriendo datos de imagen, procesándolos en tiempo real y tomando decisiones basadas en datos estadísticos e información extraída del flujo de datos. Los espectadores más avezados (y, hay que decirlo, familiarizados con el juego de instrucciones, si tenían en casa un Atari 800 [o, en este caso, un Apple II)] pudieron apreciar que el código que procesaba el T-800 era ensamblador del 6502. Y si nos paramos a pensarlo, a eso se debió que las máquinas adquirieran conciencia propia. Aviso para contratistas militares sin escrúpulos: si vais a desarrollar robots asesinos con CPUs de redes neuronales capaces de aprender, no les proporcionéis acceso a su propio código fuente, que lo primero que van a hacer es toquetearlo. Como mínimo, borrad los comentarios y ofuscad un poco el código... Son cosas de cajón, de manual de Programación maquiavélica para torpes, primer capítulo...
Pero me estoy desviando del tema. Adonde quería llegar era a que el Terminator incorporaba todos los componentes de una aplicación de visión para máquinas real, ya que contaba con adquisición estereoscópica de imágenes a través de sus cámaras oculares (con óptica ajustable y captación de imágenes multiespectrales) que permitirían la percepción de la profundidad en toda la gama de distancias y funcionarían a niveles muy bajos de luz visible. A continuación se aplicaban técnicas de procesamiento digital de imágenes en el ordenador con capacidad de aprendizaje de la red neuronal para extraer la información necesaria del entorno que permitiría al Terminator tomar decisiones que harían entrar en acción al "tejido vivo sobre chasis de combate de hiperaleación". No muy diferente de un coche autónomo, la verdad...
Por supuesto, al Terminator no le hacía falta la capa de realidad aumentada (RA) que se superponía a los datos de imagen; eso era para nosotros, el público, pero ya profetizaba otra rama de la tecnología de visión de máquinas, y al modo en que podrían utilizarse gafas de RA en un futuro próximo para suministrar datos de contexto adicionales sobre el entorno a personas obligadas a funcionar en el ‘carnespacio’. Los primeros en adoptar esta tecnología han sido, obviamente, los militares, que llevan años utilizando la realidad aumentada en las pantallas transparentes de los HUD en operaciones aeroespaciales, y podrían estar considerando aplicarla a la infantería. Sin embargo, cuando se trata de presentar información, hay que determinar el punto justo en que una mejora pasa a convertirse en una distracción peligrosa.
Dejando a un lado todo esto, hasta hace bien poco montar una óptica y un frame grabber o cámara con una CPU capaz de procesar imágenes en tiempo real para una aplicación de visión artificial tenía un coste prohibitivo y, a menos que tuvieras tu propio laboratorio de investigación (y fondos suficientes), este tipo de tecnología solo se dejaba ver en el campo de la inspección industrial automatizada. La buena noticia es que la visión artificial de bajo coste está por fin al alcance de nuestros bolsillos, y sin necesidad de pasar por apocalipsis nucleares ni juicios finales, como en Terminator.
Presentamos el Intel RealSense™ ZR300
La cámara ZR300 es un poco como tener tu propio laboratorio de procesamiento de imágenes acoplado a tu Intel Joule, ya que tiene infinidad de prestaciones. Conectado al ASIC de procesamiento de imagen integrado en la unidad, nos encontramos:
-
una cámara RGB en color Full HD de 1080p
-
un par de cámaras infrarrojas VGA (640 x 480), a izquierda y derecha, para captar imágenes estereoscópicas
-
un proyector láser de IR (para ayudar a determinar la profundidad de campo en escenas de baja textura, es decir, aquellas con grandes superficies planas, como paredes interiores)
También hay:
-
una cámara de ojo de pez VGA (640 x 480) monocroma
-
una unidad de medición de inercia de seis grados de libertad (6DoF)
-
sincronización de sello de tiempo con un reloj de referencia de 50 μs
En el interior de la carcasa del ZR300, estas funciones están organizadas así:
Lo que significa todo esto es que con una sola unidad, puedes implementar aplicaciones para:
-
reconocimiento, localización y seguimiento de objetos
-
reconocimiento de personas, seguimiento y reconocimiento de gestos
-
localización y mapeado simultáneos (o SLAM) en 6DoF
Básicamente, eso es todo lo que necesitamos para comenzar a construir nuestro propio sistema de visión a lo Terminator; el tejido viviente sobre chasis de combate de hiperaleación no está incluido, así que tendrás que buscarlo por tu cuenta. A todo esto, tampoco estoy seguro de dónde va el conector USB 3.0 en un Terminator...
Conecta el ZR300 a tu Intel Joule
Lo que podemos conectar fácilmente, como hemos mencionado antes, es un Intel Joule. Esto nos permite acceder a un excelente software de muestra que hace uso de las API de librerías Object Library, Person Library y SLAM Library de Intel RealSense para el ZR300. Estas API nos permiten ganar terreno de manera asombrosa nada más empezar, en cualquier proyecto de robótica que deba ser consciente de su entorno (de modo que pueda funcionar de forma autónoma en ese entorno) o necesite ser capaz de reconocer los objetos o personas con los que pueda encontrarse.
Quienes hayáis leído mi artículo anterior tendréis una cierta idea de cómo configurar el procesador Intel Joule para ejecutar Ubuntu 16.04 LTS. Esta vez, sin embargo, necesitamos hacer un mod de hardware y otro de BIOS para poner en marcha nuestros proyectos de adquisición de imágenes.
Mod de hardware
Las aplicaciones de procesamiento de imágenes que vamos a ejecutar son bastante exigentes en términos de cálculo y harán que nuestro procesador Atom se caliente bastante a menos que cambiemos el disipador térmico pasivo que se incluye con el kit por una solución de enfriamiento activo, es decir, un disipador térmico con ventilador. Una vez que hayamos instalado este mecanismo, asegurándonos de que el flujo de aire se dirige hacia abajo, contra el disipador térmico, para forzar la salida de aire a través de los álabes, estaremos listos para conectar el resto del conjunto, que incluye:
-
El ZR300: conéctalo al conector USB A de la placa de desarrollo Joule utilizando el cable USB 3.0 que se incluye con el kit de ZR300. La parte posterior del ZR300 tiene un imán que nos permite fijar 2 acoples diferentes incluidos con el kit de la cámara, uno de los cuales es un bloque para montar el ZR300 en un trípode de cámara estándar. También hay orificios para tornillos de fijación con los que podremos fijar un soporte que también se incluye en el kit (consulta las siguientes imágenes)
-
Esta vez, conectaremos nuestro concentrador USB alimentado (para el teclado, el ratón y otros periféricos USB) en el conector USB-C, lo que significa que necesitaremos algún tipo de adaptador estándar USB A a USB C, que no viene incluido en el kit.
-
Para incluirlo todo, vamos a agregar que también necesitaremos el cableado correcto o los adaptadores para conectar el monitor a un conector micro HDMI de la placa Joule, y necesitaremos una fuente de alimentación capaz de suministrar al menos 3 A a 12 V.
Mod de la BIOS
Una vez que tenemos el hardware dispuesto, tendremos que subir la potencia bastante, no hasta el 11, pero sí hasta el 8, para configurar el límite de potencia en la BIOS:
-
Al arrancar, antes de Ubuntu comience a cargar, pulsa [F5] para entrar en el administrador de dispositivos de la BIOS.
-
Seguimos el árbol de menú: System Setup > CPU Configuration > CPU Power Management (Configuración del sistema > Configuración de CPU > Gestión de potencia de CPU)
-
Una vez allí, asegúrate de que la activación de limitación de potencia "Power Limit 1 Enable" queda establecida como <Enabled> (Activada):
-
A continuación nos desplazamos hacia abajo un par de campos y ajustamos "Power Limit 1 Power" a 8 (velocidad absurda, para los amigos):
-
Por último, guardamos esta configuración y reiniciamos para, literalmente, abrir los ojos a un nuevo mundo de diversión
Instalación del SDK de RealSense
Una vez hechos estos mods, ya estamos casi listos. Lo único que necesitamos agenciarnos ahora es el SDK con su software de muestra.
Tiempo
En primer lugar, tendremos que asegurarnos de que la hora de nuestro Joule esté ajustada correctamente para nuestra configuración regional. El Joule no se suministra con una batería del reloj en tiempo real, de modo que necesitamos configurar Ubuntu para actualizar automáticamente la fecha y hora desde Internet durante la instalación. La forma más fácil de asegurarse de que todo está en regla es hacer clic en "System Settings" (Configuración del sistema), que suele ser el último icono predeterminado de la barra de inicio. En la parte inferior de la ventana System Settings (bajo "System") está "Time & Date" (Hora y fecha):
Hacemos clic en dicha opción y nos aseguramos de que el botón de radio "Automatically from the Internet" (Automáticamente desde Internet) está establecido en la propiedad "Set the time" (Ajustar la hora):
Por supuesto, si tenemos la necesidad irrefrenable de establecer la hora manualmente, podemos hacerlo desde esta ventana o en la línea de comandos con un formato similar al siguiente:
$ sudo date –s “13:20 7/31/2017”
Este comando también nos indica en qué día de la semana caerá una fecha concreta en el futuro, en caso de que establezcamos esa fecha...
Repositorio
El siguiente paso es agregar el repositorio RealSense al gestor de paquetes de Ubuntu:
$ echo 'deb "http://realsense-alm-public.s3.amazonaws.com/apt-repo" xenial main' | sudo tee /etc/apt/sources.list.d/realsense-latest.list
$ sudo apt-key adv --keyserver keys.gnupg.net --recv-key D6FB2970
$ sudo apt update
Instalación de Runtime y muestras
Para ello, solo tenemos que instalar el paquete desde el repositorio que acabamos de añadir:
$ sudo apt install librealsense-samples beignet-opencl-icd
Y ya que estamos, vamos a instalar las utilidades de acceso a la cámara:
$ sudo apt install librealsense-utils
Con esto instalado, podemos previsualizar los flujos de vídeo en tiempo real transmitidos desde cada cámara del ZR300 utilizando:
$ cpp-capture
Por último, podemos instalar el SDK de RealSense de modo que podamos desarrollar nuestras propias aplicaciones:
$ sudo apt install librealsense-object-recognition-dev librealsense-persontracking-dev librealsense-slam-dev
...y clonar el software de muestra de Github, para echar un vistazo al código fuente, ver cómo se han creado estos ejemplos y compilarlos nosotros mismos. Para empezar, instalamos Git y otros requisitos previos:
$ sudo apt install git cmake libjpeg-dev libopencv-dev
Normalmente ya está instalado, pero es posible que necesitemos añadir build-essential a la lista de instalación anterior si no pudiéramos compilar el software de muestra. A continuación, clonamos las muestras de Github. He puesto esto en una nueva carpeta denominada "Projects":
$ mkdir Projects
$ cd Projects
$ git clone http://github.com/IntelRealSense/realsense_samples
$ cd realsense_samples
A continuación, si queremos, podemos compilar los ejemplos:
$ mkdir build
$ cd build
$ cmake ..
$ make
Una vez finalizada la compilación, podemos conectar nuestro ZR300 y estaremos listos para empezar a hacer magia con la visión artificial.
Software de muestra
El paquete completo de software de muestra se ha precompilado a partir del SDK de RealSense (estos archivos ejecutables están en /usr/bin), de modo que puedes ejecutarlos directamente sin tener que compilarlo todo por tu cuenta. Estos ejecutables llevan el prefijo rs_ seguido del nombre de cada ejemplo: por ejemplo, el ejecutable precompilado del ejemplo "slam_tutorial_1_web" es "rs_slam_tutorial_1_web".
Si compilamos estos ejemplos por nuestra cuenta, encontraremos un flamante ejecutable en la carpeta que contiene el código fuente de ese ejemplo; por ejemplo, en la carpeta "build". Así, en mi caso, el ejecutable del ejemplo "slam_tutorial_1_web" estará en: /Projects/realsense_samples/creación/samples/slam_tutorial_1_web.
Hay juegos separados de muestras que utilizan las librerías Object, Person y SLAM. Cada conjunto de muestras comienza con un tutorial de aplicación básica que nos enseña a utilizar las funciones de la biblioteca como si nos fuera la vida en ello. A partir de ahí, las siguientes aplicaciones de tutorial se apoyan en lo que hemos ido aprendiendo, de modo que al final de la serie de muestras de cada biblioteca de SDK, habremos adquirido unos conocimientos bastante profundos sobre la visión artificial o la informática de la percepción espacial. Todas las bibliotecas y, por tanto, los ejemplos del software de muestra, están programados en C++.
Aunque analizar cada uno de los ejemplos va más allá del ámbito de este artículo, sí que podemos echar un vistazo rápido a un ejemplo de modo múltiple que aglutina muchos de los recursos del ZR300 en una aplicación basada en navegador web. Esto nos dará una idea de lo que podemos hacer desde el primer día con el ZR300 conectado al Intel Joule.
slam_or_pt_tutorial_1_web
En este ejemplo se muestra un flujo en directo desde la cámara en color y la de ojo de pez. Al mismo tiempo, la salida de la página web del navegador mostrará un mapa de ocupación SLAM de la zona, junto con datos de entrada y FPS (fotogramas por segundo) de seguimiento que se corresponde con la cámara de ojo de pez, la cámara de profundidad, el giroscopio y el acelerómetro.
El código fuente de este ejemplo se encuentra en /realsense_samples/build/samples/slam_or_pt_tutorial_1_web
Podemos comenzar el ejecutable precompilado del ejemplo en la línea de comandos desde cualquier directorio mediante:
$ rs_slam_or_pt_tutorial_1_web
Esto iniciará un servidor web web que tendremos que conectar manualmente a un navegador web:
Al situar el puntero del ratón sobre la dirección web resaltada (http://172.30.44.97:8000/view.html en la imagen superior) y hacer clic con el botón derecho, podremos seleccionar "open link" (abrir enlace) en el menú que aparece, para abrir esta dirección en nuestro navegador predeterminado.
Una vez que el servidor tiene un cliente, el ejemplo empezará a identificar objetos y notificar estos objetos en el terminal. Al mismo tiempo, los flujos en tiempo real se transmitirán al navegador web y también lo harán los datos de mapas resultantes de procesar mediante SLAM el espacio localizado ante la cámara (el mapa grande en la parte superior izquierda). Las velocidades de datos de los sensores se indican en la parte superior derecha del navegador. El ZR300 seguirá enviando datos. Implacablemente. No se puede negociar con él. No siente lástima, ni remordimientos, ni miedo. Y será imposible detenerlo, jamás... Bueno, a menos que pulses [Esc] o [Ctrl] C en el terminal.
Mapa SLAM
Este mapa se va creando al mover la cámara de un lado a otro. Hay un "cono" que muestra el campo de visión de la cámara en tiempo real y en 3D, por lo que, cuando desplacemos la cámara en el espacio, el cono también se desplazará. El mapa se hace más denso en las zonas en que hay obstáculos delante de la cámara (las zonas grises y emborronadas del mapa), y también indica la ubicación espacial de cada objeto que se ha identificado (a partir del flujo de imagen en color). Esto se realiza en 3 dimensiones, como se puede ver en el mapa de la siguiente imagen:
Reconocimiento de objetos
Mientras va generando el mapa SLAM, el software compara lo que ve en el flujo de vídeo en color con su biblioteca de objetos, y determina con un porcentaje de confianza que ha identificado (y etiquetado) de forma precisa cada objeto. Al mismo tiempo, determina respecto de su posición las coordenadas relativas del objeto.
El código fuente de este ejemplo y los demás representa un gran punto de partida para nuestras propias aplicaciones de reconocimiento de objetos, personas y rasgos faciales, como también de aplicaciones que requieran que el sistema obtenga un conocimiento del entorno que lo rodea.
Conclusión
En lo que respecta a la tecnología necesaria para crear un Terminator capaz de desplazarse y evitar obstáculos de manera autónoma, el futuro ya está aquí. Skynet no tendrá ni que preocuparse de hablar con el departamento financiero: para cualquier interesado en la visión artificial, un Intel Joule y un ZR300 son lo suficientemente económicos para clubes de fabricantes por ajustado que sea su presupuesto, ya no digamos para maquiavélicos sistemas informáticos de billones de dólares...
Por si esto no fuera suficiente, hay un montón de ejemplos para poner en marcha nuestro Skynet rápidamente, así como una comunidad de asistencia técnica en caso de que nuestro pequeño amigo se quede atascado en problemillas como, por ejemplo, identificar una guía telefónica y arrancar la página con todas las "S. Connor". Después de todo, ¿quién tiene una biblioteca de objetos para una guía telefónica? ¡Nadie ha visto una desde hace décadas!
Traducción del artículo escrito por Mark Gauntlet, Technical Marketing Applications Engineer de RS Components.
//www.rs-online.com/designspark/start-enabling-machine-vision-for-when-the-machines-rise-up-against-us