#WinML – Tutorial para convertir YoloV3 de CoreML a Onnx para utilizarlo en una #Windows10 App

Crear una Windows 10 UWP App y utilizar YoloV2 para reconocer objetos


Buenas !

En el post de hoy comentare como descargar la última versión de Tiny-YoloV3 y utilizarla en la UWP App que cree en post anteriores. Solo como reminder, la versión que utilice era Tiny-YoloV2 que es la que esta disponible en formato Onnx para descargar desde Azure AI Gallery.

Podemos descargar Tiny-YoloV3 desde su página oficial, sin embargo yo trabajare con una versión que ya está compilada en formato CoreML, que el formato de ML que se suele utilizar en apps iOS (ver referencias).

Pues bien, para convertir el modelo de CoreML a Onnx, utilizaremos Visual Studio Tools for AI, y el siguiente conjunto de software

Una vez instalado todo el software, podemos seguir el paso a paso de [AI Converting models to ONNX] para convertir nuestro modelo. Sin embargo, el camino no es tan simple como parece. Lo 1ro que nos podemos encontrar son errores como el siguiente

01 thanks Python

Problemas con Python, en mi caso tenia varias versiones de Python instaladas, pero el IDE no tenia ninguna marcada como [Default]. Desde el panel [Pythin Environments] se puede solucionar esto

01 1 Python environments

El siguiente problema que necesito un poco de configuración de mi parte, estaba relacionado con prerequisitos para la conversión. Todo comienza con [Missing package WinMLTools]

—————————

Error

—————————

Missing package WinMLTools, please check details in output window.

—————————

OK  

—————————

 

Traceback (most recent call last):

  File “C:\Users\<Bruno>\AppData\Local\Microsoft\VisualStudio\15.0_e5344afb\Extensions\kzqekf1z.44v\RuntimeSDK\model\model_converter_cli.py”, line 76, in check_winmltools_installed

    import winmltools

ModuleNotFoundError: No module named ‘winmltools’

Sin embargo, despues de investigar un rato, estas son los 2 packages que necesito instalar

Microsoft ML Tool (winmltools)

pip3 install winmltools==0.1.0.5072

CoreML Tools

pip3 install “git+https://github.com/apple/coremltools@v0.8”

Claro, antes hay que actualizar Python

03 upgrade pip.png

Y ya podemos lanzar nuevamente la operación de conversión

07 01 convert.png

Y pocos segundos después ya tenemos nuestro Tiny-YoloV3 en formato Onnx

07 convert running

Como el modelo respeta el Input / Output de la versión anterior, solo debemos reemplazar el archivo en nuestra solución. Yo he agregado el nuevo Onnx solo para tener un poco mas de control sobre el ejemplo.

08 Sol Onnx.png

Como siempre he actualizado el ejemplo completo en GitHub

https://github.com/elbruno/Blog/tree/master/20180709%20UwpMLNet%20TinyYoloV3

 

Happy Coding!

Saludos @ Burlington

El Bruno

References

#WinML – Problems With ONNX and Machine Learning.Net in the latest versions of #Windows10 Insiders

Hi!

After writing a step by step on how to use YoloV2 in a Windows App 10, I find that in the latest versions of Windows Insider, WinML It’s not working properly.

Windows 10 and YOLOV2 for Object Detection Series

 

I’ve reported the problem here Https://aka.ms/AA1sy9u And in my particular case in my Device With the version [17711.1000] as something fails in the UWPs App that use ONNX.

01

On another machine with version [17134.1] and it works properly

Happy Coding!

Greetings @ Toronto

El Bruno

References

#WinML – Problemas con ONNX y Machine Learning.Net en las versions de #Windows10 Insiders

Buenas!

Después de escribir un paso a paso sobre como utilizar YoloV2 en una App Windows 10, me encuentro con que en las ultimas versiones de Windows Insider, WinML no funciona correctamente.

Crear una Windows 10 UWP App y utilizar YoloV2 para reconocer objetos

He reportado el problema aquí https://aka.ms/AA1sy9u y en mi caso particular en mi device con la versión [17711.1000] pues algo falla en las UWPs app que utilizan ONNX.

01.png

En otra máquina con versión [17134.1] funciona correctamente

Happy Coding!

Saludos @ Toronto

El Bruno

References

#WinML – How to create a #Windows10 App using #YOLO for object detection (4 of 4)

