öğretici: ML .net görüntü sınıflandırma apı 'si ile aktarım öğrenimi kullanarak otomatikleştirilmiş görsel inceleme

özel derin öğrenme modelini, aktarım öğrenimi, önceden eğitilen bir ön akış modeli ve ML .net görüntü sınıflandırma apı 'sini kullanarak, somut yüzeyleri kırıllanmış veya kırılk olarak sınıflandırmak için nasıl eğeceğinizi öğrenin.

Bu öğreticide şunların nasıl yapıldığını öğreneceksiniz:

  • Sorunu anlama
  • ML .net görüntü sınıflandırma apı 'si hakkında bilgi edinin
  • Önceden eğitilen modeli anlama
  • Özel bir TensorFlow görüntü sınıflandırma modelini eğitme için aktarım öğrenimi kullanma
  • Özel model ile görüntüleri sınıflandır

Önkoşullar

Görüntü sınıflandırma aktarım öğrenme örneğine genel bakış

Bu örnek, görüntüleri önceden eğitilen bir öğrenme TensorFlow modeli kullanarak sınıflandırın bir C# .NET Core konsol uygulamasıdır. Bu örneğin kodu örnekler tarayıcısındabulunabilir.

Sorunu anlama

Görüntü sınıflandırması bir bilgisayar vizyonu sorunudur. Görüntü sınıflandırması bir görüntüyü giriş olarak alır ve önceden tanımlanmış bir sınıfa kategorilere ayırır. Görüntü sınıflandırma modelleri genellikle derin öğrenme ve sinir ağları kullanılarak eğitilir. Daha fazla bilgi için bkz. derin öğrenme ve makine öğrenimi .

Görüntü sınıflandırmasının kullanışlı olduğu bazı senaryolar şunlardır:

  • Yüz tanıma
  • Duygu algılama
  • Tıp tanısı
  • Yer işareti algılama

Bu öğreticide, bir özel görüntü sınıflandırma modeli sunarak, her ne kadar bozuk olan yapıları belirlemek için köprü oluşturma işlemlerini otomatik görsel denetlemesi gerçekleştirebilir.

ML .net görüntü sınıflandırma apı 'si

ML .net, görüntü sınıflandırması yapmak için çeşitli yollar sağlar. Bu öğretici, görüntü sınıflandırması API 'sini kullanarak Aktarım öğrenimini uygular. Görüntü sınıflandırma API 'si, TensorFlow C++ API 'SI için C# bağlamaları sağlayan alt düzey bir kitaplık olan TensorFlow.netkullanımını sağlar.

Öğrenme aktarımı nedir?

Aktarım öğrenimi, bir problemi bir sorunla ilgili diğer soruna çözüm olarak elde edilen bilgileri uygular.

Derin bir öğrenme modelini sıfırdan eğitmek için birkaç parametre, büyük miktarda etiketli eğitim verisi ve çok miktarda bilgi işlem kaynağı (yüzlerce GPU saati) ayarlanması gerekir. Aktarım öğrenimi ile önceden eğitilen bir modelin kullanılması, eğitim sürecini kısayollara eklemenize olanak tanır.

Eğitim süreci

Görüntü sınıflandırma API 'SI, önceden eğitilen bir TensorFlow modeli yükleyerek eğitim sürecini başlatır. Eğitim süreci iki adımdan oluşur:

  1. Performans sorunu aşaması
  2. Eğitim aşaması

Eğitim adımları

Performans sorunu aşaması

Performans sorunu aşamasında, eğitim görüntüleri kümesi yüklenir ve piksel değerleri, önceden eğitilen modelin dondurulmuş katmanları için giriş veya özellikler olarak kullanılır. Dondurulmuş katmanlar, sinir ağındaki tüm katmanları, tıkanıklık katmanı olarak bilinen Penultimate katmanına kadar içerir. Bu katmanlarda hiçbir eğitim gerçekleşmediğinden ve işlemler doğrudan geçiş yaptığından, bu katmanlar dondurulmuş olarak adlandırılır. Farklı sınıflar arasında ayrım yapan bir modele yardımcı olan alt düzey desenlerin hesaplandığı, Bu dondurulmuş katmanlarda. Katman sayısı arttıkça bu adım daha yoğun bir işlemdir. Neyse ki, bu bir kerelik hesaplama olduğundan, sonuçlar önbelleğe alınabilir ve daha sonra farklı parametrelerle denemeler yaparken çalışır.

