Azure AI Vision ile .NET'te Görüntü Analizi ve OCR

Azure AI Vision (eski adıyla Cognitive Services Computer Vision), görüntülerden anlam çıkarmanıza olanak tanıyan güçlü bir bulut hizmetidir. .NET uygulamalarınızda nesne tespiti, sahne tanıma, yüz analizi ve optik karakter tanıma (OCR) gibi işlemleri kolayca entegre edebilirsiniz.

Paket Kurulumu

dotnet add package Azure.AI.Vision.ImageAnalysis
dotnet add package Azure.Identity

Temel Görüntü Analizi

Görüntü analizi servisi, bir görüntüdeki nesneleri, renkleri, etiketleri ve açıklamaları otomatik olarak üretir:

using Azure;
using Azure.AI.Vision.ImageAnalysis;

public class VisionAnalysisService
{
    private readonly ImageAnalysisClient _client;

    public VisionAnalysisService(IConfiguration config)
    {
        var endpoint = new Uri(config["AzureVision:Endpoint"]!);
        var key = new AzureKeyCredential(config["AzureVision:Key"]!);
        _client = new ImageAnalysisClient(endpoint, key);
    }

    public async Task<ImageAnalysisResult> AnalyzeImageAsync(string imageUrl)
    {
        var result = await _client.AnalyzeAsync(
            new Uri(imageUrl),
            VisualFeatures.Caption |
            VisualFeatures.Objects |
            VisualFeatures.Tags |
            VisualFeatures.DenseCaptions,
            new ImageAnalysisOptions
            {
                GenderNeutralCaption = true,
                Language = "tr"
            });

        return result.Value;
    }
}

Sonuçları İşlemek

var result = await visionService.AnalyzeImageAsync(imageUrl);

Console.WriteLine($"Başlık: {result.Caption?.Text} (Güven: {result.Caption?.Confidence:P1})");

Console.WriteLine("Tespit edilen nesneler:");
foreach (var obj in result.Objects ?? Enumerable.Empty<DetectedObject>())
{
    Console.WriteLine($"  - {obj.Tags.First().Name} at {obj.BoundingBox}");
}

Console.WriteLine("Etiketler:");
foreach (var tag in result.Tags?.Values ?? Enumerable.Empty<DetectedTag>())
{
    if (tag.Confidence > 0.7)
        Console.WriteLine($"  - {tag.Name} ({tag.Confidence:P1})");
}

OCR ile Metin Çıkarma

Document Intelligence yerine hızlı OCR için Vision servisi yeterli olabilir:

public async Task<string> ExtractTextFromImageAsync(Stream imageStream)
{
    var result = await _client.AnalyzeAsync(
        BinaryData.FromStream(imageStream),
        VisualFeatures.Read);

    var sb = new StringBuilder();
    foreach (var block in result.Value.Read?.Blocks ?? [])
    {
        foreach (var line in block.Lines)
        {
            sb.AppendLine(line.Text);
        }
    }

    return sb.ToString().Trim();
}

Görüntü Akışından Analiz

URL yerine doğrudan byte array veya stream göndermek de mümkündür:

// Yüklenen bir dosyayı analiz etmek için
public async Task<IActionResult> AnalyzeUpload(IFormFile file)
{
    await using var stream = file.OpenReadStream();
    var data = BinaryData.FromStream(stream);

    var result = await _client.AnalyzeAsync(
        data,
        VisualFeatures.Caption | VisualFeatures.Tags | VisualFeatures.Read,
        new ImageAnalysisOptions { Language = "tr" });

    return Ok(new
    {
        Caption = result.Value.Caption?.Text,
        Tags = result.Value.Tags?.Values.Select(t => t.Name).ToList(),
        Text = string.Join("\n", result.Value.Read?.Blocks
            .SelectMany(b => b.Lines)
            .Select(l => l.Text) ?? [])
    });
}

Akıllı Thumbnail Oluşturma

Vision servisi, görüntünün en önemli bölgesini akıllıca kırpabilir:

public async Task<byte[]> GetSmartThumbnailAsync(string imageUrl, int width, int height)
{
    // Not: Bu özellik eski Cognitive Services endpoint ile çalışır
    // Yeni SDK'da SmartCropping VisualFeature olarak gelir
    var result = await _client.AnalyzeAsync(
        new Uri(imageUrl),
        VisualFeatures.SmartCrops,
        new ImageAnalysisOptions
        {
            SmartCropsAspectRatios = [(double)width / height]
        });

    var crop = result.Value.SmartCrops?.Values.FirstOrDefault();
    // BoundingBox kullanarak crop bölgesini belirleyin
    return await DownloadAndCropAsync(imageUrl, crop?.BoundingBox);
}

Ürün Görsellerini Otomatik Etiketleme

E-ticaret uygulamalarında ürün görselleri için otomatik etiket üretimi:

public class ProductImageTagger
{
    private readonly ImageAnalysisClient _vision;
    private readonly IProductRepository _repo;

    public async Task TagProductImagesAsync(CancellationToken ct = default)
    {
        var untaggedProducts = await _repo.GetUntaggedAsync(ct);

        await Parallel.ForEachAsync(untaggedProducts,
            new ParallelOptions { MaxDegreeOfParallelism = 5, CancellationToken = ct },
            async (product, token) =>
            {
                try
                {
                    var result = await _vision.AnalyzeAsync(
                        new Uri(product.ImageUrl),
                        VisualFeatures.Tags | VisualFeatures.Caption,
                        cancellationToken: token);

                    var tags = result.Value.Tags?.Values
                        .Where(t => t.Confidence > 0.8)
                        .Select(t => t.Name)
                        .ToList() ?? [];

                    await _repo.UpdateTagsAsync(product.Id, tags, result.Value.Caption?.Text, token);
                }
                catch (RequestFailedException ex) when (ex.Status == 429)
                {
                    // Rate limit: bir süre bekle
                    await Task.Delay(TimeSpan.FromSeconds(10), token);
                }
            });
    }
}

appsettings.json Yapılandırması

{
  "AzureVision": {
    "Endpoint": "https://<your-resource>.cognitiveservices.azure.com/",
    "Key": "<your-key>"
  }
}

DI Kaydı

builder.Services.AddSingleton(sp =>
{
    var config = sp.GetRequiredService<IConfiguration>();
    return new ImageAnalysisClient(
        new Uri(config["AzureVision:Endpoint"]!),
        new AzureKeyCredential(config["AzureVision:Key"]!));
});
builder.Services.AddScoped<VisionAnalysisService>();

Sonuç

Azure AI Vision, .NET uygulamalarınıza birkaç satır kodla görsel zeka ekler. OCR, nesne tespiti ve akıllı etiketleme gibi özellikler; içerik yönetimi, erişilebilirlik iyileştirme ve ürün katalog otomasyonu gibi pek çok senaryoda değer yaratır. Production'da Managed Identity ile key yerine kimlik tabanlı erişim kullanmayı ve görüntü başına yaklaşık 1-2 ms gecikmeyi göz önünde bulundurmayı unutmayın.