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:
- Quickstart: Create an image classification project with the Custom Vision .NET SDK
- Quickstart: Create an object detection project with the Custom Vision .NET SDK
Para este ejemplo, he creado un modelo del tipo [Object Detection, Custom] utilizando un par de figuras de Marvel.
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.
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.
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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); | |
} | |
} | |
} |
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
- Custom Vision
- Quickstart: Create an image classification project with the Custom Vision .NET SDK
- Quickstart: Create an object detection project with the Custom Vision .NET SDK
Windows 10 and YOLOV2 for Object Detection Series
- Introduction to YoloV2 for object detection
- Create a basic Windows10 App and use YoloV2 in the camera for object detection
- Transform YoloV2 output analysis to C# classes and display them in frames
- Resize YoloV2 output to support multiple formats and process and display frames per second
- How to convert Tiny-YoloV3 model in CoreML format to ONNX and use it in a Windows 10 App
- Updated demo using Tiny YOLO V2 1.2, Windows 10 and YOLOV2 for Object Detection Series
- Alternatives to Yolo for object detection in ONNX format