Eğitim aşaması

Performans sorunlarına neden olan çıkış değerleri hesaplandıktan sonra, modelin son katmanını yeniden eğitmek için giriş olarak kullanılırlar. Bu işlem yinelemeli ve model parametreleri tarafından belirtilen sayıda kez çalıştırılır. Her çalıştırma sırasında, kayıp ve doğruluk değerlendirilir. Daha sonra, kaybı en aza indirmek ve doğruluğu en üst düzeye çıkarmak için modeli geliştirmek üzere uygun ayarlamalar yapılır. Eğitim tamamlandığında, iki model biçimi çıkış olur. bunlardan biri .pb modelin sürümüdür ve diğeri ise .zip modelin .net tarafından serileştirilmiş sürümüdür ML. ML .net tarafından desteklenen ortamlarda çalışırken, .zip modelin sürümünün kullanılması önerilir. ancak, ML .net desteklenmediği ortamlarda sürümü kullanma seçeneğiniz vardır .pb .

Önceden eğitilen modeli anlama

Bu öğreticide kullanılan önceden eğitilen model, kalan ağ (ResNet) v2 modelinin 101 katmanlı varyantıdır. Orijinal model resimleri bin kategoride sınıflandırmakta tasarlanmıştır. Model, 224 x 224 boyutundaki bir görüntüyü giriş olarak alır ve eğitilen sınıfların her biri için sınıf olasılıkların çıkışını çıkarır. Bu modelin bir parçası, iki sınıf arasında tahmine dayalı hale getirmek için özel görüntüler kullanarak yeni bir modeli eğitme için kullanılır.

Konsol uygulaması oluşturma

Aktarım öğrenimine ve görüntü sınıflandırma API 'sine ilişkin genel bir bilgiye sahip olduğunuza göre, uygulamayı derlemek zaman alabilir.

  1. "DeepLearning_ImageClassification_Binary" adlı bir C# konsol uygulaması oluşturun. İleri düğmesine tıklayın.

  2. Kullanılacak çerçeve olarak .NET 6 ' yı seçin. Oluştur düğmesine tıklayın.

  3. Microsoft. ML NuGet paketini yükler:

    Not

    Bu örnek, aksi belirtilmediği takdirde, belirtilen NuGet paketlerinin en son kararlı sürümünü kullanır.

    1. Çözüm Gezgini, projenize sağ tıklayın ve NuGet paketlerini yönet' i seçin.
    2. Paket kaynağı olarak "nuget.org" öğesini seçin.
    3. Gözat sekmesini seçin.
    4. Ön sürümü dahil et onay kutusunu işaretleyin.
    5. Microsoft. ml için arama yapın.
    6. Install düğmesini seçin.
    7. Değişiklikleri Önizle Iletişim kutusunda Tamam düğmesini seçin ve ardından listelenen paketlerin lisans koşullarını kabul ediyorsanız Lisans kabulü iletişim kutusunda kabul ediyorum düğmesini seçin.
    8. Microsoft. ML için bu adımları yineleyin . Vision, SciSharp. TensorFlow. Redist sürüm 2.3.1 ve Microsoft. ml. ımageanalytics NuGet paketleri.

Verileri hazırlama ve anlama

Not

Bu öğreticinin veri kümeleri Maguire, Marc; adresinden Dorafshan, Sattar; ve Thomas, Robert J., "SDNET2018: Machine Learning uygulamaları için somut bir görüntü veri kümesi" (2018). Tüm veri kümelerine gözatamazsınız. Kağıt 48. https://digitalcommons.usu.edu/all_datasets/48

SDNET2018, kırılmamış ve kırılamayan somut yapılar (köprü kümeleri, duvarlar ve Payalar) için ek açıklamalar içeren bir görüntü veri kümesidir.

SDNET2018 veri kümesi Köprüsü destesi örnekleri

Veriler üç alt dizine göre düzenlenir:

  • D köprü destesi görüntülerini içerir
  • P paizni görüntülerini içerir
  • W duvar görüntülerini içerir

Bu alt dizinlerin her biri, iki ek ön eki içerir:

  • C, kırçıkarılan yüzeyler için kullanılan önekidir
  • U, kırçıkarılan yüzeyler için kullanılan önekidir

