Aracılığıyla paylaş


Windows Machine Learning API'leri ile modelinizi bir Windows uygulamasında dağıtma

Bu öğreticinin önceki bölümünde, BIR modeli ONNX biçiminde derlemeyi ve dışarı aktarmayı öğrendiniz. Artık bu modeli kullandığınıza göre, WinML API'lerini çağırarak bir Windows uygulamasına ekleyebilir ve bir cihazda yerel olarak çalıştırabilirsiniz.

İşiniz bittiğinde çalışan bir Görüntü sınıflandırıcısı WinML UWP uygulamasına (C#) sahip olacaksınız.

Örnek uygulama hakkında

Modelimizi kullanarak yiyecek görüntülerini sınıflandırabilen bir uygulama oluşturacağız. Yerel cihazınızdan bir görüntü seçmenize ve önceki bölümde oluşturup eğitmiş olduğunuz yerel olarak depolanan bir sınıflandırma ONNX modeliyle işlemenize olanak tanır. Döndürülen etiketler görüntünün yanında ve sınıflandırmanın olasılık olasılığıyla birlikte görüntülenir.

Bu öğreticiyi şu ana kadar takip ediyorsanız, uygulama geliştirme için gerekli önkoşullara zaten sahip olmanız gerekir. Eğer bir hatırlatmaya ihtiyacınız varsa, bu öğreticinin ilk bölümüne bakabilirsiniz.

Uyarı

Örnek kodun tamamını indirmeyi tercih ederseniz çözüm dosyasını kopyalayabilirsiniz. Depoyu kopyalayın, bu örneğe gidin ve dosyayı Visual Studio ile açın ImageClassifierAppUWP.sln . Ardından [Uygulamayı başlat](uygulamayı #Launch) adımına atlayabilirsiniz.

WinML UWP oluşturma (C#)

Aşağıda, uygulamanızı ve WinML kodunuzu sıfırdan nasıl oluşturabileceğinizi göstereceğiz. Nasıl yapılacağını öğreneceksiniz:

  • Makine öğrenmesi modeli yükleme.
  • Görüntüyü gerekli biçimde yükleyin.
  • Modelin girişlerini ve çıkışlarını bağlayın.
  • Modeli değerlendirin ve anlamlı sonuçlar görüntüleyin.

Ayrıca basit bir GUI oluşturmak için temel XAML'yi kullanarak görüntü sınıflandırıcısını test edebilirsiniz.

Uygulamayı oluşturma

  1. Visual Studio'yu açın ve öğesini seçin create a new project.

Yeni bir Visual Studio projesi oluşturma

  1. Arama çubuğuna yazın UWP ve ardından öğesini seçin Blank APP (Universal Windows. Bu, önceden tanımlanmış denetimleri veya düzeni olmayan tek sayfalı Evrensel Windows Platformu (UWP) uygulaması için yeni bir C# projesi açar. Proje için bir yapılandırma penceresi açmak için seçin Next .

Yeni UWP uygulaması oluşturma

  1. Yapılandırma penceresinde:
  • Projeniz için bir ad seçin. Burada ImageClassifierAppUWP kullanıyoruz.
  • Projenizin konumunu seçin.
  • VS 2019 kullanıyorsanız, Place solution and project in the same directory seçeneğinin işaretli olmadığından emin olun.
  • VS 2017 kullanıyorsanız işaretli olduğundan emin olun Create directory for solution .

Projenizi oluşturmak için basın create . Minimum hedef sürüm penceresi açılabilir. En düşük sürümünüzün Windows 10 derleme 17763 veya üzeri olarak ayarlandığından emin olun.

Uygulama oluşturmak ve WinML uygulamasıyla model dağıtmak için aşağıdakilere ihtiyacınız vardır:

  1. Proje oluşturulduktan sonra proje klasörüne gidin, [.\ImageClassifierAppUWP\Assets] assets klasörünü açın ve modelinizi bu konuma kopyalayın.

  2. Model adını model.onnx'dan classifier.onnx'e değiştirin. Bu, işleri biraz daha net hale getirir ve öğreticinin formatına uyum sağlar.

Modelinizi keşfedin

Model dosyanızın yapısı hakkında bilgi edinelim.

  1. classifier.onnx kullanarak model dosyanızı açın.

  2. Model özelliklerini açmak için basın Data .

Model özellikleri

Gördüğünüz gibi model, giriş olarak 32 bit Tensor (çok boyutlu dizi) kayan nesne gerektirir ve iki çıkış döndürür: ilk adı classLabel dizelerin tensor'ı, ikinci adı loss ise etiketlenmiş her sınıflandırmanın olasılığını açıklayan bir dize-kayan eşleme dizisidir. Windows uygulamanızda model çıkışını başarıyla görüntülemek için bu bilgilere ihtiyacınız olacaktır.

Proje çözümünü keşfetme

Şimdi proje çözümünüzü inceleyelim.

Visual Studio, Çözüm Gezgini'nin içinde otomatik olarak birkaç cs-code dosyası oluşturmuştur. MainPage.xaml GUI'nizin XAML kodunu ve MainPage.xaml.cs uygulama kodunuzu içerir. Daha önce bir UWP uygulaması oluşturduysanız, bu dosyalar size çok tanıdık geliyor olmalıdır.

Uygulama GUI'sini oluşturma

İlk olarak uygulamanız için basit bir GUI oluşturalım.

  1. Dosyaya MainPage.xaml çift tıklayın. Boş uygulamanızda uygulamanızın GUI'sinin XAML şablonu boş olduğundan bazı kullanıcı arabirimi özellikleri eklememiz gerekir.

  2. Aşağıdaki kodu ana gövdesine MainPage.xamlekleyin.

<Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">

        <StackPanel Margin="1,0,-1,0">
            <TextBlock x:Name="Menu" 
                       FontWeight="Bold" 
                       TextWrapping="Wrap"
                       Margin="10,0,0,0"
                       Text="Image Classification"/>
            <TextBlock Name="space" />
            <Button Name="recognizeButton"
                    Content="Pick Image"
                    Click="OpenFileButton_Click" 
                    Width="110"
                    Height="40"
                    IsEnabled="True" 
                    HorizontalAlignment="Left"/>
            <TextBlock Name="space3" />
            <Button Name="Output"
                    Content="Result is:"
                    Width="110"
                    Height="40"
                    IsEnabled="True" 
                    HorizontalAlignment="Left" 
                    VerticalAlignment="Top">
            </Button>
            <!--Display the Result-->
            <TextBlock Name="displayOutput" 
                       FontWeight="Bold" 
                       TextWrapping="Wrap"
                       Margin="30,0,0,0"
                       Text="" Width="1471" />
            <Button Name="ProbabilityResult"
                    Content="Probability is:"
                    Width="110"
                    Height="40"
                    IsEnabled="True" 
                    HorizontalAlignment="Left"/>
            <!--Display the Result-->
            <TextBlock Name="displayProbability" 
                       FontWeight="Bold" 
                       TextWrapping="Wrap"
                       Margin="30,0,0,0"
                       Text="" Width="1471" />
            <TextBlock Name="space2" />
            <!--Image preview -->
            <Image Name="UIPreviewImage" Stretch="Uniform" MaxWidth="300" MaxHeight="300"/>
        </StackPanel>
    </Grid>

Windows Machine Learning Kod Oluşturucusu

Windows Machine Learning Kod Oluşturucusu veya mlgen, UWP uygulamalarında WinML API'lerini kullanmaya başlamanıza yardımcı olan bir Visual Studio uzantısıdır. UWP projesine eğitilmiş bir ONNX dosyası eklediğinizde şablon kodu oluşturur.

Windows Machine Learning'in kod oluşturucu mlgen'i, sizin için Windows ML API'sini çağıran sarmalayıcı sınıflarıyla bir arabirim (C#, C++/WinRT ve C++/CX için) oluşturur. Bu sayede projenizdeki bir modeli kolayca yükleyebilir, bağlayabilir ve değerlendirebilirsiniz. Bu öğreticide bu işlevlerin çoğunu bizim için işlemek için kullanacağız.

Kod oluşturucu, Visual Studio 2017 ve sonraki sürümlerde kullanılabilir. Windows 10, sürüm 1903 ve sonraki sürümlerde mlgen'in artık Windows 10 SDK'sında bulunmadığını, bu nedenle uzantıyı indirip yüklemeniz gerektiğini unutmayın. Bu öğreticiyi giriş bölümünden takip ediyorsanız, bunu zaten halletmiş olursunuz, ancak değilse VS 2019 veya VS 2017 için indirmeniz gerekecek.

Uyarı

mlgen hakkında daha fazla bilgi edinmek için lütfen mlgen belgelerine bakın

  1. Henüz yüklemediyseniz mlgen'i yükleyin.

  2. Visual Studio'da Assets Çözüm Gezgini'nde klasöre sağ tıklayın ve öğesini seçin Add > Existing Item.

  3. içindeki ImageClassifierAppUWP [….\ImageClassifierAppUWP\Assets]varlıklar klasörüne gidin, daha önce buraya kopyaladığınız ONNX modelini bulun ve öğesini seçin add.

  4. VS'de çözüm gezginindeki assets klasörüne bir ONNX modeli ("ad: "sınıflandırıcı") ekledikten sonra projede artık iki yeni dosya olmalıdır:

  • classifier.onnx - bu, ONNX biçimindeki modelinizdir.
  • classifier.cs – otomatik olarak oluşturulan WinML kod dosyası.

ONNX modeli eklenmiş proje yapısı

  1. Modelin derlendiğinden emin olmak için classifier.onnx dosyasını seçin ve Properties seçin. Build Action için Content öğesini seçin.

Şimdi classifier.cs dosyasında yeni oluşturulan kodu inceleyelim.

Oluşturulan kod üç sınıf içerir:

  • classifierModel: Bu sınıf, model örneği oluşturma ve model değerlendirmesi için iki yöntem içerir. Makine öğrenmesi modeli gösterimini oluşturmamıza, sistem varsayılan cihazında oturum oluşturmamıza, belirli giriş ve çıkışları modele bağlamamıza ve modeli zaman uyumsuz olarak değerlendirmemize yardımcı olur.
  • classifierInput: Bu sınıf, modelin beklediği giriş türlerini başlatır. Model girişi, giriş verilerinin model gereksinimlerine bağlıdır. Bizim örneğimizde giriş, bir modele geçirmek için kullanılan görüntünün özelliklerini açıklayan bir sınıf olan ImageFeatureValue değerini bekler.
  • classifierOutput: Bu sınıf, modelin çıkış yapacağı türleri başlatır. Model çıkışı, model tarafından nasıl tanımlandığına bağlıdır. Bizim örneğimizde çıkış, String ve TensorFloat (Float32) türünde kayıp olarak adlandırılan bir harita dizisi (sözlükler) olacaktır.

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

Modeli ve girişleri yükleme

Modeli yükleme

  1. Uygulama kodunu açmak için kod dosyasına çift tıklayın MainPage.xaml.cs .

  2. İhtiyacınız olan tüm API'lere erişim elde etmek için "using" deyimlerini aşağıdakilerle değiştirin.

// Specify all the using statements which give us the access to all the APIs that you'll need
using System;
using System.Threading.Tasks;
using Windows.AI.MachineLearning;
using Windows.Graphics.Imaging;
using Windows.Media;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;
  1. Aşağıdaki değişken bildirimlerini using deyimlerinden sonra sınıfınızın MainPage içinde, ad alanının ImageClassifierAppUWP altına ekleyin.
        // All the required variable declaration
        private classifierModel modelGen;
        private classifierInput input = new classifierModelInput();
        private classifierOutput output;
        private StorageFile selectedStorageFile;
        private string result = "";
        private float resultProbability = 0;

Sonuç aşağıdaki gibi görünür.

// Specify all the using statements which give us the access to all the APIs that we'll need
using System;
using System.Threading.Tasks;
using Windows.AI.MachineLearning;
using Windows.Graphics.Imaging;
using Windows.Media;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media.Imaging;

namespace ImageClassifierAppUWP
{
    public sealed partial class MainPage : Page
    {
        // All the required fields declaration
        private classifierModel modelGen;
        private classifierInput input = new classifierInput();
        private classifierOutput output;
        private StorageFile selectedStorageFile;
        private string result = "";
        private float resultProbability = 0;

Şimdi LoadModel yöntemini uygulayacaksınız. yöntemi ONNX modeline erişip bellekte depolar. Ardından, modeli bir CreateFromStreamAsync nesne olarak oluşturmak için LearningModel yöntemini kullanacaksınız. LearningModel sınıfı eğitilmiş bir makine öğrenmesi modelini temsil eder. Örneklemi oluşturulduğunda, LearningModel Windows ML ile etkileşim kurmak için kullandığınız ilk nesneyi oluşturur.

Modeli yüklemek için sınıfında birkaç statik yöntem LearningModel kullanabilirsiniz. Bu durumda CreateFromStreamAsync yöntemini kullanacaksınız.

CreateFromStreamAsync yöntemi mlgen ile otomatik olarak oluşturulmuştur, bu nedenle bu yöntemi uygulamanız gerekmez. Mlgen tarafından oluşturulan dosyaya classifier.cs çift tıklayarak bu yöntemi gözden geçirebilirsiniz.

Sınıf hakkında LearningModel daha fazla bilgi edinmek için lütfen LearningModel Sınıfı belgelerini gözden geçirin. Modeli yüklemenin ek yolları hakkında daha fazla bilgi edinmek için lütfen Model yükleme belgelerini gözden geçirin

  1. sınıfının içindeki loadModel kod dosyanıza MainPage.xaml.cs bir MainPage yöntem ekleyin.
        private async Task loadModel()
        {
            // Get an access the ONNX model and save it in memory.
            StorageFile modelFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/classifier.onnx"));
            // Instantiate the model. 
            modelGen = await classifierModel.CreateFromStreamAsync(modelFile);
        }
  1. Şimdi sınıfın oluşturucusuna yeni yönteme bir çağrı ekleyin.
        // The main page to initialize and execute the model.
        public MainPage()
        {
            this.InitializeComponent();
            loadModel();
        }

Sonuç aşağıdaki gibi görünür.

        // The main page to initialize and execute the model.
        public MainPage()
        {
            this.InitializeComponent();
            loadModel();
        }

        // A method to load a machine learning model.
        private async Task loadModel()
        {
            // Get an access the ONNX model and save it in memory.  
            StorageFile modelFile = await StorageFile.GetFileFromApplicationUriAsync(new Uri($"ms-appx:///Assets/classifier.onnx"));
            // Instantiate the model. 
            modelGen = await classifierModel.CreateFromStreamAsync(modelFile);
        }

Görüntüyü Yükleme

  1. Model yürütme için dört yöntem çağrısı sırasını başlatmak için bir tıklama olayı tanımlamamız gerekir: dönüştürme, bağlama ve değerlendirme, çıkış ayıklama ve sonuçları görüntüleme. Aşağıdaki metodu MainPage.xaml.cs sınıfının içindeki MainPage kod dosyanıza ekleyin.
        // Waiting for a click event to select a file 
        private async void OpenFileButton_Click(object sender, RoutedEventArgs e)
        {
            if (!await getImage())
            {
                return;
            }
            // After the click event happened and an input selected, begin the model execution. 
            // Bind the model input
            await imageBind();
            // Model evaluation
            await evaluate();
            // Extract the results
            extractResult();
            // Display the results  
            await displayResult();
        }
  1. Şimdi getImage() yöntemini uygulayacaksınız. Bu yöntem bir giriş görüntüsü dosyası seçip belleğe kaydeder. Aşağıdaki metodu MainPage.xaml.cs sınıfının içindeki MainPage kod dosyanıza ekleyin.
        // A method to select an input image file
        private async Task<bool> getImage()
        {
            try
            {
                // Trigger file picker to select an image file
                FileOpenPicker fileOpenPicker = new FileOpenPicker();
                fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
                fileOpenPicker.FileTypeFilter.Add(".jpg");
                fileOpenPicker.FileTypeFilter.Add(".png");
                fileOpenPicker.ViewMode = PickerViewMode.Thumbnail;
                selectedStorageFile = await fileOpenPicker.PickSingleFileAsync();
                if (selectedStorageFile == null)
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

Şimdi dosyanın bit eşlem BGRA8 biçiminde gösterimini almak için bir görüntü Bind() yöntemi uygulayacaksınız.

  1. MainPage sınıfı içindeki convert() kod dosyanıza, MainPage.xaml.cs yönteminin uygulamasını ekleyin. dönüştürme yöntemi, giriş dosyasının BGRA8 biçiminde bir gösterimini alır.
// A method to convert and bind the input image.  
        private async Task imageBind()
        {
            UIPreviewImage.Source = null;
            try
            {
                SoftwareBitmap softwareBitmap;
                using (IRandomAccessStream stream = await selectedStorageFile.OpenAsync(FileAccessMode.Read))
                {
                    // Create the decoder from the stream 
                    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);
                    // Get the SoftwareBitmap representation of the file in BGRA8 format
                    softwareBitmap = await decoder.GetSoftwareBitmapAsync();
                    softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
                }
                // Display the image
                SoftwareBitmapSource imageSource = new SoftwareBitmapSource();
                await imageSource.SetBitmapAsync(softwareBitmap);
                UIPreviewImage.Source = imageSource;
                // Encapsulate the image within a VideoFrame to be bound and evaluated
                VideoFrame inputImage = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);
                // bind the input image
                ImageFeatureValue imageTensor = ImageFeatureValue.CreateFromVideoFrame(inputImage);
                input.data = imageTensor;
            }
            catch (Exception e)
            {
            }
        }

Bu bölümde yapılan çalışmanın sonucu aşağıdaki gibi görünecektir.

        // Waiting for a click event to select a file 
        private async void OpenFileButton_Click(object sender, RoutedEventArgs e)
        {
            if (!await getImage())
            {
                return;
            }
            // After the click event happened and an input selected, we begin the model execution. 
            // Bind the model input
            await imageBind();
            // Model evaluation
            await evaluate();
            // Extract the results
            extractResult();
            // Display the results  
            await displayResult();
        }

        // A method to select an input image file
        private async Task<bool> getImage()
        {
            try
            {
                // Trigger file picker to select an image file
                FileOpenPicker fileOpenPicker = new FileOpenPicker();
                fileOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
                fileOpenPicker.FileTypeFilter.Add(".jpg");
                fileOpenPicker.FileTypeFilter.Add(".png");
                fileOpenPicker.ViewMode = PickerViewMode.Thumbnail;
                selectedStorageFile = await fileOpenPicker.PickSingleFileAsync();
                if (selectedStorageFile == null)
                {
                    return false;
                }
            }
            catch (Exception)
            {
                return false;
            }
            return true;
        }

        // A method to convert and bind the input image.  
        private async Task imageBind()
        {
            UIPreviewImage.Source = null;

            try
            {
                SoftwareBitmap softwareBitmap;
                using (IRandomAccessStream stream = await selectedStorageFile.OpenAsync(FileAccessMode.Read))
                {
                    // Create the decoder from the stream 
                    BitmapDecoder decoder = await BitmapDecoder.CreateAsync(stream);

                    // Get the SoftwareBitmap representation of the file in BGRA8 format
                    softwareBitmap = await decoder.GetSoftwareBitmapAsync();
                    softwareBitmap = SoftwareBitmap.Convert(softwareBitmap, BitmapPixelFormat.Bgra8, BitmapAlphaMode.Premultiplied);
                }
                // Display the image
                SoftwareBitmapSource imageSource = new SoftwareBitmapSource();
                await imageSource.SetBitmapAsync(softwareBitmap);
                UIPreviewImage.Source = imageSource;

                // Encapsulate the image within a VideoFrame to be bound and evaluated
                VideoFrame inputImage = VideoFrame.CreateWithSoftwareBitmap(softwareBitmap);

                // bind the input image
                ImageFeatureValue imageTensor = ImageFeatureValue.CreateFromVideoFrame(inputImage);
                input.data = imageTensor;
            }
            catch (Exception e)
            {
            }
        }

Modeli bağlama ve değerlendirme

Ardından modeli temel alan bir oturum oluşturacak, oturumdaki girişi ve çıkışı bağlayacak ve modeli değerlendireceksiniz.

Modeli bağlamak için bir oturum oluşturun:

Oturum oluşturmak için sınıfını LearningModelSession kullanırsınız. Bu sınıf makine öğrenmesi modellerini değerlendirmek için kullanılır ve modeli çalıştıran ve modeli değerlendiren bir cihaza bağlar. Modelinizi makinenizin belirli bir cihazında yürütmek için bir oturum oluşturduğunuzda bir cihaz seçebilirsiniz. Varsayılan cihaz CPU'dur.

Uyarı

Cihaz seçme hakkında daha fazla bilgi edinmek için lütfen Oturum oluşturma belgelerini gözden geçirin.

Model girişlerini ve çıkışlarını bağlama:

Giriş ve çıkış bağlamak için sınıfını LearningModelBinding kullanırsınız. Makine öğrenmesi modeli, bilgileri modele aktaran ve modelden dışarı aktaran giriş ve çıkış özelliklerine sahiptir. Gerekli özelliklerin Window ML API'leri tarafından desteklenmesi gerektiğini unutmayın. LearningModelBinding sınıfı, değerleri adlandırılmış giriş ve çıkış özelliklerine bağlamak için LearningModelSession öğesine uygulanır.

Bağlamanın uygulanması mlgen tarafından otomatik olarak oluşturulur, bu nedenle bununla ilgilenmeniz gerekmez. Bağlama, sınıfının önceden tanımlanmış yöntemleri LearningModelBinding çağrılarak uygulanır. Bizim örneğimizde, adlandırılmış özellik türüne bir değer bağlamak için yöntemini kullanır Bind .

Windows ML şu anda Tensorlar (çok boyutlu diziler), Diziler (değer vektörleri), Eşleme (bilgi değer çiftleri) ve Görüntüler (belirli biçimler) gibi tüm ONNX özellik türlerini destekler. Tüm görüntüler Windows ML'de tensor biçiminde gösterilir. Tensorizasyon, bir görüntüyü tensöre dönüştürme işlemidir ve bağlama sırasında gerçekleşir.

Neyse ki, tensorizasyon dönüştürme işlemiyle ilgilenmeniz gerekmez. Önceki ImageFeatureValue bölümde kullandığınız yöntem hem dönüştürme hem de tensorizasyon işlemleriyle ilgilenir, böylece görüntüler modelin gerekli görüntü biçimiyle eşleşebilir.

Uyarı

WinML tarafından desteklenen özellik türleri ve bir LearningModel bağlama hakkında daha fazla bilgi edinmek için Model bağlama belgesini inceleyin.

Modeli değerlendirme:

Modeli ve sınırlanmış değerleri modelin girişlerine ve çıkışlarına bağlamak için bir oturum oluşturduktan sonra modelin girişlerini değerlendirebilir ve tahminlerini alabilirsiniz. Model yürütmeyi çalıştırmak için LearningModelSession üzerinde önceden tanımlanmış değerlendirme yöntemlerinden herhangi birini çağırmanız gerekir. Bizim örneğimizde yöntemini kullanacağız EvaluateAsync .

yöntemine benzer şekilde CreateFromStreamAsyncEvaluateAsync WinML Kod Oluşturucu tarafından da otomatik olarak oluşturulmuştur, bu nedenle bu yöntemi uygulamanız gerekmez. Dosyada classifier.cs bu yöntemi gözden geçirebilirsiniz.

Yöntemi, EvaluateAsync bağlamalara bağlı olan özellik değerlerini kullanarak makine öğrenmesi modelini asenkron olarak değerlendirir. LearningModelSession ile bir oturum oluşturur, girişi ve çıkışı LearningModelBinding ile bağlar, model değerlendirmesini yürütür ve LearningModelEvaluationResult sınıfını kullanarak modelin çıkış özelliklerini alır.

Uyarı

Modeli çalıştırmaya yönelik diğer değerlendirme yöntemleri hakkında bilgi edinmek için LearningModelSession Sınıfı belgelerini gözden geçirerek LearningModelSession'da hangi yöntemlerin uygulanabileceğini denetleyin.

  1. MainPage sınıfındaki kod dosyanıza MainPage.xaml.cs aşağıdaki yöntemi ekleyerek bir oturum oluşturun, modeli bağlayın ve değerlendirin.
        // A method to evaluate the model
        private async Task evaluate()
        {
            output = await modelGen.EvaluateAsync(input);
        }

Sonuçları ayıklama ve görüntüleme

Şimdi model çıkışını ayıklamanız ve istenen sonuçları görüntülemeniz zorundasınız. Bunu extractResult ve displayResult yöntemlerini uygulayarak yapacaksınız.

Daha önce incelediğiniz gibi model iki çıkış döndürür: ilki stringlerden oluşan bir tensor'dür, kayıp adı verilen ikincisi ise her etiketlenmiş sınıflandırma için olasılığı açıklayan bir string-float eşlemesi dizisidir. Bu nedenle, sonucu ve olasılığı başarıyla görüntülemek için tek yapmamız gereken kayıp çıktısından çıktıyı ayıklamaktır. Doğru sonucu döndürmek için en yüksek olasılığı bulmamız gerekir.

  1. extractResult yöntemini MainPage.xaml.cs sınıfının içindeki MainPage kod dosyasına ekleyin.
        private void extractResult()
        {
        // A method to extract output (result and a probability) from the "loss" output of the model 
            var collection = output.loss;
            float maxProbability = 0;
            string keyOfMax = "";

            foreach (var dictionary in collection)
            {
                foreach (var key in dictionary.Keys)
                {
                    if (dictionary[key] > maxProbability)
                    {
                        maxProbability = dictionary[key];
                        keyOfMax = key;
                    }
                }
            }
            result = keyOfMax;
            resultProbability = maxProbability;
        }
  1. displayResult yöntemini MainPage.xaml.cs sınıfının içindeki MainPage kod dosyasına ekleyin.
        // A method to display the results
        private async Task displayResult()
        {
            displayOutput.Text = result.ToString();
            displayProbability.Text = resultProbability.ToString();
        }

Bağlama ve Değerlendirme ve Sonuçları Ayıkla ve Görüntüle bölümlerinin uygulamamızın WinML kodundaki sonucu aşağıdaki gibi görünecektir.

        // A method to evaluate the model
        private async Task evaluate()
        {
            output = await modelGen.EvaluateAsync(input);
        }

        // A method to extract output (string and a probability) from the "loss" output of the model 
        private void extractResult()
        {
            var collection = output.loss;
            float maxProbability = 0;
            string keyOfMax = "";

            foreach (var dictionary in collection)
            {
                foreach (var key in dictionary.Keys)
                {
                    if (dictionary[key] > maxProbability)
                    {
                        maxProbability = dictionary[key];
                        keyOfMax = key;
                    }
                }
            }
            result = keyOfMax;
            resultProbability = maxProbability;
        }

        // A method to display the results
        private async Task displayResult()
        {
            displayOutput.Text = result.ToString();
            displayProbability.Text = resultProbability.ToString();
        }

Bu kadar! Sınıflandırma modelimizi test etmek için temel bir GUI ile Windows makine öğrenmesi uygulamasını başarıyla oluşturdunuz. Sonraki adım uygulamayı başlatmak ve Windows cihazınızda yerel olarak çalıştırmaktır.

Uygulamayı başlatma

Uygulama arabirimini tamamladıktan, modeli ekledikten ve WinML kodunu oluşturduktan sonra uygulamayı test edebilirsiniz. Üst araç çubuğundaki açılır menülerin Debug olarak ayarlandığından emin olun. Solution Platform'yi x64 olarak değiştirin ve cihazınız 64 bitse yerel makinenizde projeyi çalıştırın, veya Solution Platform'yi olarak değiştirin, eğer cihazınız 32 bitse.

Uygulamamızı test etmek için aşağıdaki meyve görüntüsünü kullanacaksınız. Şimdi uygulamamızın görüntünün içeriğini nasıl sınıflandırır görelim.

Örnek meyve resmi

  1. Uygulamayı test etmek için bu görüntüyü yerel cihazınıza kaydedin. Gerekirse görüntü biçimini jpg olarak değiştirin. Ayrıca, yerel cihazınızdan uygun bir biçimde ( .jpg, .png, .bmpveya .gif biçimlerinde) ilgili diğer tüm görüntüleri ekleyebilirsiniz.

  2. Projeyi çalıştırmak için araç çubuğundaki Start Debugging düğmeye veya tuşuna basın F5.

  3. Uygulama başladığında, Pick Image tuşuna basın ve yerel cihazınızdan görüntüyü seçin.

Resim seç iletişim kutusu

Sonuç hemen ekranda görünür. Gördüğünüz gibi, WinML uygulamamız görüntüyü 99,9% güvenilirlik derecesiyle meyve veya sebze olarak başarıyla sınıflandırdı.

Başarılı görüntü sınıflandırması

Özet

Model oluşturma aşamasından başarılı yürütmeye kadar ilk Windows Machine Learning uygulamanızı yaptınız.

Ek Kaynaklar

Bu öğreticide bahsedilen konular hakkında daha fazla bilgi edinmek için aşağıdaki kaynakları ziyaret edin: