#WinML – #CustomVision, object recognition using Onnx in Windows10, calculate FPS

Hi !

Quick post today. And it’s mostly as a brain reminder on the best way to perform a Frames Per Second calculation when we are analyzing images using a ONNX model. In the final UWP app, I added a top right label displaying the current date and time, and the processed FPS

01 custom vision uwp frame analysis using onnx fps

And the code behind all this is very simple, specially line 10

So, I’ll search for my sample next time I need to display this.

The full app can be seen in https://github.com/elbruno/events/tree/master/2019%2001%2010%20CodeMash%20CustomVision/CSharp/CustomVisionMarvelConsole01

Happy Coding!

Greetings @ Burlington

El Bruno

References

My Posts

Windows 10 and YOLOV2 for Object Detection Series

Advertisements

#Onnx – Reconocimiento de objetos con #CustomVision y ONNX desde aplicaciones Windows 10 con Windows ML, Frames de objetos detectados

Buenas !

Custom Vision nos permite crear modelos de reconocimiento de objetos. Una vez entrenados estos modelos, podemos analizar una imagen y el modelo nos ofrecerá como respuesta

  • Una lista de objetos [Tags] detectados en cada imagen
  • Para cada Tag tendremos también la probabilidad [score] asociado al mismo y una serie de valores numéricos con la posición del objeto encontrado dentro de la imagen analizada

En posts anteriores escribí sobre como realizar el análisis de objetos desde el feed de una WebCam en una aplicación Windows 10. El siguiente paso es mostrar el Frame del objeto reconocido.

01 custom vision analysis and draw frame

El siguiente código muestra un ejemplo sobre como mostrar los frames en la Windows 10 App utilizando un Canvas. Las 2 funciones principales son

  • DrawFrames() donde realizado una iteración sobre las predicciones realizadas
  • DrawFrame() esta es la función que se encarga de dibujar el Frame en tiempo real. Hay un poco de matemáticas en la misma para ajustar los valores de ONNX al tamaño real del Canvas y de la WebCam.

Por ejemplo, estos son los valores con los que trabajo en un tag de Iron Fist en la imagen de este post.

  • El tamaño del Canvas es de ActualWidth: 1356, ActualHeight: 700
  • Los valores que retorna ONNX son Top: 20.80284, Left: 73.15757, Height: 54.41817, Width: 24.3813
  • El Frame a mostrar se dibujará con los siguientes valores Y: 140, x: 989, Height: 378, Width: 325

En siguientes posts comentare detalles finales sobre como medir el tiempo de procesamiento y otros tips más.

The full app can be seen in https://github.com/elbruno/events/tree/master/2019%2001%2010%20CodeMash%20CustomVision/CSharp/CustomVisionMarvelConsole01

Happy Coding!

Greetings @ Burlington

El Bruno

References

My Posts

Windows 10 and YOLOV2 for Object Detection Series

#Onnx – Object recognition with #CustomVision and ONNX in Windows applications using Windows ML, drawing frames

Hi !

Custom Vision Allows us to create models of Object recognition. Once these models are trained, we can analyze an image and the model will offer us as an answer

  • A list of [Tags] objects detected in each image
  • For each TAG we will also have the probability [score] associated with it and a series of numerical values with the position of the object found within the analyzed image

In previous posts I wrote about how to perform object analysis from the feed From a Webcam In a Windows 10 application. The next step is to show the Frame of the recognized object.

01 custom vision analysis and draw frame