Windows 10 and YOLOV2 for Object Detection Series


Hi!

Let me start from my previous post where I already coded a a real-time video camera feed process using with Tiny-YoloV2. The model returns results in a 416×416 size image, and that’s why the detected frame with the person looks kind of weird.

01

It’s not complicated to work with the output so it can be adapted to the size of the Webcam control, only a couple of lines of code.

And in this way, we can draw the frames with the right format. In the following image it is possible to see how a person is detected, with a low precision score and as well as one of the pictures on the wall it is detected as a monitor.

02

From here, it’s all about optimization, for example, take the value of the webcam control only when the app is resized.

In the final example, I have also added a visual indicator as a status bar, which shows the number of frames processed per second and the real size of the elements in the App.

03

The full code for the example can be downloaded from

https://github.com/elbruno/Blog/tree/master/20180704%20UwpMLNet%20TinyYoloV2

Happy Coding!

Greetings @ Toronto

El Bruno

References

#WinML – Creando una #Windows10 App con #YOLO para reconocer objetos (4 de 4)

Crear una Windows 10 UWP App y utilizar YoloV2 para reconocer objetos


Buenas!

Si retomamos el post anterior veremos que ya tenemos un proceso en tiempo real del video de la webcam analizado con Tiny-YoloV2. El modelo retorna resultados en una imagen de tamaño 416×416, y es por eso por lo que la imagen anterior el Frame de la persona se ve con un aspecto extraño.

01

El tratamiento para que el output se adapte al tamaño del control del WebCam puede solucionarse con 2 líneas de código.

 

 

Y de esta forma, ya podemos dibujar los Frames con el aspecto correcto. En la siguiente imagen es posible ver como se detecta una persona, con un bajo score de precisión y como además uno de los cuadros de la pared se lo detecta como un monitor.

02

A partir de aquí se pueden optimizar muchas cosas, por ejemplo, solo tomar el valor del tamaño

del canvas en el Resize de la App.

 

 

En el ejemplo final, he agregado además un indicador visual que muestra la cantidad de frames procesados por segundo y el tamanio real con el que se esta trabajando.

03

El código completo del ejemplo se puede descargar desde

https://github.com/elbruno/Blog/tree/master/20180704%20UwpMLNet%20TinyYoloV2

Happy Coding!

Saludos @ Mississauga

 

El Bruno

References

#WinML – How to create a #Windows10 App using #YOLO for object detection (3 of 4)

Windows 10 and YOLOV2 for Object Detection Series


Hi!

Today I start with the final UWP App running because much of the post will be code and more code. The expected output in a Windows 10 object recognition App with YoloV2 is similar to the following image

01

Following in the footsteps of my previous post, we were with the result of the process of our Webcam With YoloV2 and that is an array of 21125 Numbers Float. Well, this number is not trivial, as rereading the documentation of YOLOV2 we see that YOLO divides the image into a 13-by 13-cell grid:

02

Each of these Cells It is responsible for predicting 5 bounding boxes. A bounding box describes the rectangle that contains an object. and from here The number

13 * 13 * 125 = 21125

There are many posts that describe how Yolo works internally, I left some in the references if someone is interested in the details.

Well, in this scenario the next step was to start translating that Grid[21125] in C# objects to work with. As the internet is a very broad source of knowledge, instead of translating some of the Python classes that already exist, I saw that Rene Schulte It had between its GitHub repositories a Fork From another repo where you could see the following classes

  • YoloWinMLParser.cs
    • This class is a parser to convert the Grid In a collection of Frames with the size and location coordinates of the objects detected in the image.
  • YoloBoundingBox.cs
    • This class represents a Frame of detected object.

To show these frames, we add a Canvas About the control that shows the Feed of the camera.

03

The following code completes the example, with the following considerations

  • There are a number of private variables to work with the model, the collection of frames and the visual styles with which they are painted.
  • The frames of people are painted in green, the other objects in yellow

The only detail that remains to comment is that YoloV2 is designed to work with images of size 416 x 416. In this case you have to resize the control of Webcam and the Canvas To that Size So that the frames are displayed in the correct position.

In the next post I will share the final example, and also add some work of Rescaling To be able to support other definitions different from 416 x 416.

Happy Coding!

Greetings @ Toronto

El Bruno

References

#WinML – Creando una #Windows10 App con #YOLO para reconocer objetos (3 de 4)

