Sdílet prostřednictvím


Kurz: Vytvoření aplikace windows Machine Learning pro UPW (C#)

V tomto kurzu vytvoříme jednoduchou aplikaci pro univerzální platformu Windows, která pomocí natrénovaného modelu strojového učení rozpozná číselnou číslici nakreslenou uživatelem. Tento kurz se primárně zaměřuje na to, jak načíst a používat Windows ML v aplikaci pro UPW.

Následující video vás provede ukázkou, na které tento kurz vychází.


Pokud chcete jednoduše prohlédnout kód dokončeného kurzu, najdete ho v úložišti GitHubu WinML. Je také k dispozici v C++/CX.

Požadavky

  • Windows 10 (verze 1809 nebo novější)
  • Windows 10 SDK (build 17763 nebo vyšší)
  • Visual Studio 2019 (nebo Visual Studio 2017 verze 15.7.4 nebo novější)
  • Rozšíření Generátor kódu pro Windows Machine Learning pro Visual Studio 2019 nebo 2017
  • Některé základní znalosti UPW a C#

1. Otevřete projekt v sadě Visual Studio.

Po stažení projektu z GitHubu spusťte Visual Studio a otevřete soubor MNIST_Demo.sln (měl by se nacházet v <umístění Path to repo>\Windows-Machine-Learning\Samples\MNIST\Tutorial\cs). Pokud se řešení zobrazí jako nedostupné, budete muset v Průzkumníku řešení kliknout pravým tlačítkem myši na projekt a vybrat Znovu načíst projekt.

Poskytli jsme šablonu s implementovanými ovládacími prvky a událostmi XAML, včetně následujících:

  • InkCanvas pro kreslení číslic.
  • Tlačítka pro interpretaci číslice a vymazání plátna
  • Pomocné rutiny pro převod výstupu InkCanvas na videoframe.

V Průzkumníku řešení má projekt tři hlavní soubory kódu:

  • MainPage.xaml – Veškerý kód XAML pro vytvoření uživatelského rozhraní pro InkCanvas, tlačítka a popisky
  • MainPage.xaml.cs – kde se nachází kód aplikace.
  • Helper.cs – pomocné rutiny pro oříznutí a převod formátů obrázků

Průzkumník řešení sady Visual Studio se soubory projektu

2. Sestavení a spuštění projektu

Na panelu nástrojů sady Visual Studio změňte platformu řešení na x64 a spusťte projekt na místním počítači, pokud je vaše zařízení 64bitová nebo x86 , pokud je 32bitová verze. (Můžete zkontrolovat Nastavení systému Windows: Systém > Informace > Specifikace zařízení > Typ systému.)

Pokud chcete projekt spustit, klikněte na tlačítko Spustit ladění na panelu nástrojů nebo stiskněte klávesu F5. Aplikace by měla zobrazit inkCanvas , kde uživatelé můžou napsat číslici, tlačítko Rozpoznat , které interpretuje číslo, prázdné pole popisku, kde se interpretovaná číslice zobrazí jako text, a tlačítko Vymazat číslici pro vymazání inkCanvas.

Snímek obrazovky aplikace

Poznámka:

Pokud se projekt nevytvoří, možná budete muset změnit cílovou verzi pro nasazení projektu. V Průzkumníku řešení klikněte pravým tlačítkem myši na projekt a vyberte Vlastnosti. Na kartě Aplikace nastavte cílovou verzi a minimální verzi tak, aby odpovídala vašemu operačnímu systému a sadě SDK.

Poznámka:

Pokud se zobrazí upozornění, že aplikace je už nainstalovaná, stačí vybrat ano a pokračovat v nasazení. Možná budete muset Visual Studio zavřít a znovu otevřít, pokud stále nefunguje.

3. Stažení modelu

V dalším kroku získáme model strojového učení, který přidáme do naší aplikace. V tomto kurzu použijeme předem natrénovaný model MNIST, který byl natrénován pomocí sady Microsoft Cognitive Toolkit (CNTK) a exportován do formátu ONNX.

Model MNIST už je součástí vaší složky Assets a budete ho muset přidat do aplikace jako existující položku. Předem natrénovaný model si také můžete stáhnout z modelové zoo ONNX na GitHubu.

4. Přidání modelu

V Průzkumníku řešení klikněte pravým tlačítkem na složku Assets a vyberte Přidat>existující položku. Nasměrujte výběr souboru na umístění modelu ONNX a klikněte na Přidat.

Projekt by teď měl mít dva nové soubory:

  • mnist.onnx – váš trénovaný model.
  • mnist.cs – kód vygenerovaný systémem Windows ML.

Průzkumník řešení s novými soubory

Pokud chcete zajistit, aby se model sestavil při kompilaci aplikace, klikněte pravým tlačítkem myši na soubor mnist.onnx a vyberte Vlastnosti. V části Akce sestavení vyberte Obsah.

Teď se podíváme na nově vygenerovaný kód v souboru mnist.cs . Máme tři třídy:

  • mnistModel vytvoří reprezentaci modelu strojového učení, vytvoří relaci na výchozím systémovém zařízení, připojí konkrétní vstupy a výstupy k modelu a model asynchronně vyhodnotí.
  • mnistInput inicializuje vstupní typy, které model očekává. V tomto případě vstup očekává ImageFeatureValue.
  • mnistOutput inicializuje typy, které model bude generovat jako výstup. V tomto případě bude výstupem seznam s názvem Plus214_Output_0 typu TensorFloat.

Tyto třídy teď použijeme k načtení, vytvoření vazby a vyhodnocení modelu v našem projektu.

5. Načtení, vytvoření vazby a vyhodnocení modelu

U aplikací Windows ML je vzorec, který chceme sledovat: Načíst > Navázat > Vyhodnotit.

  1. Načtěte model strojového učení.
  2. Sváže vstupy a výstupy s modelem.
  3. Vyhodnoťte model a zobrazte výsledky.

Kód rozhraní vygenerovaný v mnist.cs použijeme k načtení, vytvoření vazby a vyhodnocení modelu v naší aplikaci.

Nejprve v MainPage.xaml.cs vytvoříme instanci modelu, vstupů a výstupů. Do třídy MainPage přidejte následující členské proměnné:

private mnistModel ModelGen;
private mnistInput ModelInput = new mnistInput();
private mnistOutput ModelOutput;

Pak v LoadModelAsync načteme model. Tato metoda by se měla volat dříve, než použijeme některou z metod modelu (to znamená, při události MainPageLoaded, v přepsání OnNavigatedTo nebo kdekoli předtím, než je zavolána recognizeButton_Click). MnistModel třída představuje model MNIST a vytvoří relaci na výchozím systémovém zařízení. K načtení modelu voláme metodu CreateFromStreamAsync , která předává soubor ONNX jako parametr.

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);
}

Poznámka:

Pokud se pod IRandomAccessStreamReference zobrazí červené podtržení, musíte zahrnout jeho obor názvů. Umístěte kurzor na něj, stiskněte Ctrl + . a v rozevírací nabídce vyberte using Windows.Storage.Streams.

Dále chceme s modelem svázat vstupy a výstupy. Vygenerovaný kód také obsahuje třídy obálky mnistInput a mnistOutput. MnistInput třída představuje očekávané vstupy modelu a mnistOutput třída představuje očekávané výstupy modelu.

Chcete-li inicializovat vstupní objekt modelu, zavolejte konstruktor třídy mnistInput , předejte data vaší aplikace a ujistěte se, že vstupní data odpovídají vstupnímu typu, který model očekává. MnistInput třída očekává ImageFeatureValue, takže použijeme pomocnou metodu k získání ImageFeatureValue pro vstup.

Pomocí našich zahrnutých pomocných funkcí v helper.cs zkopírujeme obsah InkCanvas, převedeme ho na typ ImageFeatureValue a svážeme ho s naším modelem.

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);
}

Pro výstup jednoduše zavoláme EvaluateAsync se zadaným vstupem. Jakmile se vstupy inicializují, zavolejte metodu EvaluateAsync modelu a vyhodnoťte model na vstupních datech. EvaluateAsync sváže vstupy a výstupy s objektem modelu a vyhodnotí model na vstupech.

Vzhledem k tomu, že model vrátí výstupní tensor, nejprve ho budeme chtít převést na popisný datový typ a pak parsovat vrácený seznam, abychom zjistili, která číslice měla nejvyšší pravděpodobnost a zobrazila ji.

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();
}

Nakonec budeme chtít vymazat inkCanvas , aby uživatelé mohli nakreslit další číslo.

private void clearButton_Click(object sender, RoutedEventArgs e)
{
    inkCanvas.InkPresenter.StrokeContainer.Clear();
    numberLabel.Text = "";
}

6. Spusťte aplikaci.

Jakmile aplikaci sestavíme a spustíme (stiskněte klávesu F5), budeme moct rozpoznat číslo nakreslené na inkCanvas.

dokončení aplikace

To je to - vytvořili jste svou první aplikaci Windows ML! Další ukázky, které ukazují, jak používat Windows ML, najdete v našem úložišti Windows-Machine-Learning na GitHubu.

Poznámka:

Pomoc s Windows ML vám poskytnou následující zdroje:

  • Pokud chcete položit nebo zodpovědět technické otázky týkající se Windows ML, použijte značku windows-machine-learning na Stack Overflow.
  • Pokud chcete nahlásit chybu, zapište prosím problém na našem GitHubu .