Bu öğreticide, yalnızca köprü destesi görüntüleri kullanılır.

  1. Veri kümesini indirin ve sıkıştırmayı açın.
  2. Veri kümesi dosyalarınızı kaydetmek için projenizde "varlıklar" adlı bir dizin oluşturun.
  3. Son daraltılmış dizinden CD ve ud alt dizinlerini varlıklar dizinine kopyalayın.

Giriş ve çıkış sınıfları oluşturma

  1. Program. cs dosyasını açın ve using dosyanın en üstündeki mevcut deyimlerini aşağıdaki gibi değiştirin:

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.IO;
    using Microsoft.ML;
    using static Microsoft.ML.DataOperationsCatalog;
    using Microsoft.ML.Vision;
    
  2. Program Program. cs' deki sınıfının altında adlı bir sınıf oluşturun ImageData . Bu sınıf başlangıçta yüklenen verileri temsil etmek için kullanılır.

    class ImageData
    {
        public string ImagePath { get; set; }
    
        public string Label { get; set; }
    }
    

    ImageData aşağıdaki özellikleri içerir:

    • ImagePath , görüntünün depolandığı tam yoldur.
    • Label , görüntünün ait olduğu kategorisidir. Tahmin etmek için bu değerdir.
  3. Giriş ve çıkış verileriniz için sınıflar oluşturma

    1. sınıfının ImageData altında, giriş verilerinizin şemasını adlı yeni bir sınıfta ModelInput tanımlayın.

      class ModelInput
      {
          public byte[] Image { get; set; }
          
          public UInt32 LabelAsKey { get; set; }
      
          public string ImagePath { get; set; }
      
          public string Label { get; set; }
      }
      

      ModelInput aşağıdaki özellikleri içerir:

      • Image , byte[] görüntünün gösterimidir. Model, eğitim için görüntü verilerini bu türde olmasını bekler.
      • LabelAsKey , sayısal Label gösterimidir.
      • ImagePath , görüntünün depolandığı tam yoldur.
      • Label , görüntünün ait olduğu kategoridir. Tahmin etmek için bu değerdir.

      Modeli Image eğitmek ve tahmin yapmak için yalnızca ve LabelAsKey kullanılır. Özgün ImagePath görüntü dosyası adına ve Label kategorisine erişmek için ve özellikleri tutulur.

    2. Ardından sınıfının ModelInput altında, çıktı verilerinizin şemasını adlı yeni bir sınıfta ModelOutput tanımlayın.

      class ModelOutput
      {
          public string ImagePath { get; set; }
      
          public string Label { get; set; }
      
          public string PredictedLabel { get; set; }
      }
      

      ModelOutput aşağıdaki özellikleri içerir:

      • ImagePath , görüntünün depolandığı tam yoldur.
      • Label , görüntünün ait olduğu özgün kategoridir. Tahmin etmek için bu değerdir.
      • PredictedLabel , model tarafından tahmin edilen değerdir.

      benzer ModelInput şekilde, PredictedLabel modelin yaptığı tahmini içerdiği için yalnızca tahmin yapmak için gereklidir. Özgün ImagePath görüntü dosyası adına ve Label kategorisine erişmek için ve özellikleri korunur.

Çalışma alanı dizini oluşturma

Eğitim ve doğrulama verileri sık sık değişmezse, daha fazla çalıştırma için hesaplanan performans sorunu değerlerini önbelleğe alınmış olarak önbelleğe alınmış iyi bir uygulamadır.

  1. Projenize, hesaplanan performans sorunu değerlerini ve modelin sürümünü depolamak için çalışma alanı adlı yeni .pb bir dizin oluşturun.

Yolları tanımlama ve değişkenleri başlatma

  1. using deyimlerinin altında varlıklarınızı, hesaplanan performans sorunu değerlerini ve modelin .pb sürümünü tanımlayın.

    var projectDirectory = Path.GetFullPath(Path.Combine(AppContext.BaseDirectory, "../../../"));
    var workspaceRelativePath = Path.Combine(projectDirectory, "workspace");
    var assetsRelativePath = Path.Combine(projectDirectory, "assets");
    
  2. Değişkeni mlContext MLContext'inyeni bir örneğiyle başlatma.

    MLContext mlContext = new MLContext();
    

    MLContext sınıfı tüm ML.NET işlemleri için bir başlangıç noktasıdır ve mlContext'i başlatma işlemi, model oluşturma iş akışı nesneleri arasında paylaşılacak yeni bir ML.NET ortamı oluşturur. Kavramsal olarak bu, DbContext Entity Framework.

Verileri yükleme

Veri yükleme yardımcı programı yöntemi oluşturma

Görüntüler iki alt dizinde depolanır. Verileri yüklemeden önce, bir nesne listesine biçimlendirilmiş olması ImageData gerekir. Bunu yapmak için yöntemini LoadImagesFromDirectory oluşturun.

IEnumerable<ImageData> LoadImagesFromDirectory(string folder, bool useFolderNameAsLabel = true)
{

}
  1. alt LoadImagesFromDirectory dizinlerinden tüm dosya yollarını almak için içine aşağıdaki kodu ekleyin:

    var files = Directory.GetFiles(folder, "*",
        searchOption: SearchOption.AllDirectories);
    
  2. Ardından, deyimini kullanarak dosyaların her biri için foreach yineler.

    foreach (var file in files)
    {
    
    }
    
  3. deyiminin foreach içinde, dosya uzantılarının destek verilip desteklenene sahip olduğunu kontrol edin. Görüntü Sınıflandırma API'si JPEG ve PNG biçimlerini destekler.

    if ((Path.GetExtension(file) != ".jpg") && (Path.GetExtension(file) != ".png"))
        continue;
    
    
  4. Ardından dosyanın etiketini bulun. parametresi useFolderNameAsLabel olarak true ayarlanırsa, dosyanın kayded olduğu üst dizin etiket olarak kullanılır. Aksi takdirde, etiketin dosya adının veya dosya adının ön eki olmasını bekler.

    var label = Path.GetFileName(file);
    
    if (useFolderNameAsLabel)
        label = Directory.GetParent(file).Name;
    else
    {
        for (int index = 0; index < label.Length; index++)
        {
            if (!char.IsLetter(label[index]))
            {
                label = label.Substring(0, index);
                break;
            }
        }
    }
    
  5. Son olarak, yeni bir örneği ModelInput oluşturun.

    yield return new ImageData()
    {
        ImagePath = file,
        Label = label
    };
    

Verileri hazırlama

  1. Değişkeni LoadImagesFromDirectory başlatan eğitim için kullanılan görüntülerin listesini almak için yardımcı program yöntemini mlContext çağırma.

    IEnumerable<ImageData> images = LoadImagesFromDirectory(folder: assetsRelativePath, useFolderNameAsLabel: true);
    
  2. Ardından yöntemini kullanarak görüntüleri bir IDataView içine LoadFromEnumerable yükleyebilirsiniz.

    IDataView imageData = mlContext.Data.LoadFromEnumerable(images);
    
  3. Veriler dizinlerden okunma sırasına göre yüklenir. Verileri dengelemek için yöntemini kullanarak ShuffleRows karıştırabilirsiniz.

    IDataView shuffledData = mlContext.Data.ShuffleRows(imageData);
    
  4. Makine öğrenmesi modelleri, girişin sayısal biçimde olmasını bekler. Bu nedenle, eğitim öncesinde bazı ön işlemlerin veriler üzerinde yapılması gerekir. ve EstimatorChain dönüştürmelerden bir MapValueToKey LoadRawImageBytes oluşturun. Dönüştürme, sütundaki kategorik değeri alır, sayısal değere dönüştürür ve adlı MapValueToKey Label yeni bir KeyType sütunda depolar. LabelAsKey LoadImages, sütundaki değerleri ImagePath ve eğitim için görüntüleri yüklemek için imageFolder parametresini alır.

    var preprocessingPipeline = mlContext.Transforms.Conversion.MapValueToKey(
            inputColumnName: "Label",
            outputColumnName: "LabelAsKey")
        .Append(mlContext.Transforms.LoadRawImageBytes(
            outputColumnName: "Image",
            imageFolder: assetsRelativePath,
            inputColumnName: "ImagePath"));
    
  5. yöntemini kullanarak verileri yöntemine ve ardından önceden işlenmiş verileri içeren Fit preprocessingPipeline EstimatorChain Transform bir IDataView döndüren yöntemine uygulayabilirsiniz.

    IDataView preProcessedData = preprocessingPipeline
                        .Fit(shuffledData)
                        .Transform(shuffledData);
    
  6. Modeli eğitmek için bir eğitim veri kümesine ve doğrulama veri kümesine sahip olmak önemlidir. Model eğitim kümesi üzerinde eğitildi. Ne kadar iyi bir tahminde bulundurarak, doğrulama kümesine karşı performansla ölçülebilir. Model, bu performansın sonuçlarına göre iyileştirme yapmak için öğrendiklerine göre ayarlamalar yapar. Doğrulama kümesi, özgün veri kümenizi bölmeden veya bu amaç için ayrılmış başka bir kaynaktan gelebilir. Bu durumda, önceden işlenmiş veri kümesi eğitim, doğrulama ve test kümelerine ayrılır.

    TrainTestData trainSplit = mlContext.Data.TrainTestSplit(data: preProcessedData, testFraction: 0.3);
    TrainTestData validationTestSplit = mlContext.Data.TrainTestSplit(trainSplit.TestSet);
    

    Yukarıdaki kod örneği iki bölme gerçekleştirir. İlk olarak, önceden işlenmiş veriler bölünüyor ve eğitim için %70 kullanılırken kalan %30'lar doğrulama için kullanılır. Ardından % 30 doğrulama kümesi doğrulama ve test kümelerine bölünüyor. Burada doğrulama için %90, test için %10 kullanılır.

    Bu veri bölümlerinin amacını düşünmenin bir yolu sınava girmektedir. Sınavda ders çıkararak sınavla ilgili kavramları kavramak için notlarınızı, kitaplarınızı veya diğer kaynaklarınızı gözden geçirebilirsiniz. Eğitim kümesi bu nedenledir. Daha sonra, bilginizi doğrulamak için sahte bir sınava girsiniz. Doğrulama kümesi bu noktada oldukça kullanışlıdır. Gerçek sınava başlamadan önce kavramları iyi kavrayıp kavramama konusunda bilgi edinip anlamama konusunda kontrol etmek istiyor. Bu sonuçlara bağlı olarak, yanlış yaptığınız veya iyi anlamadıklarınızı not alır ve gerçek sınav için gözden geçiriken değişikliklerinizi dahil edin. Son olarak sınava gireceksin. Test kümesi bunun için kullanılır. Sınavda olan soruları daha önce hiç gördünüz ve artık eğitim ve doğrulamadan öğrendiklerinizi kullanarak bilginizi el ile göreve uygulayabilirsiniz.

  7. Bölümleri eğitim, doğrulama ve test verileri için ilgili değerlerini attayabilirsiniz.

    IDataView trainSet = trainSplit.TrainSet;
    IDataView validationSet = validationTestSplit.TrainSet;
    IDataView testSet = validationTestSplit.TestSet;
    

Eğitim işlem hattını tanımlama

Model eğitimi birkaç adımdan oluşur. İlk olarak, modeli eğitmek için Görüntü Sınıflandırma API'si kullanılır. Ardından, dönüştürme kullanılarak sütundaki kodlanmış etiketler özgün PredictedLabel kategorik değerlerine geri MapKeyToValue dönüştürülür.

  1. bir için gerekli ve isteğe bağlı bir parametre kümesi depolamak için yeni bir değişken ImageClassificationTrainer oluşturun.

    var classifierOptions = new ImageClassificationTrainer.Options()
    {
        FeatureColumnName = "Image",
        LabelColumnName = "LabelAsKey",
        ValidationSet = validationSet,
        Arch = ImageClassificationTrainer.Architecture.ResnetV2101,
        MetricsCallback = (metrics) => Console.WriteLine(metrics),
        TestOnTrainSet = false,
        ReuseTrainSetBottleneckCachedValues = true,
        ReuseValidationSetBottleneckCachedValues = true
    };
    

    birkaç ImageClassificationTrainer isteğe bağlı parametre alır:

    • FeatureColumnName , model için giriş olarak kullanılan sütun.
    • LabelColumnName , tahminde yer alan değerin sütunu olur.
    • ValidationSet , IDataView doğrulama verilerini içeren ' dır.
    • Arch , önceden eğitilen model mimarilerinin hangilerini kullanmayacaklarını tanımlar. Bu öğreticide ResNetv2 modelinin 101 katmanlı varyantı kullanılır.
    • MetricsCallback eğitim sırasında ilerlemeyi izlemek için bir işlev bağlar.
    • TestOnTrainSet , doğrulama kümesi mevcut olduğunda modele eğitim kümesine karşı performansı ölçmeyi söyler.
    • ReuseTrainSetBottleneckCachedValues modele sonraki çalıştırmalarda performans sorunu aşamasından önbelleğe alınmış değerlerin kullanıp kullanmay olmadığını söyler. Performans sorunu aşaması, ilk kez gerçekleştirilen işlem gücü yoğun bir tek geçişli hesaplamadır. Eğitim verileri değişmezse ve farklı sayıda dönem veya toplu iş boyutu kullanarak deneme yapmak istiyorsanız, önbelleğe alınan değerlerin kullanımı modeli eğitmek için gereken süre miktarını önemli ölçüde azaltır.
    • ReuseValidationSetBottleneckCachedValues , ReuseTrainSetBottleneckCachedValues yalnızca bu durumda doğrulama veri kümesine benzer.
    • WorkspacePath , hesaplanan performans sorunu değerlerinin ve modelin sürümünün .pb depolay olduğu dizini tanımlar.
  2. hem EstimatorChain hem de 'den oluşan eğitim işlem mapLabelEstimator hattını ImageClassificationTrainer tanımlayın.

    var trainingPipeline = mlContext.MulticlassClassification.Trainers.ImageClassification(classifierOptions)
        .Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
    
  3. Modelinizi Fit eğitmek için yöntemini kullanın.

    ITransformer trainedModel = trainingPipeline.Fit(trainSet);
    

