#Onnx – Reconocimiento de objetos con #CustomVision y ONNX desde aplicaciones Windows WinML.

Buenas!

Despues de un par de semanas de vacaciones, viajes y días de cama con fiebre, es momento de volver al blog. Uno de los temas pendientes que tengo para escribir es como utilizar modelos ONNX exportados desde Custom Vision (CV de ahora en más).  Empecemos con la definición de este servicio de Cognitive Services:

La API de Azure Custom Vision es un servicio de Azure Cognitive Services que le permite crear, implementar y mejorar clasificadores personalizados de imágenes. Un clasificador de imágenes es un servicio de IA que clasifica las imágenes en clases (etiquetas) de acuerdo con ciertas características. A diferencia de Computer Vision Service, Custom Vision le permite crear sus propias clasificaciones.

Hay muchos tutoriales sobre como crear un proyecto de CV, yo recomiendo la documentación oficial de Microsoft, por ejemplo:

Para este ejemplo, he creado un modelo del tipo [Object Detection, Custom] utilizando un par de figuras de Marvel.

marvel custom vision sample

Ya he creado y entrenado el modelo con 3 etiquetas [labels]

  • Venom
  • Rocket_Racoon
  • Iron_Fist

Las métricas de este son bastante buenas, con 100% Precision, 100% Recall y 100% mAP. Desde la doc oficial, he aquí la descripción de estos términos.

Precisión

Al clasificar una imagen, ¿cuál es la probabilidad de que el clasificador la clasifique correctamente? Aparte de todas las imágenes que se usan para entrenar al clasificador (perros y ponis), ¿qué porcentaje correcto obtuvo el modelo? 99 etiquetas correctas de 100 imágenes ofrecen una precisión del 99 %.

Recuperación

Aparte de todas las imágenes que se deberían haber clasificado correctamente, ¿cuántas identificó el clasificador correctamente? Una recuperación del 100 % significa que si hay 38 imágenes de perros en las imágenes que se usaron para entrenar al clasificador, el clasificador encontró los 38 perros.

marvel custom vision iteration 3 trained

El modelo además parece funcionar muy bien con imágenes simples de los juguetes. La prueba desde la URL de customvision.ai nos muestra que una foto de Venom nos retorna el label de Venom con mas 90% de score.

marvel custom vision test with venom toy

La forma mas simple de utilizar este modelo es realizando una llamada HTTP. El siguiente ejemplo muestra como hacer esta llamada desde una app de Consola en C#. La app completa se puede ver en https://github.com/elbruno/events/tree/master/2019%2001%2010%20CodeMash%20CustomVision/CSharp/CustomVisionMarvelConsole01, aunque el mismo es muy simple


using System;
using System.IO;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Threading.Tasks;
using Newtonsoft.Json;
using Newtonsoft.Json.Linq;
namespace CustomVisionMarvelConsole01
{
static class Program
{
static void Main()
{
MakePredictionRequest("IMG01.jpg").Wait();
Console.ReadLine();
}
static async Task MakePredictionRequest(string imageFilePath)
{
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Prediction-Key", "<Custom Vision Prediction Key>");
var url = "https://southcentralus.api.cognitive.microsoft.com/customvision/v2.0/Prediction/<Custom Vision AppKey>/image?iterationId=<Custom Vision IterationId>";
var byteData = GetImageAsByteArray(imageFilePath);
using (var content = new ByteArrayContent(byteData))
{
content.Headers.ContentType = new MediaTypeHeaderValue("application/octet-stream");
var response = await client.PostAsync(url, content);
var jsonResponse = await response.Content.ReadAsStringAsync();
var prettyJson = JToken.Parse(jsonResponse).ToString(Formatting.Indented);
Console.WriteLine(prettyJson);
}
}
static byte[] GetImageAsByteArray(string imageFilePath)
{
var fileStream = new FileStream(imageFilePath, FileMode.Open, FileAccess.Read);
var binaryReader = new BinaryReader(fileStream);
return binaryReader.ReadBytes((int)fileStream.Length);
}
}
}

view raw

CVConsoleApp.cs

hosted with ❤ by GitHub

Pues bien, en siguientes posts mostrare como exportar este modelo a formato ONNX y luego como utilizar el archivo ONNX en una app Windows o en un contenedor con Docker.

Happy Coding!

Saludos @ Toronto

El Bruno

References

Windows 10 and YOLOV2 for Object Detection Series

 

Leave a comment

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.

%d bloggers like this: