Mi primera aplicación inteligente con Xamarin.Android (MS Cognitive Services)

Buenas a todos!
Sé que ha pasado mucho desde mi último post, pero aquí estoy de regreso con este simpático tutorial en el que crearemos una aplicación capaz de reconocer imágenes sin necesidad de que tengamos ningún conocimiento previo sobre ello! Todo esto llega gracias a...

Microsoft Cognitive Services

¿Cómo obtengo mi API Key?

Antes de empezar, necesitamos adquirir un API Key, la cual usaremos para acceder a nuestro servicio cognitivo. Lo único que tienes que hacer es ingresar a este link: Microsoft Cognitive Services.

Una vez dentro, le das a Get started for free y luego a Let's go. Te pedirá que te logees con una cuenta de correo para que luego escojas el servicio inteligente de tu preferencia de la lista que se te presenta. En este caso, yo escogí el de Computer Vision.

Listo! Ahora deberás ver una pantalla donde te mostrarán tus 2 API keys generadas y listas para usar. Más o menos así:

Puedes usar cualquiera de las dos sin ningún problema!

¿Y ahora cómo lo uso?

Hay varias operaciones que puedes solicitarle al servicio que haga por ti, pero la que usaremos para este caso será la de análisis de imágenes.
Existen principalmente 2 formas de hacer uso de nuestro servicio: utilizando las librerías ya construidas o llamándolo como cualquier otro servicio web a través del protocolo HTTP (usando los verbos GET, POST, PUT, etc.).

En este ejemplo utilizaremos la primera forma, que es tal vez la más sencilla, pero si quieres probar de la otra manera puedes consultar este otro artículo para consumir servicios en UWP (aplica también para Xamarin):
Artículo: Cómo consumir servicios web

¡Manos a la obra!

Llegó la hora de abrir Visual Studio y crear nuestro nuevo proyecto (en este caso, Xamarin.Android). Si quieres ver también un tutorial para Xamarin.iOS puedes seguir este otro enlace:
Artículo: Building smart apps with MS Cognitive Services

Lo que construiremos esta vez sera una aplicación que hará uso de la cámara de nuestro dispositivo para tomar una foto a un objeto cualquiera y luego analizarla para describir qué es lo que contiene dicha imagen.

Cabe recalcar que esto no tiene una precisión del 100%, así que tal vez algunas cosas no estarán totalmente correctas, pero solo es cuestión de esperar a que siga aprendiendo :)!

Definiendo la interfaz

Tendremos dos pantallas: una de presentación, y otra para el resultado.

Presentación: Main.axml

Resultado: Result.axml

Ambos archivos deben crarse en la carpeta layout dentro de Resources.

Cómo acceder a la cámara

Primero debemos declarar 2 permisos para nuestra aplicación de la siguiente manera:
Clic derecho al proyecto > Properties > Android Manifest > Seleccionar de la lista: WRITE_EXTERNAL_STORAGE y CAMERA.

Luego de esto, dentro de nuestro MainActivity.cs escribiremos el siguiente código para poder tener acceso a la cámara y guardar la imagen resultante en nuestro teléfono.

No profundizaré demasiado en esta parte para no hacer más largo el tutorial y enfocarnos en lo importante. Sin embargo, te animo a analizar el código y dejarme tus comentarios si algo no se entiende o deseas contribuir a mejorarlo.

Utilizando nuestro servicio para analizar imágenes

Bien, ahora que ya tenemos nuestra imagen guardada, solo necesitaremos enviarla a nuestro servicio para que la analice y nos devuelva sus resultados.

Lo primero que tenemos que hacer es agregarle un paquete Nuget a nuestro proyecto dándole clic derecho > Manage Nuget Packages > buscamos Microsoft.ProjectOxford.Vision y lo instalamos. Con esto, ya tenemos listas las librerías para acceder a nuestro servicio.

Cognitive Services no acepta imágenes demasiado grandes (ver documentación para más info), así que habrá que asegurarnos de ajustar su tamaño antes de enviársela.

Ahora tendremos que crear un nuevo Activity que yo nombré ResultActivity. Dentro de él tendremos varios métodos que principalmente se encargarán de ajustar el tamaño de la imagen a un máximo de 800px (método ResizeImage), luego enviarla a nuestro servicio inteligente (método DescribeImage) y esperar su resultado para mostrarlo. Además, coloqué un método ShowPicture para que podamos ver la imagen tomada justo debajo del resultado. El código es el que viene a continuación...

Cabe resaltar que es necesario cambiar el API Key que declaramos en la línea 21 (SUBSCRIPTION_KEY) por la que acabamos de obtener en el primer paso.

Listo! Ahora a probar :P!

Si has seguido todos los pasos al pie de la letra, no deberías tener problemas corriendo tu aplicación en tu dispositivo móvil. Aquí les mostraré un ejemplo de la app corriendo en mi celular.

BINGO!

Efectivamente es: "Una manzana encima de una mesa" :D.

Si deseas ver el código completo, lo puedes encontrar aquí: Código fuente en Github.

Además, puedes consultar la documentación oficial para más información:
https://www.microsoft.com/cognitive-services/en-us/documentation