Wednesday, September 19, 2018

API's de SAP Leonardo Machine Learning en el Go


Trabajar en el d-shop, primero en el Silicon Valley y ahora en Toronto, me permite usar mi creatividad y jugar con cualquier nuevo gadget que llega al mercado.

Esta vez, fué el turno del Oculus Go 😉 y qué es el Oculus Go? Bueno, es un headset de VR independiente, lo cual significa basicamente…no hay cables que se puedan enredar 😉

Para este proyecto tenía la oportunidad de trabajar ya sea con UnityUnreal Engine…Ya había utilizado Unity muchas veces para desarrollar aplicaciones para el Oculus Rift y Microsoft HoloLens…así que pensé que Unreal Engine sería una mejor opción esta vez…aunque nunca lo había utilizado antes para un proyecto grande…especialmente porque nada le gana a Unreal cuando se trata de gráficos…

Con Unreal selecionado…tenía que tomar otra decisión…C++ o Blueprints…bueno…aunque he utilizado C++ en el pasado para un par de aplicaciones en Cinder…Blueprints se veía mejor puesto que quería desarrollar más rápidamente y sin demasiadas complicaciones…y bueno…esa es solo la mitad de la verdad…algunas veces los Blueprints pueden convertirse en algo muy confuso 😊

Solo para que lo sepan, utilicé Unreal Engine 4.20.2 y cree una aplicación Blueprints.



Desde el inicio sabía que quería utilizar las API´s de Machine Learning de SAP Leonardo…puesto que ya las había utilizado antes para mi blog “Cozmo, leeme”  donde utilicé al robot Cozmo, OpenCV y el API de OCR de SAP Leonardo para leer una pizarra con un mensaje escrito a mano y hacer que Cozmo le leyera en voz alta.

La idea

Esta vez, quería demostrar el uso de más de una API…así que tenía que escoger cuales…afortunadamente eso no fué muy dificil…la mayoría de las APIs son más orientadas al uso “Empresarial”…Así que eso me dejaba con “Image Classification, OCR y Language Translation” …

Con todo decidido…aún debía pensar como utilizar las API’s…es decir…el Oculus Go es Realidad Virtual…así que no había la posibilidad de mirar a algo, tomarle una foto y enviarla al API…

Así que, pensé…por qué no utilizo Blender (que es una herramienta Open Source para el desarollo de gráficos generados por computadora) y hacer algunos models…luego podría hacer un render de los models…tomar una foto y enviarlas al API…y tener los model significa…que podía convertirlos a archivos “.fbx” y cargarlos a Unreal para una mejor experiencia…

Con las API's de OCR…era diferente…puesto que necesitaba images con texto…así que decidí utilizar InkScape (que es un software Open Source para editar imágenes vectoriales).

La implementación

Cuando comencé a trabajar en este proyecto…sabía que tenía que ir paso a paso…así que primero hice una version Windows de la aplicación…luego la convertí a Android (Lo cual fué muy sencillo dicho sea de paso) y finalmente una aplicación para el Oculus Go (Lo cual fué un poco doloroso…)

Así qué, lástimosamente no voy a poder poner nada de código fuente en este blog…simplemente porque utilicé Blueprints…y no estoy muy seguro que si quieran reproducirlos a mano ☹ Se darán cuenta de lo que hablo más adelante en el blog…

En fín…continuemos 😊

Cuando pensé en este proyecto, lo primero que me vino a la mente fué…quiero tener un espacio de d-shop…con algunos escritorios…un letrero para cada API…algunas luces no estarían nada mal…



Entonces, no se vé nada mal, no?

Luego, quería trabajar en el API de “Image Classification”…así que quería que fuera bastante parecido…pero con solo un escritorio en el medio…que luego se convirtío en un pedestal…con los objectos 3D rotándo encima…también debería haber un espacio listo para mostrar el resultado de llamar a la API…también…flechas para permitir al usuario cambiar el modelo 3D…y el ícono de una casa para permitir al usario regresar al “Showfloor”…




Se darán cuenta de dos cosas muy rápidamente…primero…qué se supone que esa esfera? Bueno…es solo un contenedor que será reemplazado con los objectos 3D 😊 También…pueden ver un poster negro que dice “SAP Leonardo Output”…eso está escondido y solo se vuelve visible cuando lanzamos la aplicación…

Para las escenas de “Optical Character Recognition” y “Language Translation”…es practicamente lo mismo aunque el último no tiene flechas 😊





Los Problemas

Así que asi es basicamente como las escenas están conectadas…pero por supuesto…me encontré con el primer problema muy rápidamente…como llamar a las API’s utilizándo Blueprints? Busqué online y la mayoría de los plugins son pagados…pero afortunadamente encontré uno gratuito que realmente me sorprendió…UnrealJSONQuery funciona perfectamente y no es tan complicado de utilizar…pero por supuesto…tuve que cambiar algunas cosas en el código fuente (como agregar la cabecera para la llave y cambiar los parámetros para poder subir las imágenes). Luego simplemente recompilé y voila! Tenía JSON en mi aplicación 😉

