Win.ML vs ML.NET

Bei meinen Experimenten (auch so ein Machine Learning Terminus) bin ich über customvision.ai und das exportierte ONNX Model gestolpert. Dort wird C# Code generiert der Windows ML nutzt. Etwas was man in UWP Anwendungen nutzen kann. Eingeführt wurde dies 2018 mit dem Ziel Windows Plattform.

ML.NET ist eine Bibliothek und setzt auf den Cross Plattform Gedanken. Es lassen sich alle mögliche Modelltypen und Programmiersprachen bis hin zu Python einbinden. Ist halt in der Praxis durchaus eine komplexe Sache. Dazu aber in einem anderen Blog Artikel mehr.

In dem ZIP des ONNX Models findet sich eine Datei mit 300 Zeilen C# Code in ObjectDetection.cs. Die kann man samt den Model ganz lässig in ein Visual Studio UWP Projekt kopieren.

UWPONNX1 

In den Eigenschaften von model.onnx unbedingt die Option Kopieren (wenn neuer) auswählen, weil es sonst ohne Model zu einem Laufzeitfehler kommt.

Die UWP App bekommt nur einen Button um einen Fileopen Dialog zu öffnen. Dort wählt Benutzer ein Bild aus um es von der AI bewerten zu lassen. Mein Bild gezeichnet und per Snipp kopiert nicht in bester Qualität.

test

Im C# der Mainpage.xml.cs wird die aus dem Model kopierte (und automatisch generierte) Helperklasse instanziert und die Liste der möglichen Labels gefüllt.

   1:    public MainPage()
   2:    {
   3:        this.InitializeComponent();
   4:        LabelList= new List<string> { "Kreis", "Viereck", "Dreieck" };
   5:    }
   6:    private ObjectDetection onnx;
   7:    private IList<string> LabelList   ;

Die Auswertung erfolgt in meinen UWP Projekt per Debugger. Ist ja nur Windows ML Showcase. Weil eigentlich primäre Aufgabe die Analyse eines Videostreams ist, erwartet die Predict Methode ein Objekt vom Typ Videoframe. Wenn man sich das überlegt genial und genial einfach. UWP war schon cool.

   1:    private async void Button_Click(object sender, RoutedEventArgs e)
   2:    {
   3:        Uri fileUri = new Uri("ms-appx:///model.onnx"); // Pfad zur Datei im App-Paket
   4:        StorageFile sf = await StorageFile.GetFileFromApplicationUriAsync(fileUri);
   5:        onnx = new ObjectDetection(LabelList, 3, 0.3f, 0.45f);
   6:        onnx.Init(sf);
   7:        var picker = new Windows.Storage.Pickers.FileOpenPicker();
   8:        picker.ViewMode = Windows.Storage.Pickers.PickerViewMode.Thumbnail;
   9:        picker.SuggestedStartLocation = Windows.Storage.Pickers.PickerLocationId.DocumentsLibrary;
  10:        picker.FileTypeFilter.Add(".png"); 
  11:        StorageFile file = await picker.PickSingleFileAsync();
  12:        if (file != null)
  13:        {
  14:            var vf =await LoadImageToVideoFrameAsync(file);
  15:           var res= await onnx.PredictImageAsync(vf);

Letztendlich braucht es noch einen Konverter vom Bild zum Videoframe

   1:  public async Task<VideoFrame> LoadImageToVideoFrameAsync(StorageFile file)
   2:  {
   3:    using (IRandomAccessStream stream = await file.OpenAsync(FileAccessMode.Read))
   4:    {
   5:       BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
   6:       SoftwareBitmap softwareBitmap = await decoder.GetSoftwareBitmapAsync();
   7:       VideoFrame videoFrame = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);
   8:       return videoFrame;
   9:     }
  10:  }

Wenn der Breakpoint Zeile 15 erreicht, sieht man drei erkannte Objekte. Hier den Kreis mit einer Wahrscheinlichkeit von 0,67 und vor allem die genau Position und Größe.

UWPONNX5

Einfacher wird es nicht mehr Machine Learning Funktion in seine Windows Anwendung zu bekommen.

Kommentare sind geschlossen