Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
In diesem Lernprogramm erstellen wir eine einfache Anwendung für die universelle Windows-Plattform, die ein trainiertes Machine Learning-Modell verwendet, um eine numerische Ziffer zu erkennen, die vom Benutzer gezeichnet wird. Dieses Lernprogramm konzentriert sich in erster Linie auf das Laden und Verwenden von Windows ML in Ihrer UWP-Anwendung.
Das folgende Video führt sie durch das Beispiel, auf dem dieses Lernprogramm basiert.
Wenn Sie lieber einfach den Code des fertigen Lernprogramms betrachten möchten, finden Sie ihn im WinML GitHub-Repository. Sie ist auch in C++/CX verfügbar.
Voraussetzungen
- Windows 10 (Version 1809 oder höher)
- Windows 10 SDK (Build 17763 oder höher)
- Visual Studio 2019 (oder Visual Studio 2017, Version 15.7.4 oder höher)
- Windows Machine Learning Code Generator-Erweiterung für Visual Studio 2019 oder 2017
- Einige grundlegende Kenntnisse von UWP und C#
1. Öffnen des Projekts in Visual Studio
Nachdem Sie das Projekt von GitHub heruntergeladen haben, starten Sie Visual Studio, und öffnen Sie die MNIST_Demo.sln Datei (sie sollte sich unter <"Path to repo>\Windows-Machine-Learning\Samples\MNIST\Tutorial\cs") befinden. Wenn die Lösung als nicht verfügbar angezeigt wird, müssen Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt klicken und Projekt erneut laden auswählen.
Wir haben eine Vorlage mit implementierten XAML-Steuerelementen und -Ereignissen bereitgestellt, darunter:
- Ein InkCanvas zum Zeichnen der Ziffer.
- Schaltflächen zum Interpretieren der Ziffer und zum Löschen des Zeichenbereichs.
- Hilfsroutinen zum Konvertieren der InkCanvas-Ausgabe in einen VideoFrame.
Im Projekt-Explorer enthält das Projekt drei Hauptdateien mit Code:
- MainPage.xaml – Alle unseren XAML-Code zum Erstellen der Benutzeroberfläche für inkCanvas, Schaltflächen und Beschriftungen.
- MainPage.xaml.cs – Wo sich unser Anwendungscode befindet.
- Helper.cs – Hilfsroutinen zum Zuschneiden und Konvertieren von Bildformaten.
2. Erstellen und Ausführen des Projekts
Ändern Sie auf der Visual Studio-Symbolleiste die Lösungsplattform in x64 , um das Projekt auf Ihrem lokalen Computer auszuführen, wenn Ihr Gerät 64-Bit oder x86 ist, wenn es sich um 32-Bit handelt. (Sie können die Windows-Einstellungs-App überprüfen: System > Über > Gerätespezifikationen > Systemtyp.)
Um das Projekt auszuführen, klicken Sie auf der Symbolleiste auf die Schaltfläche " Debuggen starten ", oder drücken Sie F5. Die Anwendung sollte einen InkCanvas anzeigen, in dem Benutzer eine Ziffer schreiben können, eine Schaltfläche " Erkennen ", um die Nummer zu interpretieren, ein leeres Bezeichnungsfeld, in dem die interpretierte Ziffer als Text angezeigt wird, und eine Schaltfläche " Ziffern löschen", um den InkCanvas zu löschen.
Hinweis
Wenn das Projekt nicht erstellt wird, müssen Sie möglicherweise die Version des Bereitstellungsziels des Projekts ändern. Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf das Projekt, und wählen Sie "Eigenschaften" aus. Legen Sie auf der Registerkarte "Anwendung " die Zielversion und "Min"-Version so fest, dass sie mit Ihrem Betriebssystem und SDK übereinstimmt.
Hinweis
Wenn Sie eine Warnung erhalten, dass die Anwendung bereits installiert ist, wählen Sie einfach "Ja " aus, um mit der Bereitstellung fortzufahren. Möglicherweise müssen Sie Visual Studio schließen und erneut öffnen, wenn es immer noch nicht funktioniert.
3. Herunterladen eines Modells
Als Nächstes erhalten wir ein Machine Learning-Modell, das unserer Anwendung hinzugefügt werden soll. In diesem Lernprogramm verwenden wir ein vortrainiertes MNIST-Modell, das mit dem Microsoft Cognitive Toolkit (CNTK) trainiert und in das ONNX-Format exportiert wurde.
Das MNIST-Modell wurde bereits im Ordner "Assets " enthalten, und Sie müssen es ihrer Anwendung als vorhandenes Element hinzufügen. Sie können auch das vorgefertigte Modell aus dem ONNX-Model-Zoo auf GitHub herunterladen.
4. Hinzufügen des Modells
Klicken Sie im Projektmappen-Explorer mit der rechten Maustaste auf den Ordner "Assets", und wählen Sie "Vorhandenes Element> aus. Zeigen Sie die Dateiauswahl auf den Speicherort Ihres ONNX-Modells, und klicken Sie auf "Hinzufügen".
Das Projekt sollte jetzt über zwei neue Dateien verfügen:
- mnist.onnx - Ihr trainiertes Modell.
- mnist.cs – Der von Windows ML generierte Code.
Um sicherzustellen, dass das Modell beim Kompilieren unserer Anwendung erstellt wird, klicken Sie mit der rechten Maustaste auf die Datei "mnist.onnx ", und wählen Sie "Eigenschaften" aus. Für Build Action wählen Sie "Inhalt" aus.
Sehen wir uns nun den neu generierten Code in der datei mnist.cs an. Wir haben drei Klassen:
- mnistModel erstellt die Darstellung des Machine Learning-Modells, erstellt eine Sitzung auf dem Systemstandardgerät, bindet die spezifischen Eingaben und Ausgaben an das Modell und wertet das Modell asynchron aus.
- mnistInput initialisiert die Eingabetypen, die das Modell erwartet. In diesem Fall erwartet die Eingabe einen ImageFeatureValue.
- mnistOutput initialisiert die Vom Modell ausgegebenen Typen. In diesem Fall ist die Ausgabe eine Liste namens Plus214_Output_0 vom Typ TensorFloat.
Wir verwenden nun diese Klassen zum Laden, Binden und Auswerten des Modells in unserem Projekt.
5. Laden, Binden und Auswerten des Modells
Für Windows ML-Anwendungen lautet das muster, das wir befolgen möchten: Load > Bind > Evaluate.
- Laden Sie das Machine Learning-Modell.
- Binden Sie Eingaben und Ausgaben an das Modell.
- Wertet das Modell aus, und zeigen Sie die Ergebnisse an.
Wir verwenden den in mnist.cs generierten Schnittstellencode, um das Modell in unserer Anwendung zu laden, zu binden und auszuwerten.
Zunächst instanziieren wir in MainPage.xaml.cs das Modell, die Eingaben und Ausgaben. Fügen Sie der MainPage-Klasse die folgenden Membervariablen hinzu:
private mnistModel ModelGen;
private mnistInput ModelInput = new mnistInput();
private mnistOutput ModelOutput;
Anschließend laden wir in LoadModelAsync das Modell. Diese Methode sollte aufgerufen werden, bevor wir eine der Methoden des Modells verwenden (d. a. im Loaded-Ereignis von MainPage, bei einer OnNavigatedTo-Außerkraftsetzung oder an einer beliebigen Stelle, bevor recognizeButton_Click aufgerufen wird). Die mnistModel-Klasse stellt das MNIST-Modell dar und erstellt die Sitzung auf dem Systemstandardgerät. Zum Laden des Modells rufen wir die CreateFromStreamAsync-Methode auf und übergeben die ONNX-Datei als Parameter.
private async Task LoadModelAsync()
{
// Load a machine learning model
StorageFile modelFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/mnist.onnx"));
ModelGen = await mnistModel.CreateFromStreamAsync(modelFile as IRandomAccessStreamReference);
}
Hinweis
Wenn unter IRandomAccessStreamReference rote Unterstreichungen angezeigt werden, müssen Sie den zugehörigen Namespace einschließen. Platzieren Sie den Cursor darüber, drücken Sie STRG+., und wählen Sie dann im Dropdownmenü using Windows.Storage.Streams aus.
Als Nächstes möchten wir unsere Eingaben und Ausgaben an das Modell binden. Der generierte Code enthält auch mnistInput - und mnistOutput-Wrapperklassen . Die mnistInput-Klasse stellt die erwarteten Eingaben des Modells dar, und die mnistOutput-Klasse stellt die erwarteten Ausgaben des Modells dar.
Rufen Sie zum Initialisieren des Eingabeobjekts des Modells den mnistInput-Klassenkonstruktor auf, übergeben Sie Die Anwendungsdaten, und stellen Sie sicher, dass Ihre Eingabedaten dem vom Modell erwarteten Eingabetyp entsprechen. Die mnistInput-Klasse erwartet einen ImageFeatureValue, daher verwenden wir eine Hilfsmethode, um einen ImageFeatureValue für die Eingabe abzurufen.
Mithilfe unserer enthaltenen Hilfsfunktionen in helper.cs kopieren wir den Inhalt des InkCanvas, konvertieren ihn in den Typ ImageFeatureValue und binden ihn an unser Modell.
private async void recognizeButton_Click(object sender, RoutedEventArgs e)
{
// Bind model input with contents from InkCanvas
VideoFrame vf = await helper.GetHandWrittenImage(inkGrid);
ModelInput.Input3 = ImageFeatureValue.CreateFromVideoFrame(vf);
}
Für die Ausgabe rufen wir " EvaluateAsync" einfach mit der angegebenen Eingabe auf. Nachdem Ihre Eingaben initialisiert wurden, rufen Sie die EvaluateAsync-Methode des Modells auf, um Ihr Modell für die Eingabedaten auszuwerten. EvaluateAsync bindet Ihre Eingaben und Ausgaben an das Modellobjekt und wertet das Modell für die Eingaben aus.
Da das Modell einen Ausgabe-Tensor zurückgibt, möchten wir ihn zuerst in einen benutzerfreundlichen Datentyp konvertieren und dann die zurückgegebene Liste analysieren, um zu bestimmen, welche Ziffer die höchste Wahrscheinlichkeit hatte und diese anzeigt.
private async void recognizeButton_Click(object sender, RoutedEventArgs e)
{
// Bind model input with contents from InkCanvas
VideoFrame vf = await helper.GetHandWrittenImage(inkGrid);
ModelInput.Input3 = ImageFeatureValue.CreateFromVideoFrame(vf);
// Evaluate the model
ModelOutput = await ModelGen.EvaluateAsync(ModelInput);
// Convert output to datatype
IReadOnlyList<float> vectorImage = ModelOutput.Plus214_Output_0.GetAsVectorView();
IList<float> imageList = vectorImage.ToList();
// Query to check for highest probability digit
var maxIndex = imageList.IndexOf(imageList.Max());
// Display the results
numberLabel.Text = maxIndex.ToString();
}
Schließlich möchten wir das InkCanvas löschen, damit Benutzer eine andere Zahl zeichnen können.
private void clearButton_Click(object sender, RoutedEventArgs e)
{
inkCanvas.InkPresenter.StrokeContainer.Clear();
numberLabel.Text = "";
}
6. Starten der Anwendung
Nachdem wir die Anwendung erstellt und gestartet haben (drücken Sie F5), können wir eine Zahl erkennen, die auf dem InkCanvas gezeichnet wird.
Das ist es – Sie haben Ihre erste Windows ML-Anwendung erstellt! Weitere Beispiele zur Verwendung von Windows ML finden Sie in unserem Windows-Machine-Learning-Repository auf GitHub.
Hinweis
Verwenden Sie die folgenden Ressourcen, wenn Sie Hilfe mit Windows ML benötigen:
- Um technische Fragen zu Windows ML zu stellen oder zu beantworten, verwenden Sie bitte das Windows-Machine-Learning-Tag auf Stack Overflow.
- Um einen Fehler zu melden, erstellen Sie bitte einen Eintrag auf unserem GitHub.