Aracılığıyla paylaş


Öğretici: Windows Machine Learning UWP uygulaması oluşturma (C#)

Bu öğreticide, kullanıcı tarafından çizilen sayısal bir rakamı tanımak için eğitilmiş bir makine öğrenmesi modeli kullanan basit bir Evrensel Windows Platformu uygulaması oluşturacağız. Bu öğretici öncelikle UWP uygulamanızda Windows ML'yi yükleme ve kullanma konularına odaklanır.

Aşağıdaki videoda bu öğreticinin temel alındığı örnek açıklanmaktadır.


Tamamlanmış öğreticinin koduna bakmayı tercih ederseniz, bunu WinML GitHub deposunda bulabilirsiniz. C++/CX'te de kullanılabilir.

Önkoşullar

1. Projeyi Visual Studio'da açma

Projeyi GitHub'dan indirdikten sonra Visual Studio'yu başlatın ve MNIST_Demo.sln dosyasını açın (path to repo<\Windows-Machine-Learning\Samples\MNIST\Tutorial\cs konumunda olmalıdır>). Çözüm kullanılamıyor olarak gösteriliyorsa, Çözüm Gezgini'nde projeye sağ tıklamanız ve Projeyi Yeniden Yükle'yi seçmeniz gerekir.

Aşağıdakiler dahil olmak üzere uygulanan XAML denetimlerini ve olaylarını içeren bir şablon sağladık:

  • Sayı rakamı çizmek için bir InkCanvas.
  • Düğmeler, rakamı yorumlamak ve tuvali temizlemek için kullanılır.
  • InkCanvas çıkışını VideoFrame'e dönüştürmek için yardımcı yordamlar.

Çözüm Gezgini'nin içinde projenin üç ana kod dosyası vardır:

  • MainPage.xaml - InkCanvas, düğmeler ve etiketler için kullanıcı arabirimi oluşturmak üzere tüm XAML kodumuz.
  • MainPage.xaml.cs - Uygulama kodumuzun bulunduğu yer.
  • Helper.cs - Görüntü biçimlerini kırpmak ve dönüştürmek için yardımcı yordamlar.

Proje dosyalarıyla Visual Studio çözüm gezgini

2. Projeyi derleme ve çalıştırma

Visual Studio araç çubuğunda Çözüm Platformu'nux64 olarak değiştirerek cihazınız 64 bitse projeyi yerel makinenizde veya 32 bit ise x86'yı çalıştırın. (Windows Ayarları: Cihaz Özellikleri > Hakkında > Sistem > Türü'nü kontrol edebilirsiniz.)

Projeyi çalıştırmak için araç çubuğundaki Hata Ayıklamayı Başlat düğmesine tıklayın veya F5 tuşuna basın. Uygulama, kullanıcıların bir basamak yazabileceği bir InkCanvas, sayıyı yorumlamak için Tanıma düğmesi, yorumlanan rakamın metin olarak görüntüleneceği boş bir etiket alanı ve Rakamı Temizle düğmesi ile InkCanvas'ı temizleme işlevini göstermelidir.

Uygulama ekran görüntüsü

Uyarı

Proje inşa edilmiyorsa, projenin dağıtım hedef sürümünü değiştirmeniz gerekebilir. Çözüm Gezgini'nde projeye sağ tıklayın ve Özellikler'i seçin. Uygulama sekmesinde Hedef sürümü ve En Düşük sürümü işletim sisteminiz ve SDK'nızla eşleşecek şekilde ayarlayın.

Uyarı

Uygulamanın zaten yüklü olduğuna dair bir uyarı alırsanız, dağıtıma devam etmek için Evet'i seçmeniz gerekir. Hala çalışmıyorsa Visual Studio'yu kapatıp yeniden açmanız gerekebilir.

3. Model indirme

Şimdi uygulamamıza eklemek için bir makine öğrenmesi modeli alalım. Bu öğreticide, Microsoft Bilişsel Araç Seti (CNTK) ile eğitilmiş ve ONNX biçimine aktarılmış önceden eğitilmiş bir MNIST modeli kullanacağız.

MNIST modeli Varlıklar klasörünüzde zaten var olan bir öğe olarak uygulamanıza eklemeniz gerekir. Önceden eğitilmiş modeli GitHub'daki ONNX Model Hayvanat Bahçesi'nden de indirebilirsiniz.

4. Modeli ekleme

Çözüm Gezgini'ndeVarlıklar klasörüne sağ tıklayın veVarolan ÖğeYi> seçin. Dosya seçici konumunu ONNX modelinizin bulunduğu yere ayarlayın ve Ekle'ye tıklayın.

Projede artık iki yeni dosya olmalıdır:

  • mnist.onnx - Eğitilmiş modeliniz.
  • mnist.cs - Windows ML tarafından oluşturulan kod.

Yeni dosyalarla çözüm gezgini

Uygulamamızı derlediğimizde modelin derlendiğinden emin olmak için mnist.onnx dosyasına sağ tıklayın ve Özellikler'i seçin. Derleme Eylemi için İçerik'i seçin.

Şimdi mnist.cs dosyasında yeni oluşturulan koda göz atalım. Üç sınıfımız var:

  • mnistModel makine öğrenmesi modeli gösterimini oluşturur, sistem varsayılan cihazında bir oturum oluşturur, belirli girişleri ve çıkışları modele bağlar ve modeli zaman uyumsuz olarak değerlendirir.
  • mnistInput , modelin beklediği giriş türlerini başlatır. Bu durumda, giriş bir ImageFeatureValue bekler.
  • mnistOutput , modelin çıkış yapacağı türleri başlatır. Bu durumda çıkış, TensorFloat türünde Plus214_Output_0 adlı bir liste olacaktır.

Şimdi projemizdeki modeli yüklemek, bağlamak ve değerlendirmek için bu sınıfları kullanacağız.

5. Modeli yükleme, bağlama ve değerlendirme

Windows ML uygulamaları için izlemek istediğimiz desen: Yükle > Bağla > Değerlendir.

  1. Makine öğrenmesi modelini yükleyin.
  2. Girişleri ve çıkışları modele bağlayın.
  3. Modeli değerlendirin ve sonuçları görüntüleyin.

Uygulamamızda modeli yüklemek, bağlamak ve değerlendirmek için mnist.cs'de oluşturulan arabirim kodunu kullanacağız.

İlk olarak, MainPage.xaml.cs'de önce modeli, girişleri ve çıkışları örneklendirelim. MainPage sınıfına aşağıdaki üye değişkenlerini ekleyin:

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

Ardından LoadModelAsync'te modeli yükleyeceğiz. Modelin yöntemlerinden herhangi birini kullanmadan önce (yani MainPage'inYüklü olayında, bir OnNavigatedTo geçersiz kılmada veya recognizeButton_Click çağrılmadan önce herhangi bir yerde) bu yöntem çağrılmalıdır. mnistModel sınıfı MNIST modelini temsil eder ve oturumu sistem varsayılan cihazında oluşturur. Modeli yüklemek için CreateFromStreamAsync yöntemini çağırarak ONNX dosyasını parametre olarak geçiririz.

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

Uyarı

IRandomAccessStreamReference altında kırmızı alt çizgiler görüyorsanız, ad alanını eklemeniz gerekiyor. İmlecinizi üzerine getirin, Ctrl + . tuşlarına basın ve açılır menüden using Windows.Storage.Streams seçeneğini seçin.

Ardından giriş ve çıkışlarımızı modele bağlamak istiyoruz. Oluşturulan kod mnistInput ve mnistOutput sarmalayıcı sınıflarını da içerir. mnistInput sınıfı modelin beklenen girişlerini, mnistOutput sınıfı ise modelin beklenen çıkışlarını temsil eder.

Modelin giriş nesnesini başlatmak için, uygulama verilerinizi geçirerek mnistInput sınıf oluşturucusunu çağırın ve giriş verilerinizin modelinizin beklediği giriş türüyle eşleştiğinden emin olun. mnistInput sınıfı bir ImageFeatureValue bekler, bu nedenle giriş için ImageFeatureValue almak için bir yardımcı yöntemi kullanırız.

dahil edilen yardımcı işlevlerimizi helper.cs kullanarak InkCanvas'ın içeriğini kopyalayacak, ImageFeatureValue türüne dönüştürecek ve modelimize bağlayacağız.

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

Çıktı için, belirtilen girişle EvaluateAsync'i çağırmamız yeterlidir. Girişleriniz başlatıldıktan sonra, modelinizi giriş verileri üzerinde değerlendirmek için modelin EvaluateAsync yöntemini çağırın. EvaluateAsync , girişlerinizi ve çıkışlarınızı model nesnesine bağlar ve girişlerde modeli değerlendirir.

Model bir çıkış tensörü döndürdüğünden, önce bunu uygun bir veri türüne dönüştürmek ve ardından hangi rakamın en yüksek olasılığa sahip olduğunu belirlemek ve görüntülemek için döndürülen listeyi ayrıştırmak istiyoruz.

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

Son olarak, kullanıcıların başka bir sayı çizmesine izin vermek için InkCanvas'ı temizlemek istiyoruz.

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

6. Uygulamayı başlatın

Uygulamayı derleyip başlattıktan sonra ( F5 tuşuna basın), InkCanvas üzerinde çizilmiş bir sayıyı tanıyabileceğiz.

tam uygulama

İşte bu kadar - ilk Windows ML uygulamanızı yaptınız! Windows ML'nin nasıl kullanılacağını gösteren diğer örnekler için GitHub'da Windows-Machine-Learning depomuzu inceleyin.

Uyarı

Windows ML ile ilgili yardım için aşağıdaki kaynakları kullanın:

  • Windows ML hakkında teknik sorular sormak veya yanıtlamak için stack overflow'dawindows-machine-learning etiketini kullanın.
  • Bir hatayı bildirmek için lütfen GitHub'ımızda bir sorun oluşturun.