Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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ů
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.
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.
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.
- Načtěte model strojového učení.
- Sváže vstupy a výstupy s modelem.
- 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.
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 .