Pero quieren saber que es lo que cambié, no? Claro 😊Simplemente descomprimí el archivoy me fuí a JSONQuery --> Source --> JSONQuery --> Private y abrí JsonFieldData.cpp

Aquí agregué una nueva cabecera con (“APIKey”, “MySAPLeonardoAPIKey”) y luego busqué el PostRequestWithFile y cambié el parámetro “file” a “files”…

Para compilar el código fuente, simplemente creé una aplicación C++, luego cree una carpeta “plugins” en la carpeta de mi proyecto y puse todos los archivos del zip que descargué…abrí el proyecto…lo dejé compilar y luego recreé todo lo del proyecto anterior…una vez que hice eso…todo comenzó a funcionar perfectamente…

Entonces, veamos parte del Blueprint que utilicé para llamar al API…




Basicamente, necesitamos crear el JSON, llamar al API y después leer el resultado y extraer la información.

Todo estaba yendo de las mil maravillas…hasta que me di cuenta de que necesitaba empaquetar las images 3D generadas por Blender…y no tenía idea de como hacerlo…así que afortunadamente…el Victory Plugin vino al rescate 😉 Victory tiene algunos nodos que nos permiten leer muchos de los directorios que se encuentran dentro de una aplicación compilada…así que finalmente estaba todo listo 😊

Así es como se vé el Victory plugin cuando lo llamamos en un Blueprint…




Los Modelos

Para los models 3D como ya lo dije…utilicé Blender…los modelé utilizándo el “Cycles Render”, hice un bake a los materiales y luego hice el render de las imágenes utilizándo el “Blender Render” para poder generar los archivos .fbx…





Si las manzanas se ven como si fueran de metal o de cera…culpen a mis pobres habilidades para definir la iluminación ☹

Cuando se carga en Unreal…los modelos se ven realmente muy bien…


Ahora…estoy seguro que quieren ver como ve una pantalla completa de Blueprint…está es para los modelos 3D en la escena de Image Classification…



Complicado? Bueno...un poco…usualmente los Blueprints son así…pero son realmente muy poderosos…

Aquí hay otro…esta vez para la "Flecha a la Derecha" que nos permite cambiar los modelos…


Se ve extraño y complejo…pero funciona muy bien 😉



Se darán cuenta de que “Image Classification” y “OCR” tienen ambos flechas a la izquierda y derecha…así que tenía que reutilizar algunas variables y estas debían ser compartidas entre Blueprints…así que…para esto creé un “Game Instance” donde simplemente creé unas cuantas variables públicas que podían ser compartidas y actualizadas.

Si se preguntan para que utilicé Inkscape? Bueno…quería tener una especie de anunción en luces de neon y una imagen escrita a mano…



De Android al Oculus Go

Se preguntarán…por qué cambia de Android al Oculus Go? No están ambos basados en Android? Bueno…sí…pero aún así…gracias a mi experiencia personal…ahora se que las cosas cambian mucho…

Primero…en Android…creé las escenas…y todo estaba perfecto…en el Oculus Go…ninguna escena nueva estaba siendo cargada…cuando hacía click en alguna escena…la primera escena se cargaba a si misma… ☹ Por qué? Porque necesitaba agregarlas al array de escenas que debían ser empaquetadas…

Y lo gracioso es que la carpeta por defecto para proyecto de Unreal es“Documentss”…así que cuanod trataba de agregar las escenas, Unreal se quejaba de que la ruta era demasiado larga…así que tuve que clonar el proyecto y moverlo a una carpeta dentro de C:\

También…cuando cambié de Windows a Android…fué algo tan simple como cambiar el “Click” por “Touch”…pero para el Oculus Go…bueno…necesité crear un “Pawn”…donde puse una camara, un motion controller, y un puntero (actuándo como un puntero laser)…aquí cambie el “Touch” por un “Motion Controller Thumbstick”…y desde ahí tuve que controlar todos los aspectos de la navegación…bastante confuso…

Otra cosas que cambió completamente fué el “SAP Leonardo Output”…veamos como se veía en Android…



Aquí pueden ver que utilicé un “HUD”…así que sin importar a donde miremos…el HUD se mueve con nosotros…

En el Oculus Go…esto no funcionaba para nada…primero tuve que utilizar una imagen negra como fondo…

Luego tuve que crear un actor y luego agrgar el HUD dentro…para convertirlo en un HUD 3D…




El producto final

Cuando todo estaba listo…simplemente empaqueté mi aplicación y la cargué en el Oculus Go…y utilizándo Vysor pude grabar una simple sesión para que puedan ver como se vé en la vida real 😉 Por supuesto…el problema (Primero que nada porque…soy muy flojo como para seguir investigándo y segundo porque parece ser mucho trabajo) es que necesitas correr la aplicación desde la sección “Unknown Sources” en el Oculus Go…pero…está ahí y funciona y eso es lo único que importa 😉

Aquí esta el video para que puedan tener una mejor idea de que lo que se trata el proyecto 😊





Espero que les haya gustado 😉

Saludos,

Blag.
SAP Labs Network.




No comments: