Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
Görüntü işleme için önceden eğitilmiş bir TensorFlow modeli kullanarak görüntüleri kategorilere ayırmak için sınıflandırma modelini eğitmeyi öğrenin.
TensorFlow modeli, görüntüleri bin kategoriye ayırmak için eğitildi. TensorFlow modeli görüntülerdeki desenlerin nasıl tanınabileceğini bildiği için, ML.NET modeli ham görüntüleri sınıflandırma modelini eğitmek üzere özelliklere veya girişlere dönüştürmek için işlem hattında bu modelin bir kısmını kullanabilir.
Bu eğitimde şunları öğreniyorsunuz:
- Sorunu anlama
- Önceden eğitilmiş TensorFlow modelini ML.NET işlem hattına ekleme
- ML.NET modelini eğitin ve değerlendirin
- Test görüntüsünü sınıflandırma
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz. Varsayılan olarak, bu öğreticinin .NET proje yapılandırması .NET core 2.2'yi hedefler.
Önkoşullar
- Visual Studio 2022 veya üzeri
- Öğretici varlıkları dizini .ZIP dosyası
- InceptionV1 makine öğrenmesi modeli
Doğru makine öğrenmesi görevini seçin
Derin öğrenme
Derin öğrenme , görüntü işleme ve konuşma tanıma gibi alanlarda devrim yapan Machine Learning'in bir alt kümesidir.
Derin öğrenme modelleri, birden çok öğrenme katmanı içeren büyük etiketli veri kümeleri ve sinir ağları kullanılarak eğitilir. Derin öğrenme:
- Görüntü işleme gibi bazı görevlerde daha iyi performans gösterir.
- Çok büyük miktarda eğitim verileri gerektirir.
Görüntü sınıflandırma, görüntüleri otomatik olarak kategorilere ayırmamıza olanak tanıyan belirli bir sınıflandırma görevidir:
- Bir görüntüdeki insan yüzünü algılama veya algılamama.
- Kedileri ve köpekleri algılama.
Ya da aşağıdaki görüntülerde olduğu gibi, bir görüntünün yiyecek, oyuncak veya alet olup olmadığını belirlemek için:
Uyarı
Yukarıdaki görüntüler Wikimedia Commons'a aittir ve aşağıdaki gibi özniteliklendirilir:
- "220px-Pepperoni_pizza.jpg" Ortak Etki Alanı, https://commons.wikimedia.org/w/index.php?curid=79505,
- "119px-Nalle_-_a_small_brown_teddy_bear.jpg" Jonik tarafından - Kendi çekimi, CC BY-SA 2.0, https://commons.wikimedia.org/w/index.php?curid=48166.
- "193px-Broodrooster.jpg" M.Minderhoud Tarafından - Kendi çalışması, CC BY-SA 3.0, https://commons.wikimedia.org/w/index.php?curid=27403
Bir görüntü sınıflandırma modelini sıfırdan eğitmek için milyonlarca parametre, bir ton etiketli eğitim verisi ve çok miktarda işlem kaynağı (yüzlerce GPU saati) ayarlanması gerekir. Özel modeli sıfırdan eğitmek kadar etkili olmasa da, önceden eğitilmiş bir model kullanmak, binlerce resimle ve milyonlarca etiketli görüntüyle çalışarak ve oldukça hızlı bir şekilde özelleştirilmiş bir model oluşturarak (GPU olmayan bir makinede bir saat içinde) bu işleme kısayol oluşturmanıza olanak tanır. Bu öğreticide yalnızca bir düzine eğitim görüntüsü kullanılarak daha da azaltılır.
Inception model, görüntüleri bin kategoriye ayıracak şekilde eğitilir, ancak bu öğreticide resimleri daha küçük bir kategori kümesinde ve yalnızca bu kategorilerde sınıflandırmanız gerekir. 'nin resimleri tanıyıp özel görüntü sınıflandırıcınızın yeni sınırlı kategorilerinde sınıflandırabilmesini kullanabilirsiniz Inception model.
- Gıda
- Oyuncak
- Cihaz
Bu öğreticide, ImageNet veri kümesi üzerinde eğitilmiş popüler bir görüntü tanıma modeli olan TensorFlow Inception derin öğrenme modeli kullanılır. TensorFlow modeli tüm görüntüleri "Umbrella", "Jersey" ve "Dishwasher" gibi bin sınıfa sınıflandırır.
Inception model binlerce farklı görüntü üzerinde önceden eğitildiğinden, dahili olarak görüntü tanımlama için gereken görüntü özelliklerini içerir. Çok daha az sınıfa sahip yeni bir model eğitmek için modeldeki bu iç görüntü özelliklerinden yararlanabiliriz.
Aşağıdaki diyagramda gösterildiği gibi, .NET veya .NET Framework uygulamalarınızdaki ML.NET NuGet paketlerine bir başvuru eklersiniz. ML.NET, perde arkasında, var olan eğitilmiş bir TensorFlow model dosyasını yükleyen kod yazmanızı sağlayan yerel TensorFlow kitaplığını içerir ve buna başvurur.
Çok sınıflı sınıflandırma
TensorFlow başlangıç modelini kullanarak klasik makine öğrenmesi algoritmasına giriş olarak uygun özellikleri ayıkladıktan sonra, ML.NET çok sınıflı sınıflandırıcı eklersiniz.
Bu durumda kullanılan özel eğitmen , çok terimli lojistik regresyon algoritmasıdır.
Bu eğitmen tarafından uygulanan algoritma, görüntü verileri üzerinde çalışan derin öğrenme modeli için geçerli olan çok sayıda özellik ile ilgili sorunlar üzerinde iyi performans gösterir.
Daha fazla bilgi için bkz . Derin öğrenme ve makine öğrenmesi.
Data
İki veri kaynağı vardır: .tsv dosya ve görüntü dosyaları. Dosya tags.tsv iki sütun içerir: birincisi olarak ImagePath tanımlanır ve ikincisi görüntüye karşılık gelen sütundur Label . Aşağıdaki örnek dosyanın üst bilgi satırı yoktur ve şuna benzer:
broccoli.jpg food
pizza.jpg food
pizza2.jpg food
teddy2.jpg toy
teddy3.jpg toy
teddy4.jpg toy
toaster.jpg appliance
toaster2.png appliance
Eğitim ve test görüntüleri, bir zip dosyasında indirebileceğiniz varlık klasörlerinde bulunur. Bu görüntüler Wikimedia Commons'a aittir.
Wikimedia Commons, ücretsiz medya deposu. 10:48, 17 Ekim 2018' den alındı: https://commons.wikimedia.org/wiki/Pizzahttps://commons.wikimedia.org/wiki/Toasterhttps://commons.wikimedia.org/wiki/Teddy_bear
Kurulum
Proje oluştur
"TransferLearningTF" adlı bir C# Konsol Uygulaması oluşturun. İleri düğmesine tıklayın.
Kullanılacak çerçeve olarak .NET 8'i seçin. Oluştur düğmesine tıklayın.
Microsoft.ML NuGet Paketini yükleyin:
Uyarı
Bu örnek, aksi belirtilmedikçe bahsedilen NuGet paketlerinin en son kararlı sürümünü kullanır.
- Çözüm Gezgini'nde projenize sağ tıklayın ve NuGet Paketlerini Yönet'i seçin.
- Paket kaynağı olarak "nuget.org" seçeneğini belirleyin, Gözat sekmesini seçin, Microsoft.ML arayın.
- Yükle düğmesini seçin.
- Değişiklikleri Önizle iletişim kutusunda Tamam düğmesini seçin.
- Listelenen paketlerin lisans koşullarını kabul ediyorsanız Lisans Kabulü iletişim kutusunda Kabul Ediyorum düğmesini seçin.
- Microsoft.ML.ImageAnalytics, SciSharp.TensorFlow.Redist ve Microsoft.ML.TensorFlow için bu adımları yineleyin.
Varlıkları indirme
Proje varlıkları dizini zip dosyasını indirin ve sıkıştırmayı açın.
assetsDizini TransferLearningTF proje dizininize kopyalayın. Bu dizin ve alt dizinleri, bu öğretici için gereken verileri ve destek dosyalarını (sonraki adımda indirip ekleyeceğiniz Inception modeli hariç) içerir.Inception modelini indirin ve sıkıştırılmış dosyayı açın.
Yeni sıkıştırmadan çıkarılan
inception5hdizinindeki içerikleri TransferLearningTF projenizinassets/inceptiondizinine kopyalayın. Bu dizin, aşağıdaki görüntüde gösterildiği gibi bu öğretici için gereken modeli ve ek destek dosyalarını içerir:
Çözüm Gezgini'nde varlık dizinindeki ve alt dizinlerdeki dosyaların her birine sağ tıklayın ve Özellikler'i seçin. Gelişmiş altında, Çıkış Dizinine Kopyala değerini Daha yeniyse kopyala olarak değiştirin.
Sınıf oluşturma ve yolları tanımlama
usingdosyasının en üstüne aşağıdaki ek yönergeleri ekleyin:using Microsoft.ML; using Microsoft.ML.Data;Varlık yollarını belirtmek için yönergelerin hemen altındaki
usingsatıra aşağıdaki kodu ekleyin:string _assetsPath = Path.Combine(Environment.CurrentDirectory, "assets"); string _imagesFolder = Path.Combine(_assetsPath, "images"); string _trainTagsTsv = Path.Combine(_imagesFolder, "tags.tsv"); string _testTagsTsv = Path.Combine(_imagesFolder, "test-tags.tsv"); string _predictSingleImage = Path.Combine(_imagesFolder, "toaster3.jpg"); string _inceptionTensorFlowModel = Path.Combine(_assetsPath, "inception", "tensorflow_inception_graph.pb");Giriş verileriniz ve tahminleriniz için sınıflar oluşturun.
public class ImageData { [LoadColumn(0)] public string? ImagePath; [LoadColumn(1)] public string? Label; }ImageDatagiriş görüntüsü veri sınıfıdır ve aşağıdaki String alanlara sahiptir:-
ImagePathgörüntü dosyası adını içerir. -
Labelresim etiketi için bir değer içerir.
-
için
ImagePredictionprojenize yeni bir sınıf ekleyin:public class ImagePrediction : ImageData { public float[]? Score; public string? PredictedLabelValue; }ImagePredictiongörüntü tahmin sınıfıdır ve aşağıdaki alanlara sahiptir:-
Scorebelirli bir görüntü sınıflandırması için güvenilirlik yüzdesini içerir. -
PredictedLabelValue, tahmin edilen görüntü sınıflandırma etiketi için bir değer içerir.
ImagePrediction, model eğitildikten sonra tahmin için kullanılan sınıftır. Görüntü yolu için birstring(ImagePath) vardır.Labelmodeli yeniden kullanmak ve eğitmek için kullanılır.PredictedLabelValuetahmin ve değerlendirme sırasında kullanılır. Değerlendirme için eğitim verilerini, tahmin edilen değerleri ve modeli içeren bir giriş kullanılır.-
Değişkenleri başlatma
değişkenini
mlContextyeni bir örneğiyleMLContextbaşlatın.Console.WriteLine("Hello World!")satırını aşağıdaki kodla değiştirin:MLContext mlContext = new MLContext();MLContext sınıfı tüm ML.NET işlemleri için bir başlangıç noktasıdır ve başlatma
mlContext, model oluşturma iş akışı nesneleri arasında paylaşılabilen yeni bir ML.NET ortamı oluşturur. Entity Framework'tekineDBContextbenzer, kavramsal olarak.
Inception modeli parametreleri için bir yapı oluşturma
Inception modelinde geçirmeniz gereken birkaç parametre vardır. Değişkeni başlattıktan hemen sonra, parametre değerlerini kullanıcı dostu isimlerle eşlemek için aşağıdaki kodla bir yapı oluşturun:
mlContextstruct InceptionSettings { public const int ImageHeight = 224; public const int ImageWidth = 224; public const float Mean = 117; public const float Scale = 1; public const bool ChannelsLast = true; }
Görüntüleme yardımcı programı yöntemi oluşturma
Görüntü verilerini ve ilgili tahminleri birden çok kez görüntüleyeceğinden, görüntü ve tahmin sonuçlarını görüntülemeyi işlemek için bir görüntüleme yardımcı programı yöntemi oluşturun.
DisplayResults()Aşağıdaki kodu kullanarak yapıdanInceptionSettingshemen sonra yöntemini oluşturun:void DisplayResults(IEnumerable<ImagePrediction> imagePredictionData) { }Yönteminin gövdesini
DisplayResultsdoldurun:foreach (ImagePrediction prediction in imagePredictionData) { Console.WriteLine($"Image: {Path.GetFileName(prediction.ImagePath)} predicted as: {prediction.PredictedLabelValue} with score: {prediction.Score?.Max()} "); }
Tahminde bulunmak için yöntem oluşturma
ClassifySingleImage()Aşağıdaki kodu kullanarak yöntemindenDisplayResults()hemen önce yöntemini oluşturun:void ClassifySingleImage(MLContext mlContext, ITransformer model) { }Tek
ImageDatabir için tam yolu ve görüntü dosyası adını içeren birImagePathnesne oluşturun. Aşağıdaki kodu yöntemindeClassifySingleImage()sonraki satırlar olarak ekleyin:var imageData = new ImageData() { ImagePath = _predictSingleImage };Yönteminde sonraki satır olarak aşağıdaki kodu ekleyerek tek bir tahminde bulunın
ClassifySingleImage:// Make prediction function (input = ImageData, output = ImagePrediction) var predictor = mlContext.Model.CreatePredictionEngine<ImageData, ImagePrediction>(model); var prediction = predictor.Predict(imageData);Tahmini almak için Predict() yöntemini kullanın. PredictionEngine, tek bir veri örneği üzerinde tahmin gerçekleştirmenizi sağlayan kullanışlı bir API'dir.
PredictionEngineiş parçacığı güvenli değildir. Tek iş parçacıklı veya prototip ortamlarda kullanılması kabul edilebilir. Üretim ortamlarında iyileştirilmiş performans ve iş parçacığı güvenliği içinPredictionEnginePoolhizmetini kullanın. Bu hizmet, uygulamanız genelinde kullanılmak üzere birPredictionEnginenesneObjectPoololuşturur. ASP.NET Core Web API'sinde kullanmaPredictionEnginePoolhakkında bu kılavuza bakın.Uyarı
PredictionEnginePoolhizmet uzantısı şu anda önizleme aşamasındadır.Tahmin sonucunu yönteminde
ClassifySingleImage()bir sonraki kod satırı olarak görüntüleyin:Console.WriteLine($"Image: {Path.GetFileName(imageData.ImagePath)} predicted as: {prediction.PredictedLabelValue} with score: {prediction.Score?.Max()} ");
ML.NET modeli işlem hattını oluşturma
ML.NET model işlem hattı bir tahmin zinciridir. İşlem hattı oluşturma sırasında yürütme gerçekleşmez. Tahmin aracı nesneleri oluşturulur ancak yürütülür.
Modeli oluşturmak için bir yöntem ekleme
Bu yöntem öğreticinin kalbidir. Model için bir işlem hattı oluşturur ve ML.NET modeli üretmek için işlem hattını eğiter. Ayrıca modeli daha önce görünmeyen bazı test verilerine göre değerlendirir.
GenerateModel()Aşağıdaki kodu kullanarak, yapıdanInceptionSettingshemen sonra ve yönteminDisplayResults()hemen öncesinde yöntemini oluşturun:ITransformer GenerateModel(MLContext mlContext) { }Görüntü verilerinden pikselleri yüklemek, yeniden boyutlandırmak ve ayıklamak için tahmin edicileri ekleyin:
IEstimator<ITransformer> pipeline = mlContext.Transforms.LoadImages(outputColumnName: "input", imageFolder: _imagesFolder, inputColumnName: nameof(ImageData.ImagePath)) // The image transforms transform the images into the model's expected format. .Append(mlContext.Transforms.ResizeImages(outputColumnName: "input", imageWidth: InceptionSettings.ImageWidth, imageHeight: InceptionSettings.ImageHeight, inputColumnName: "input")) .Append(mlContext.Transforms.ExtractPixels(outputColumnName: "input", interleavePixelColors: InceptionSettings.ChannelsLast, offsetImage: InceptionSettings.Mean))Görüntü verilerinin TensorFlow modelinin beklediği biçimde işlenmesi gerekir. Bu durumda görüntüler belleğe yüklenir, tutarlı bir boyuta yeniden boyutlandırılır ve pikseller sayısal bir vektöre ayıklanır.
TensorFlow modelini yüklemek için tahmin aracını ekleyin ve puanlayın:
.Append(mlContext.Model.LoadTensorFlowModel(_inceptionTensorFlowModel). ScoreTensorFlowModel(outputColumnNames: new[] { "softmax2_pre_activation" }, inputColumnNames: new[] { "input" }, addBatchDimensionInput: true))İşlem hattındaki bu aşama TensorFlow modelini belleğe yükler, ardından TensorFlow model ağı aracılığıyla piksel değerlerinin vektörlerini işler. Derin öğrenme modeline giriş uygulama ve modeli kullanarak çıkış oluşturma, Puanlama olarak adlandırılır. Modeli tamamen kullanırken puanlama bir çıkarım veya tahminde bulunur.
Bu durumda, çıkarım yapan katman olan son katman dışındaki tüm TensorFlow modelini kullanırsınız. Son katmanın çıkışı etiketlenmiştir
softmax_2_preactivation. Bu katmanın çıkışı, özgün giriş görüntülerini karakterize eden bir özellik vektördür.TensorFlow modeli tarafından oluşturulan bu özellik vektöru, ML.NET eğitim algoritmasına giriş olarak kullanılacaktır.
Eğitim verilerindeki dize etiketlerini tamsayı anahtar değerlerine eşlemek için tahmin aracını ekleyin:
.Append(mlContext.Transforms.Conversion.MapValueToKey(outputColumnName: "LabelKey", inputColumnName: "Label"))Sonraki eklenen ML.NET eğitmeni, etiketlerinin rastgele dizeler yerine
keybiçiminde olmasını gerektirir. Anahtar, dize değeriyle bire bir eşlemesi olan bir sayıdır.ML.NET eğitim algoritmasını ekleyin:
.Append(mlContext.MulticlassClassification.Trainers.LbfgsMaximumEntropy(labelColumnName: "LabelKey", featureColumnName: "softmax2_pre_activation"))Tahmin edilen anahtar değerini bir dizeye geri eşlemek için tahmin aracını ekleyin:
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabelValue", "PredictedLabel")) .AppendCacheCheckpoint(mlContext);
Modeli eğitin
LoadFromTextFile sarmalayıcısını kullanarak eğitim verilerini yükleyin. Metodun
GenerateModel()satırına aşağıdaki kodu ekleyin:IDataView trainingData = mlContext.Data.LoadFromTextFile<ImageData>(path: _trainTagsTsv, hasHeader: false);ML.NET'deki veriler IDataView arabirimi olarak temsil edilir.
IDataViewtablosal verileri (sayısal ve metin) açıklamanın esnek ve verimli bir yoludur. Veriler bir metin dosyasından veya gerçek zamanlı olarak (örneğin, SQL veritabanı veya günlük dosyaları) birIDataViewnesneye yüklenebilir.Modeli yukarıda yüklenen verilerle eğitin:
ITransformer model = pipeline.Fit(trainingData);yöntemi,
Fit()eğitim veri kümesini işlem hattına uygulayarak modelinizi eğiter.
Modelin doğruluğunu değerlendirme
Aşağıdaki kodu yöntemin sonraki satırına ekleyerek test verilerini yükleyin ve dönüştürün
GenerateModel:IDataView testData = mlContext.Data.LoadFromTextFile<ImageData>(path: _testTagsTsv, hasHeader: false); IDataView predictions = model.Transform(testData); // Create an IEnumerable for the predictions for displaying results IEnumerable<ImagePrediction> imagePredictionData = mlContext.Data.CreateEnumerable<ImagePrediction>(predictions, true); DisplayResults(imagePredictionData);Modeli değerlendirmek için kullanabileceğiniz birkaç örnek görüntü vardır. Eğitim verileri gibi bunların da model tarafından dönüştürülebilmesi için içine
IDataViewyüklenmesi gerekir.Modeli değerlendirmek için
GenerateModel()yöntemine aşağıdaki kodu ekleyin:MulticlassClassificationMetrics metrics = mlContext.MulticlassClassification.Evaluate(predictions, labelColumnName: "LabelKey", predictedLabelColumnName: "PredictedLabel");Tahmin kümesini aldıktan sonra Evaluate() yöntemi:
- Modeli değerlendirir (tahmin edilen değerleri test veri kümesiyle
labelskarşılaştırır). - Model performans ölçümlerini döndürür.
- Modeli değerlendirir (tahmin edilen değerleri test veri kümesiyle
Model doğruluğu ölçümlerini görüntüleme
Ölçümleri görüntülemek, sonuçları paylaşmak ve bunlar üzerinde işlem yapmak için aşağıdaki kodu kullanın:
Console.WriteLine($"LogLoss is: {metrics.LogLoss}"); Console.WriteLine($"PerClassLogLoss is: {String.Join(" , ", metrics.PerClassLogLoss.Select(c => c.ToString()))}");Aşağıdaki ölçümler görüntü sınıflandırması için değerlendirilir:
-
Log-loss- bkz . Günlük Kaybı. Günlük kaybının mümkün olduğunca sıfıra yakın olmasını istiyorsunuz. -
Per class Log-loss. Sınıf başına Günlük kaybının mümkün olduğunca sıfıra yakın olmasını istiyorsunuz.
-
Eğitilen modeli sonraki satır olarak döndürmek için aşağıdaki kodu ekleyin:
return model;
Uygulamayı çalıştırma
sınıfı oluşturulduktan sonra çağrısı
GenerateModelekleyin MLContext :ITransformer model = GenerateModel(mlContext);yönteminin çağrısından
ClassifySingleImage()sonra yöntemine çağrı ekleyinGenerateModel():ClassifySingleImage(mlContext, model);Konsol uygulamanızı çalıştırın (Ctrl + F5). Sonuçlarınız aşağıdaki çıkışa benzer olmalıdır. (Uyarılar görebilir veya iletileri işleyebilirsiniz, ancak bu iletiler netlik için aşağıdaki sonuçlardan kaldırılmıştır.)
=============== Training classification model =============== Image: broccoli2.jpg predicted as: food with score: 0.8955513 Image: pizza3.jpg predicted as: food with score: 0.9667718 Image: teddy6.jpg predicted as: toy with score: 0.9797683 =============== Classification metrics =============== LogLoss is: 0.0653774699265059 PerClassLogLoss is: 0.110315812569315 , 0.0204391272836966 , 0 =============== Making single image classification =============== Image: toaster3.jpg predicted as: appliance with score: 0.9646884
Tebrikler! Görüntü işleme için önceden eğitilmiş bir TensorFlow kullanarak görüntüleri kategorilere ayırmak için ML.NET'de başarıyla bir sınıflandırma modeli oluşturdunuz.
Bu öğreticinin kaynak kodunu dotnet/samples deposunda bulabilirsiniz.
Bu öğreticide şunların nasıl yapılacağını öğrendiniz:
- Sorunu anlama
- Önceden eğitilmiş TensorFlow modelini ML.NET işlem hattına ekleme
- ML.NET modelini eğitin ve değerlendirin
- Test görüntüsünü sınıflandırma
Genişletilmiş görüntü sınıflandırma örneğini keşfetmek için Machine Learning örnekleri GitHub deposuna göz atın.