Gereksinimler ve Ön Hazırlık
Projeye başlamadan önce geliştirme ortamınızın güncel olduğundan emin olmalısınız. 2026 standartlarına uygun olarak .NET 9 veya üzeri bir sürüm kullanmanız önerilir. Gerekli araçları aşağıda bulabilirsiniz:
- Visual Studio 2022 (Güncel sürüm) veya VS Code.
- .NET SDK 9.0 veya üzeri.
- Microsoft.ML ve Microsoft.ML.Vision NuGet paketleri.
- Eğitim için etiketlenmiş bir görüntü veri seti (Örneğin: Kedi ve Köpek fotoğrafları).
Projenizi oluşturduktan sonra terminal veya NuGet Paket Yöneticisi üzerinden şu komut ile gerekli kütüphaneleri projenize dahil etmelisiniz:
dotnet add package Microsoft.ML
dotnet add package Microsoft.ML.Vision
dotnet add package Microsoft.ML.ImageAnalytics
Bu paketler, görüntü işleme süreçlerini yönetmek ve derin öğrenme modellerini C# üzerinde çalıştırmak için gerekli olan temel altyapıyı sağlar.
Veri Setini Hazırlama ve MLContext Başlatma
Yapay zeka modellerinin başarısı, beslendikleri verinin kalitesine bağlıdır. Görüntü sınıflandırma projesinde, görsellerinizin klasör yapısı önemlidir. Her kategori için ayrı bir klasör oluşturun ve görselleri bu klasörlere yerleştirin. MLContext, ML.NET dünyasının giriş kapısıdır; tüm işlemlerimizi bu nesne üzerinden yöneteceğiz.
using Microsoft.ML;
// MLContext, tüm ML.NET operasyonları için giriş noktasıdır.
var mlContext = new MLContext(seed: 1);
MLContext, modelin rastgelelik süreçlerini kontrol eden "seed" değerini alır. Bu, modelinizi her çalıştırdığınızda aynı sonuçları almanızı (tekrarlanabilirlik) sağlar.
Veri Yükleme ve İşleme Hattı Oluşturma
Görüntüleri belleğe yüklemek ve modelin anlayacağı formata getirmek için bir veri hattı (pipeline) oluşturmamız gerekir. Bu adımda, görsellerin boyutlarını standartlaştıracak ve etiketlerini tanımlayacağız.
public class ImageData
{
public string ImagePath { get; set; }
public string Label { get; set; }
}
// Veriyi yükleme ve işleme adımları
var data = mlContext.Data.LoadFromEnumerable(images);
var pipeline = mlContext.Transforms.Conversion.MapValueToKey("Label")
.Append(mlContext.Transforms.LoadImages("Image", "ImagePath"))
.Append(mlContext.Transforms.ResizeImages("Image", 224, 224))
.Append(mlContext.Transforms.ExtractPixels("Image"));
Yukarıdaki kodda, görselleri 224x224 piksel boyutuna getiriyoruz. Bu boyut, çoğu önceden eğitilmiş yapay zeka modeli (Transfer Learning) için standarttır.
Transfer Learning ile Modeli Eğitme
Sıfırdan bir yapay zeka modeli eğitmek çok uzun sürer ve devasa veri seti gerektirir. Bunun yerine, "Transfer Learning" (Öğrenme Aktarımı) yöntemini kullanarak, önceden eğitilmiş bir modelin (ResNet gibi) ağırlıklarını kendi verilerimizle güncelleyeceğiz.
var trainingPipeline = pipeline
.Append(mlContext.MulticlassClassification.Trainers.ImageClassification(
featureColumnName: "Image",
labelColumnName: "Label"))
.Append(mlContext.Transforms.Conversion.MapKeyToValue("PredictedLabel"));
// Modeli eğitme süreci
var trainedModel = trainingPipeline.Fit(data);
Bu adım, işlemcinizin veya ekran kartınızın (GPU) gücüne bağlı olarak zaman alabilir. GPU desteği için Microsoft.ML.Vision paketinin CUDA ile yapılandırıldığından emin olun.
Tahmin Motoru (Prediction Engine) Oluşturma
Model eğitildikten sonra, yeni bir görsel geldiğinde onun ne olduğunu anlamak için bir tahmin motoru kullanırız. Bu motor, modelinizi canlı bir servise dönüştürür.
var predictionEngine = mlContext.Model.CreatePredictionEngine(trainedModel);
var result = predictionEngine.Predict(new ImageData { ImagePath = "test_resmi.jpg" });
Console.WriteLine($"Tahmin edilen kategori: {result.PredictedLabel}");
Burada Prediction sınıfı, modelin çıktılarını tutan basit bir veri modelidir. PredictedLabel özelliği, yapay zekanın görselin ne olduğunu düşündüğünü döndürür.
Görüntü Sınıflandırma Yöntemlerinin Karşılaştırılması
| Yöntem | Avantajı | Dezavantajı |
|---|---|---|
| Transfer Learning | Hızlı eğitim, az veri ihtiyacı | Model boyutu büyük olabilir |
| Sıfırdan Eğitim | Tam özelleştirme | Çok uzun eğitim süresi |
| Azure Custom Vision | Bulut tabanlı, yüksek performans | Maliyetli olabilir |
Güvenlik Uyarısı: Kullanıcıdan gelen görselleri işlerken mutlaka dosya uzantısı kontrolü ve dosya boyutu sınırlaması uygulayın. Zararlı kod içeren dosyaların sisteme yüklenmesini engellemek için görselleri sunucuda yeniden işleyerek (re-encoding) kaydedin.
Sıkça Sorulan Sorular
Yapay zeka modeli eğitirken GPU kullanmak zorunlu mu?
Zorunlu değildir ancak önerilir. GPU kullanımı, eğitim süresini saatlerden dakikalara indirebilir. NVIDIA CUDA destekli bir ekran kartınız varsa, ML.NET otomatik olarak bunu algılayabilir.
Modelin doğruluğunu nasıl artırabilirim?
Daha fazla kaliteli veri ekleyerek, eğitimdeki iterasyon (epoch) sayısını artırarak veya farklı mimariler (ResNet, Inception) deneyerek başarı oranını yükseltebilirsiniz.
Bu model mobil uygulamalarda çalışır mı?
Evet, eğitilen modeli .zip dosyası olarak kaydedebilir ve .NET MAUI veya Xamarin projelerinize dahil ederek mobil cihazlarda çevrimdışı çalıştırabilirsiniz.
Veri setim dengesiz ise ne yapmalıyım?
Veri setinizdeki her kategorinin görsel sayısının birbirine yakın olması gerekir. Dengeli olmayan veri setleri, modelin bir sınıfı diğerinden daha fazla tercih etmesine (bias) neden olur.
Modeli nasıl güncelleyebilirim?
Yeni veriler topladığınızda, mevcut modelinizi baz alarak "Incremental Training" (Artımlı Eğitim) yapabilir veya modeli tamamen yeniden eğitebilirsiniz.
Sorumluluk Reddi: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Üretim ortamında (production) kullanmadan önce modelin hata payını (accuracy) test etmeli ve güvenlik açıklarına karşı gerekli önlemleri almalısınız. Yazılımın neden olduğu veri kaybı veya hatalardan geliştirici sorumludur.
Modeli ASP.NET Core Web API ile Servis Etme
Eğittiğiniz modeli yerel bir konsol uygulamasından çıkarıp, gerçek zamanlı istekleri karşılayabilecek bir web servisine dönüştürmek, projenizin ölçeklenebilirliği için kritiktir. PredictionEnginePool kullanarak, modelin her istekte yeniden yüklenmesini engelleyebilir ve bellek yönetimini optimize edebilirsiniz.
Öncelikle Microsoft.Extensions.ML paketini projenize ekleyin. Ardından Program.cs dosyanızda modelinizi bağımlılık enjeksiyonu (Dependency Injection) sistemine kaydedin:
// Program.cs içerisine ekleyin
builder.Services.AddPredictionEnginePool()
.FromFile("model.zip");
Şimdi, kullanıcıdan gelen görüntüleri işleyecek olan Controller sınıfınızı oluşturun. Burada dikkat etmeniz gereken en önemli nokta, gelen dosya akışını (stream) modelin anlayabileceği formata dönüştürmektir:
[HttpPost("predict")]
public IActionResult Predict([FromForm] IFormFile file)
{
using var memoryStream = new MemoryStream();
file.CopyTo(memoryStream);
var input = new ImageInput { Image = memoryStream.ToArray() };
var prediction = _predictionEnginePool.Predict(input);
return Ok(new { Label = prediction.PredictedLabel, Score = prediction.Score });
}
Performans Optimizasyonu ve Hata Ayıklama
Görüntü sınıflandırma modelleri, özellikle yüksek çözünürlüklü görsellerle çalışırken ciddi işlemci gücü tüketebilir. Uygulamanızın performansını artırmak ve olası hataları minimize etmek için şu stratejileri izleyebilirsiniz:
- Görüntü Boyutlandırma: Modeli eğitirken kullandığınız giriş boyutuna (örneğin 224x224) uygun olmayan görselleri, tahmin aşamasından önce mutlaka yeniden boyutlandırın. Büyük görselleri doğrudan modele göndermek, tahmin süresini ve bellek kullanımını gereksiz yere artırır.
- Batch Processing: Eğer aynı anda çok sayıda görseli sınıflandırmanız gerekiyorsa, tek tek tahmin yapmak yerine görselleri gruplandırarak (batch) işlemek GPU/CPU kullanımını daha verimli hale getirir.
- Hata Ayıklama (Debugging): Modelinizin neden yanlış tahmin yaptığını anlamak için
Scoredeğerlerini mutlaka loglayın. Eğer modeliniz belirli sınıflar arasında sürekli kararsız kalıyorsa (düşük confidence skoru), o sınıflara ait eğitim verilerinizin kalitesini veya çeşitliliğini gözden geçirin.
Aşağıdaki tablo, modelinizin tahmin performansını izlemek için kullanabileceğiniz metrikleri özetlemektedir:
| Metrik | Açıklama | İdeal Durum |
|---|---|---|
| Inference Latency | Bir görüntünün işlenme süresi | < 100ms |
| Confidence Score | Modelin tahminine olan güveni | > 0.85 |
| Memory Usage | Tahmin anındaki RAM tüketimi | Stabil kalmalı |
Unutmayın ki, bir yapay zeka modelinin başarısı sadece eğitim aşamasında değil, üretim ortamındaki izleme (monitoring) süreçlerinde de gizlidir. Modelinizi düzenli olarak yeni verilerle besleyerek "model kayması" (model drift) durumunun önüne geçebilirsiniz.
Sonuç
C# ile yapay zeka tabanlı görüntü sınıflandırma uygulaması geliştirmek, doğru araçlar ve yöntemlerle oldukça verimli bir süreçtir. ML.NET, kurumsal seviyede projeler için ihtiyaç duyduğunuz tüm esnekliği sağlar. Bu rehberde öğrendiğiniz temel adımları uygulayarak, kendi özel görüntü tanıma sistemlerinizi kurmaya başlayabilirsiniz.
Bir sonraki adım olarak, eğitmiş olduğunuz modeli bir ASP.NET Core Web API projesine entegre ederek, kullanıcıların görsel yükleyebileceği bir web servisi oluşturmayı deneyebilirsiniz. Yapay zeka dünyasında gelişmeye devam edin!

Yorumlar (0)
Yorum Yaz