Modeli kullanma

Modelinizi eğittiniz, şimdi de görüntüleri sınıflandırmak için kullanabilirsiniz.

konsolunda tahmin bilgilerini görüntülemek için OutputPrediction adlı yeni bir yardımcı program yöntemi oluşturun.

private static void OutputPrediction(ModelOutput prediction)
{
    string imageName = Path.GetFileName(prediction.ImagePath);
    Console.WriteLine($"Image: {imageName} | Actual Value: {prediction.Label} | Predicted Value: {prediction.PredictedLabel}");
}

Tek bir görüntüyü sınıflandırma

  1. Tek bir görüntü tahmini yapmak ClassifySingleImage ve çıktısını oluşturmak için adlı yeni bir yöntem oluşturun.

    void ClassifySingleImage(MLContext mlContext, IDataView data, ITransformer trainedModel)
    {
    
    }
    
  2. yönteminin PredictionEngine içinde bir ClassifySingleImage oluşturun. , tek bir veri örneği üzerinde geçiş ve ardından tahmin PredictionEngine gerçekleştirmeye olanak sağlayan kullanışlı bir API'dir.

    PredictionEngine<ModelInput, ModelOutput> predictionEngine = mlContext.Model.CreatePredictionEngine<ModelInput, ModelOutput>(trainedModel);
    
  3. Tek bir örnek ModelInput erişmek için yöntemini kullanarak içine dönüştür ve ardından ilk data IDataView IEnumerable CreateEnumerable gözlemi alın.

    ModelInput image = mlContext.Data.CreateEnumerable<ModelInput>(data,reuseRowObject:true).First();
    
  4. PredictGörüntüyü sınıflandırmak için yöntemini kullanın.

    ModelOutput prediction = predictionEngine.Predict(image);
    
  5. Yöntemi ile tahmine göre tahmine çıkış yapın OutputPrediction .

    Console.WriteLine("Classifying single image");
    OutputPrediction(prediction);
    
  6. Aşağıdaki çağrı, ClassifySingleImage Fit görüntü sınama kümesini kullanarak yöntemi çağırmıştır.

    ClassifySingleImage(mlContext, testSet, trainedModel);
    

Birden çok görüntüyü sınıflandırma

  1. ClassifyImages ClassifySingleImage Birden çok görüntü tahmini yapmak ve çıkarmak için yönteminin altında adlı yeni bir yöntem ekleyin.

    void ClassifyImages(MLContext mlContext, IDataView data, ITransformer trainedModel)
    {
    
    }
    
  2. IDataViewYöntemini kullanarak tahminleri içeren bir oluşturma oluşturun Transform . Aşağıdaki kodu yönteminin içine ekleyin ClassifyImages .

    IDataView predictionData = trainedModel.Transform(data);
    
  3. Tahmine dayalı olarak yinelemek için predictionData IDataView IEnumerable yöntemini kullanarak öğesine dönüştürün CreateEnumerable ve ardından ilk 10 gözlemyi alın.

    IEnumerable<ModelOutput> predictions = mlContext.Data.CreateEnumerable<ModelOutput>(predictionData, reuseRowObject: true).Take(10);
    
  4. Tahmine dayalı olarak orijinal ve tahmin edilen etiketleri yineleyin ve çıktı.

    Console.WriteLine("Classifying multiple images");
    foreach (var prediction in predictions)
    {
        OutputPrediction(prediction);
    }
    
  5. Son olarak, ClassifyImages ClassifySingleImage() Test görüntü kümesini kullanarak yönteminin altına çağrı yapın.

    ClassifyImages(mlContext, testSet, trainedModel);
    