Crear una Windows 10 UWP App y utilizar YoloV2 para reconocer objetos


 

Buenas!

Hoy empiezo por el resultado final ya mucha parte del post será código y mas código. El output esperado en una Windows 10 App de reconocimiento de objetos con YoloV2 es similar a la siguiente imagen

01

Siguiendo con los pasos de mi post anterior, nos encontrábamos con el resultado del proceso de nuestra WebCam con YoloV2 y que es un array de 21125 números Float. Pues bien, este numero no es trivial, ya que releyendo la documentación de YoloV2 vemos que YOLO divide la imagen en una cuadrícula de 13 por 13 celdas:

02

Cada una de estas celdas es responsable de predecir 5 cuadros delimitadores. Un cuadro delimitador describe el rectángulo que encierra un objeto. Y de aquí el numero

13 * 13 * 125 = 21125

Hay muchos posts que describen como funciona Yolo internamente, he dejado algunos en las referencias por si alguien esta interesado en los detalles.

Pues bien, en este escenario el siguiente paso era comenzar a traducir ese Grid[21125] en objetos C# con los que trabajar. Como internet es una fuente de conocimiento muy amplia, en lugar de traducir alguna de las clases Python que ya existen, vi que Rene Schulte tenía entre sus repositorios de GitHub un fork de otro repo donde se podían ver las siguientes clases

  • YoloWinMLParser.cs
    • Esta clase es un parser para convertir la Grid en una colección de frames / marcos con el tamaño y coordenadas de los objetos detectados en la imagen.
  • YoloBoundingBox.cs
    • Esta clase representa el marco / frame de un objeto encontrado.

Para mostrar estos frames, agregamos un Canvas sobre el control que nos muestra el feed de la cámara.

03

El siguiente código completa el ejemplo, con las siguientes consideraciones

  • Hay una serie de variables privadas para trabajar con el modelo, la colección de frames y los estilos visuales con los que se pintaran los mismos.
  • Los Frames de personas se pintan en verde, los demás objetos en amarillo

El único detalle que queda pendiente de comentar es que YoloV2 esta pensado para trabajar con imágenes de tamaño 416 x 416. En este caso hay que redimensionar el control de WebCam y el Canvas a ese tamanio para que los frames se muestren en la posición correcta.

En el siguiente post compartiré el ejemplo final, y además agregare un poco de trabajo de reescalado para poder soportar otras definiciones diferentes a 416 x 416.

Happy Coding!

Saludos @ Toronto

El Bruno

References

#WinML – How to create a #Windows10 App using #YOLO for object detection (2 of 4)

Windows 10 and YOLOV2 for Object Detection Series


Hi!

Now we already have downloaded the YoloV2 ONNX file. We can create an UWP App to use the model. Here’s the step by step and some comments

1. We create a new Windows 10 UWP App. As always the name is super original

01

2. We are going to use the camera as images source to be processed with YoloV2. There are many examples of how to do this. In this case we will use a control of Windows Community Toolkit V 3.0 (as I wrote in a previous post). We add the following Packages Via NuGet

  • Microsoft.Toolkit.Uwp.UI
  • Microsoft.Toolkit.Uwp.UI.Controls

02

3. We add a control CameraPreview In our Xaml and we’re already 2 lines away of having the camera working.

03

4. We enable the necessary permissions to use the camera in the app manifest. With The following lines our app have a functional camera

04

5. The time has come to start using YoloV2. The latest versions of Visual Studio 2017 allow us to import an ONNX model into a project and the IDE will create the classes needed to work with it. We add as an existing file to the file [Tiny-YOLOv2. Onnx].

Our solution should be similar to the following

05

6. The class that is generated in VS to work with the model It’s pretty ugly.

06

7. My suggestion, replace [8d4d0fa662b14686b1865e0e6d3c598eByTinyYoloV2]

07

8. Now we can see the generated class and within it we can find 3 classes

  • An Input class for the Model
  • An Output class for the Model
  • A class to work with the Model

It’s time to load the model into our App. We do this before initializing the camera as shown in the following Code

 

9. Because we will use the model as part of our App, we have to define that it be treated as a Content in the process of Build

08

10. The next step is to evaluate a Frame Of the camera with the YOLOV2 model. Here the code shows us how we use the classes we create when we import the model.

11. Finally a Break Point is an useful way to show the output of the model and the information of the model output, which we will have to process later.

09

 

Well, at this point we are already using the model YoloV2 to analyze the frames of the camera. In the following posts I’ll write on how to work with the output of the model to get information which makes sense to us!

Important: At some point I should write about the model conversion capabilities that Visual Studio Tools brings to us For AI.

Happy Coding!

Greetings @ Toronto

El Bruno

References

#WinML – Creando una #Windows10 App con #YOLO para reconocer objetos (2 de 4)

Crear una Windows 10 UWP App y utilizar YoloV2 para reconocer objetos


Buenas!

Ahora que ya tenemos el archivo Yolo.ONNX es momento de crear una app en la que utilicemos el mismo. He aquí el paso a paso y algunos comentarios

1. Creamos una nueva Windows 10 UWP App. Como siempre el nombre es super original

01

2. Como vamos a utilizar la cámara como feed de imágenes para procesarlas con YoloV2. Hay muchos ejemplos sobre como realizar esto. En este caso utilizaremos un control de Windows Community Toolkit V 3.0 (como ya escribí en un post anterior). Agregamos los siguientes packages vía NuGet

  • Microsoft.Toolkit.Uwp.UI
  • Microsoft.Toolkit.Uwp.UI.Controls

02

3. Agregamos un control CameraPreview en nuestro Xaml y ya estamos a 2 lineas de tener la cámara funcionando.

03

4. Habilitamos los permisos necesarios para utilizar la camera en el manifiesto con con las siguientes líneas nuestra app ya tiene una camera funcional.

04

5. Llega el momento de comenzar a utilizar YoloV2. Las últimas versiones de Visual Studio 2017 nos permiten importar un modelo ONNX en un proyecto y se crearan las clases necesarias para trabajar con el mismo. Agregamos como un archivo existente al archivo [Tiny-YOLOv2.onnx].

Nuestra solución debería quedar similar a la siguiente

05

6. La clase que se genera en VS para trabajar con el modelo es bastante “fea”.

06

7. Mi sugerencia, reemplazar [8d4d0fa662b14686b1865e0e6d3c598e] por [TinyYoloV2]

07

8. Ahora si ya podemos ver la clase generada y dentro de la misma podremos encontrar 3 clases

  • Una clase de Input para el model
  • Una clase de Output para el model
  • Una clase para trabajar con el model

Es momento de cargar el modelo en nuestra app. Esto lo hacemos antes de inicializar la camera como muestra el siguiente codigo

 

9. Como utilizaremos el modelo como parte de nuestra app, tenemos que definir que el mismo sea tratado como un Content en el proceso de Build

08

10. El siguiente paso es evaluar un frame de la cámara con el modelo YoloV2. Aquí el código nos muestra como utilizamos las clases que creamos cuando importamos el modelo.

11. Finalmente un BreakPoint nos puestra como el output del modelo tiene [información], que deberemos procesar luego.

09

Importante: En algún momento debería escribir sobre las capacidades de conversión de modelos que nos trae Visual Studio Tools for AI. Si estas interesado puedes ver las referencias.

Pues bien, en este punto ya estamos utilizando el modelo YoloV2 para analizar los frames de la cámara. En los siguientes posts comentare como trabajar con el output del modelo para interpretar el mismo.

Happy Coding!

Saludos @ Toronto

El Bruno

References

#WinML – How to create a #Windows10 App using #YOLO for object detection (1 of 4)

Windows 10 and YOLOV2 for Object Detection Series


Hi!

Today’s post is the first one in a series where I’ll explain the steps needed to use YOLO object recognition model in a Windows 10 application. You Only Look Once (YOLO) is a pretty popular model, you only need to check the next trailer ti burn in desire to try the model

 

This model is a real-time neural network for object detection that detects 20 different classes. It is made up of 9 convolutional layers and 6 max-pooling layers and is a smaller version of the more complex full YOLOv2 network.

Now that we can use ONNX models in Windows 10, we can take advantage of the same. The first thing we must do is convert the model to ONNX format. We can use the ONNX tools, or download the already converted model from the Azure Artificial Intelligence Gallery:

Tiny YOLO V2

Now we only need Windows 10 and the latest Visual Studio 2017 version. In the Next Post Comment on the steps necessary to use YoloV2 in a Windows App 10.

Happy Coding!

Greetings @ Burlington

El Bruno

References