ML.NET avancé

Suite à la publication du 1er article disponible ici : https://hts-learning.com/blog/2023-05-15/ml_net_basics qui posait les bases du machine learning et des possibilités offertes , j’ai décidé d’écrire un second article mais cette fois-ci sur les images et la détection d’objets.

Cette fois-ci nous allons donc créer une application Blazor qui va nous permettre d’importer une image et en retour avoir un résultat sur la prédiction de cette image.

J’ai donc créé une application Blazor Server .NET 7.0.

Si nous tentons d’ajouter un nouveau modèle d’apprentissage , nous n’aurons pas la détection d’objets.

Nous allons donc devoir installer la dernière version de Model Builder disponible ici : https://marketplace.visualstudio.com/items?itemName=MLNET.ModelBuilder2022

Une fois l’extension installée nous allons pouvoir commencer avec notre modèle.

Pour cela, fais un clic droit sur votre projet pour rajouter un nouveau modèle machine learning comme suit :

Une nouvelle fenêtre va s’ouvrir vous permettant de choisir votre modèle et voici celui qui nous intéresse :

Je vous conseille d’utiliser le modèle GPU pour la détection d’objets :

Passons maintenant aux données.

Pour cela il va vous falloir un dataset avec des images et les annotations correspondantes.

Pour information, le dataset contient les images et les annotations contiennent les références aux images avec les annotations.

Les deux vont de pair et pour cet exemple je vais utiliser le format VOTT dont vous trouverez des informations ici : https://github.com/microsoft/VoTT

Concernant le format COCO, vous trouverez plus d’infos également ici : https://cocodataset.org/#home

Ces 2 formats sont des outils de “labelling” d’images. Par exemple si vous avez un dataset d’images de chats (un grand classique 😂🤣 ) il va falloir entourer le chat sur l’image comme dans l’exemple ci-dessous et l’outil sélectionné (VOTT ou COCO) va générer un fichier json contenant les information.

Revenons à nos moutons maintenant 😊 Je vous invite maintenant à télécharger le dataset ici pour la détection de panneaux “STOP” : https://aka.ms/mlnet-object-detection-tutorial-assets

Si vous souhaitez malgré tout utiliser votre propre dataset , téléchargez l’outil VOTT , mettez les labels sur vos images

Et rajoutez les tags en entourant l’élément que vous souhaitez détecter.

Si vous utilisez le dataset fourni par Microsoft ,il vous faudra modifier le chemin des images pour le votre. ( les images sont dans le dossier bien sur )

Une fois ceci fait, vous pouvez continuer et importer votre fichier json :

Et vous pouvez désormais entrainer votre modèle :

Cette étape peut être plus ou moins longue si comme moi, vous n’avez pas utilisé le GPU 😢😪

Voila le résultat une fois entrainé !

Maintenant que notre modèle est entrainé, nous allons pouvoir le tester et voir si il fonctionne correctement.

Pour cela passons à l’étape suivante :

Et effectivement cela fonctionne parfaitement !

Et pour finir le code prêt à être consommé 😎

Il est temps d’exploiter ce modèle dans notre application Blazor 😉

Nous allons donc reprendre la page “Index.razor” et rajouter un peu de code pour tester tout cela.

Il suffit de rajouter le code fourni par le modèle en lui passant un chemin vers un fichier

@page "/"
@using Microsoft.ML.Data;
<PageTitle>Index</PageTitle>
<h1>Hello, world!</h1>
Welcome to your new app.
<SurveyPrompt Title="How is Blazor working for you?" />
<InputText @bind-Value="imagePath"></InputText>
<button onclick="@ObjectDetectionImage">Object Detection</button>
@if(!string.IsNullOrEmpty(returnResult) )
{<p>@returnResult</p>
}
@code {
    private string imagePath = string.Empty;
    private string returnResult = string.Empty;
    protected override async Task OnInitializedAsync()
    {
        imagePath = "";
    }
    private async Task ObjectDetectionImage()
    {
        //Load sample data
        var image = MLImage.CreateFromFile(@$"{imagePath}");
        MLModel.ModelInput sampleData = new MLModel.ModelInput()
            {
                Image = image,
            };
        //Load model and predict output
        var result = MLModel.Predict(sampleData);
        imagePath = string.Empty;   
        returnResult = $"Predicted label : {result.PredictedLabel.FirstOrDefault()} \n Score result {result.Score.FirstOrDefault()}";
    }
}

L’exemple est ici très simple mais encore une fois, il nous donne le sentiment que tout peut être fait et laisse entrevoir beaucoup de possibilités avec la librairie ML.NET.

Nous pourrions assez facilement par exemple exploiter des photos ou des logs pour détecter des anomalies ou faire de l’analyse sur des lignes de production industrielle avec des photos ou des vidéos.

Le code est disponible ici : https://github.com/AlexCastroAlex/Blazor.ML.NET

A vous de jouer maintenant !

Have fun coding 😎