The following code shows an example of how to show the frames In the Windows 10 App using a Canvas. The 2 main functions are

  • DrawFrames(Where an iteration of the predictions made
  • DrawFrame() This is the function that takes care of drawing the Frame in real time. There’s a little bit of math in it to adjust the ONNX values to the actual size of the Canvas and the Webcam.

For example, these are the values that I work with in a tag of Iron Fist In the image of this post.

  • The Canvas size is Actual Width: 1356, Actual Height: 700
  • The values returned by ONNX prediction process are Top: 20.80284, Left: 73.15757, Height: 54.41817, Width: 24.3813
  • The Frame To show will be drawn with the following values Y: 140, x: 989, Height: 378, Width: 325

In following posts I’ll comment on final details on how to measure processing time and other tips.

The full app can be seen in https://github.com/elbruno/events/tree/master/2019%2001%2010%20CodeMash%20CustomVision/CSharp/CustomVisionMarvelConsole01

Happy Coding!

Greetings @ Burlington

El Bruno

References

My Posts

Windows 10 and YOLOV2 for Object Detection Series

#Onnx – Object recognition with #CustomVision and ONNX in Windows applications using Windows ML

Hi!

One of the most interesting options that gives us Custom Vision, is the ability to export a model trained to be used on other platforms, without invoking Custom Vision own web service.

The 4 options available that we have today are

  • CoreML, iOS 11
  • TensorFlow, Android
  • ONNX, Windows ML
  • DockerFile, Azure IoT Edge, Azure Functions, AzureML

cv marvel export to ios tensorflow onnx dockerfile

I’ll share my experiences using the ONNX exported models being used in a Windows 10 Universal App.

The first thing we have to know is the version of Windows 10 with which we will work, because at the time of export we will see that we have 2 options

  • ONNX 1.0 for Windows 10 lower than 17738
  • ONNX 1.2 for Windows 10 higher than 17738

I am currently working with Win10 18317, so my examples will be for the ONNX version 1.2. The exported file is a zip that internally has the following files

  • CSharp\ObjectDetection.cs
  • python\cntk_predict.py
  • python\object_detection.py
  • labels.txt
  • model.onnx

The directories CSharp and Python have sample files to use the model with these languages. The file [labels.txt] contains the labels defined in the model, and finally the ONNX file is the model per se.

custom vision marvel onnx 1.2 exported files

For this example, I will use a blank App UWP with the following features

  • Added package NuGet Microsoft.Toolkit.Uwp.UI. Controls
  • Using the same, to access the webcam at the beginning of the app
  • We process each of the frames That are received from the webcam

Sample Code

At this point, we can now use our exported model to analyze images. We must add the file ONNX to our project, and configure the same to be a content and to be copied to the output build of our application.

An important detail here, is that if you have [Visual Studio Tools for AI] installed in Visual Studio, when you add this file the extension will automatically add a CS class to use with the model.  This class requires a lot of work to work, I recommend deleting it, as we will use as a base that is exported from Custom Vision, [ObjectDetection.cs].

custom vision marvel add onnx file to solution in vs

The file [ObjectDetection.cs] contains everything you need to use our model In a UWP App. At the start of the App we initialize the ONNX model, and in each Frame That is received from the camera will process the same to show the results in the window of Debug.

Now, for our app Work properly, you have to make a series of changes to the file [ObjectDetection.cs]. The changes are mainly related to the way in which WinML Processes the output when analyzing an image:

custom vision marvel uwp app running and analyzing

To be able to work this way, I added a new binding To process the output of the processing. This binding Respects the contract of ONNX with an array Long [1, 4].

This way we have no mistake of those “funny” that make you spend pleasant moments.

The full app can be seen in https://github.com/elbruno/events/tree/master/2019%2001%2010%20CodeMash%20CustomVision/CSharp/CustomVisionMarvelConsole01

Happy Coding!

Greetings @ Burlington

El Bruno

References

My Posts

Windows 10 and YOLOV2 for Object Detection Series

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

Buenas!

Una de las opciones mas interesantes que nos brinda Custom Vision, es la capacidad de exportar un modelo entrenado para ser utilizado en otras plataformas, sin invocar el servicio web propio de Custom Vision.

Las 4 opciones disponibles que tenemos hoy son

  • CoreML, iOS 11
  • TensorFlow, Android
  • ONNX, Windows ML
  • DockerFile, Azure IoT Edge, Azure Functions, AzureML

cv marvel export to ios tensorflow onnx dockerfile

En el post de hoy comentare mi experiencia utilizando el modelo exportado a formato ONNX y siendo utilizado en una Universal App en Windows 10.

Lo primero que tenemos que conocer es la version de Windows 10 con la que trabajaremos, ya que al momento de exportar veremos que tenemos 2 opciones

  • ONNX 1.0 para versiones de Windows 10 menores que 17738
  • ONNX 1.2 para versiones de Windows 10 superiores a 17738

Actualmente estoy trabajando con Win10 18317, así que mis ejemplos serán para la version ONNX 1.2. El archivo exportado es un zip que internamente posee los siguientes archivos

  • CSharp\ObjectDetection.cs
  • python\cntk_predict.py
  • python\object_detection.py
  • labels.txt
  • model.onnx

Los directorios CSharp y Python poseen archivos de ejemplo para utilizar el modelo con estos lenguajes. El archivo [labels.txt] posee los labels definidos en el modelo, y finalmente el archivo ONNX es el modelo.

custom vision marvel onnx 1.2 exported files

Para este ejemplo, utilizare una UWP App en blanco con las siguientes características

  • Agregado el paquete NuGet Microsoft.Toolkit.Uwp.UI.Controls
  • Utilizando el mismo, para acceder a la webcam en el inicio de la app
  • Procesamos cada uno de los frames que se reciben desde la webcam

Sample Code

En este momento, ya podemos utilizar nuestro modelo exportado para analizar las imágenes de las cámaras. Debemos agregar el archivo ONNX a nuestro proyecto, y configurar el mismo para que sea un contenido y para que se copie al output build de nuestra aplicación.

Un detalle importante para tener en cuenta es que si tenemos instalada [Visual Studio Tools for AI] en Visual Studio, al momento de agregar este archivo, la extensión nos agregara automáticamente una clase CS para utilizar con el modelo.  Esta clase requiere bastante trabajo para funcionar, yo recomiendo borrarla, ya que utilizaremos como base la que se exporta desde Custom Vision, [ObjectDetection.cs].

custom vision marvel add onnx file to solution in vs

El archivo [ObjectDetection.cs] contiene todo lo necesario para utilizar nuestro modelo en una UWP App. En el inicio de la App inicializaremos el modelo ONNX, y en cada Frame que se reciba de la cámara procesaremos el mismo para mostrar los resultados en la ventana de Debug.

Ahora bien, para que nuestra app funcione correctamente, hay que hacer una serie de cambios en el archivo [ObjectDetection.cs]. Los cambios están principalmente relacionados en la forma en la que WinML procesa el output cuando se analiza una imagen

custom vision marvel uwp app running and analyzing

Para poder trabajar de esta forma, he agregado un nuevo binding para procesar el output del procesamiento. Este binding respeta el contract de ONNX con un array Long [1, 4].

De esta forma no tenemos ningún error de esos “divertidos” que te hacen pasar ratos agradables.

The full app can be seen in https://github.com/elbruno/events/tree/master/2019%2001%2010%20CodeMash%20CustomVision/CSharp/CustomVisionMarvelConsole01

Happy Coding!

Saludos @ Burlington

El Bruno

References

My Posts

Windows 10 and YOLOV2 for Object Detection Series

#Onnx – Object recognition with #CustomVision and ONNX in Windows applications using WinML

Hi!

After a couple of weeks of almost no posts, mostly because of holidays, family trips and some fever days at home, now it’s time to get back to blogging. One of the outstanding issues I have to write is related on how to use ONNX models exported from Custom Vision projects (CV from now on More).  Let’s start With the definition of this service:

The Azure Custom Vision API is a cognitive service that lets you build, deploy and improve custom image classifiers. An image classifier is an AI service that sorts images into classes (tags) according to certain characteristics. Unlike the Computer Vision service, Custom Vision allows you to create your own classifications.

There are many tutorials on how to create a CV project, I recommend the official Microsoft documentation, for example:

For this series of posts, I’ve created a [custom object detection] model using some of my Marvel figures.

marvel custom vision sample

The model is successfully trained using 3 [labels]

  • Venom
  • Rocket_Racoon
  • Iron_Fist

The metrics of this are pretty good, with 100% Precision, 100% Recall and 100% mAP. From the official documentation, let’s recap on this terms.

Precision indicates the fraction of identified classifications that were correct. For example, if the model identified 100 images as dogs, and 99 of them were actually of dogs, then the precision would be 99%.
Recall indicates the fraction of actual classifications that were correctly identified. For example, if there were actually 100 images of apples, and the model identified 80 as apples, the recall would be 80%.
.

marvel custom vision iteration 3 trained

The model also seems to work very well with simple images of these toys. The test from the URL of customvision.ai shows us that using photo of Venom, the service test return the Venom label with more 90% of score.

marvel custom vision test with venom toy

The simplest way to use this model is by making an HTTP call. The following example shows how to make this call from a app Of the console in C#. The full app can be seen in https://github.com/elbruno/events/tree/master/2019%2001%2010%20CodeMash%20CustomVision/CSharp/CustomVisionMarvelConsole01, although it is very simple

Well, in next posts show how to export this model to ONNX format and then how to use the file ONNX in a app Windows or in a container with Docker..

Happy Coding!

Greetings @ Toronto

El Bruno

References

Windows 10 and YOLOV2 for Object Detection Series

 

#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

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

 

#Event – Resources used on my @CodeMash session [How a PoC at home can scale to Enterprise Level using #CustomVision APIs]

code mash bruno session

Hi !

What an amazing time at CodeMash (http://codemash.org/). This conference is one the best experiences I’ve had so far. I’ll write a more detailed post next week, this one is to share some of the materials used during my session

How a PoC at home can scale to Enterprise Level using Custom Vision APIs

It all started with a DIY project to use Computer Vision for security cameras at home. A custom Machine Learning model is the core component used to analyze pictures to detect people, animals and more in a house environment. The AI processing is performed at the edge, in dedicated hardware and the collected information is stored in the cloud.

The same idea can be applied to several CCTV scenarios, like parking lots, train stations, malls and more. However, moving this into enterprise scale brings a set of challenges, which are going to be described and explained in this session.

These are the slides I’ve used

And the source code is available here

https://github.com/elbruno/events/tree/master/2019%2001%2010%20CodeMash%20CustomVision

In the source code you can find the console and Windows 10 app samples I’ve coded live and also the exported images of my custom vision demo project in windows, linux and raspberry pi flavors. The 3rd one is where I spent some time updating the original linux one to work on the small device.

And as usual a couple of interesting links

Greetings @ Sandusky, Ohio

El Bruno

#MLNet – Looking at data in the Pipeline in version 0.7.0

Hi!

With the new changes In Machine Learning.Net with the 0.7.0 version, the ability to peek in the data while is processed in each step of the pipeline is a little more complicated. A while ago, explain how we could do this in the post [Understanding the step bystep of Hello World]. However, ML.Net now uses Lazy objects, so it is not possible to debug in this step-by-step mode.

One of the options that we have available, is detailed in the ML.Net Cookbook, in the section [How do I look at the intermediate data?] and a complete explanation can be read in [Schema comprehension in ML.NET]

Well, the machine Learning.Net team has created a series of operations that can help us with these scenarios in the class [https://github.com/dotnet/machinelearning-samples/blob/master/samples/csharp/common/ConsoleHelper.cs]. In the following example, based on the examples of my Machine Learning.Net sessions, I use these functions to display the first 4 rows of the initial data set and also to display the values created for the Features column

So far, it works 😀

Happy Coding.

Greetings @ Microsoft IoT

El Bruno

References

My Posts

#MLNet – Visualizando datos del Pipeline en la versión 0.7.0

Buenas!

Con los nuevos cambios en Machine Learning.Net con la versión 0.7.0, la capacidad dever paso a paso como los datos se procesan es un poco mas complicado. Hace untiempo, explique cómo podíamos hacer esto en el post [Understanding the step bystep of Hello World]. Sin embargo, ahora ML.Net utiliza Lazy objects, con lo que no es posible depurar en este modo paso a paso.

Una de las opciones que tenemos disponibles, se detalla en el ML.Net Cookbook, en la sección[How do I look at the intermediate data?] Y una explicación completa se puede leer en [Schema comprehension in ML.NET]

Pues bien, el equipo de Machine Learning.Net ha creado una serie de operaciones que pueden ayudarnos con estos escenarios en el repositorio de Samples en la clase [https://github.com/dotnet/machinelearning-samples/blob/master/samples/csharp/common/ConsoleHelper.cs]. En el siguiente ejemplo, basado en los ejemplos de mis sesiones de MachineLearning.Net, utilizo estas funciones para mostrar las primeras 4 filas del set de datos inicial y también para mostrar cómo se construyen los valores en la columna Features

Lo apuntare como una solución.

Happy Coding!

Saludos @ Microsoft IoT

El Bruno

References

My Posts