Uygulamayı çalıştırma

Konsol uygulamanızı çalıştırın. Çıktının aşağıdakine benzer olması gerekir. Uyarıları veya işlem iletilerini görebilirsiniz, ancak bu iletiler netme için aşağıdaki sonuçlardan kaldırılmıştır. Breçekimi için çıkış yoğunlaştırılmış.

Performans sorunu aşaması

Görüntü adı için hiçbir değer yazdırılmaz, byte[] Bu nedenle görüntülenecek görüntü adı yok.

Phase: Bottleneck Computation, Dataset used:      Train, Image Index: 279
Phase: Bottleneck Computation, Dataset used:      Train, Image Index: 280
Phase: Bottleneck Computation, Dataset used: Validation, Image Index:   1
Phase: Bottleneck Computation, Dataset used: Validation, Image Index:   2

Eğitim aşaması

Phase: Training, Dataset used: Validation, Batch Processed Count:   6, Epoch:  21, Accuracy:  0.6797619
Phase: Training, Dataset used: Validation, Batch Processed Count:   6, Epoch:  22, Accuracy:  0.7642857
Phase: Training, Dataset used: Validation, Batch Processed Count:   6, Epoch:  23, Accuracy:  0.7916667

Görüntüleri sınıflandırın çıktısı

Classifying single image
Image: 7001-220.jpg | Actual Value: UD | Predicted Value: UD

Classifying multiple images
Image: 7001-220.jpg | Actual Value: UD | Predicted Value: UD
Image: 7001-163.jpg | Actual Value: UD | Predicted Value: UD
Image: 7001-210.jpg | Actual Value: UD | Predicted Value: UD

7001-220.jpg görüntüsünü incelemeden, aslında bunun kırdığını görebilirsiniz.

Tahmin için kullanılan SDNET2018 veri kümesi görüntüsü

Tebrikler! Artık görüntülerin sınıflandırılmasına yönelik derin bir öğrenme modelini başarıyla oluşturdunuz.

Modeli geliştirme

Modelinizin sonuçlarını tatmin ediyorsanız, aşağıdaki yaklaşımlardan bazılarını deneyerek performansını geliştirmeyi deneyebilirsiniz:

  • Daha fazla veri: bir modelin öğreni daha fazla örnek, ne kadar iyi çalışır. Tam SDNET2018 veri kümesini indirip eğmek için kullanın.
  • Verileri artırmak: verileri bir görüntü alarak ve farklı dönüşümler uygulayarak (Döndür, çevir, Shift, Kırp) veri eklemek için sık kullanılan bir tekniktir. Bu, modelin öğreni için daha fazla değişken örnek ekler.
  • Daha uzun bir süre eğitin: daha fazla eğitede, model daha fazla ayarlanmış olur. Dönemler sayısının artırılması, modelinizin performansını iyileştirebilecek.
  • Hyper-Parameters Ile denemeler yapın: Bu öğreticide kullanılan parametrelere ek olarak, diğer parametreler potansiyel olarak performansı iyileştirecek şekilde ayarlanabilir. Her dönem performansı iyileştirebilmek için modele yapılan güncelleştirmelerin büyüklüğünü belirleyen öğrenme oranını değiştirme.
  • Farklı bir model mimarisi kullanın: verilerinizin neye benzer olduğuna bağlı olarak, özelliklerini en iyi şekilde öğrenen en iyi şekilde bir model farklı olabilir. Modelinizin performansını karşılıyoruz, mimariyi değiştirmeyi deneyin.

Sonraki adımlar

bu öğreticide, aktarım öğrenimi, önceden eğitilen bir görüntü sınıflandırması tensorflow modeli ve somut yüzeyleri görüntüleri kırıllanmış veya kırılk olarak sınıflandırıp ML .net görüntü sınıflandırma apı 'sini kullanarak özel bir derin öğrenme modeli oluşturmayı öğrendiniz.

Daha fazla bilgi edinmek için sonraki öğreticiye ilerleyin.