Derinlemesine yazılım eğitimleri için kanalımı takip edebilirsiniz...

Semantic Kernel İle HuggingFace Üzerinden Image Captioning ve Translate Uygulaması

Merhaba,

Bu içeriğimizde, .NET ekosisteminde Semantic Kernel ile HuggingFace’de ki ‘Salesforce/blip-image-captioning-base’ modelini kullanarak, verdiğimiz görsel içeriğine göre bir açıklama üretimi yani Image Captioning çalışması gerçekleştireceğiz.

Image Captioning Nedir?

Image Captioning, bir görseli analiz edip içeriğini metinsel olarak açıklama sürecidir. Yani bir yapay zeka modelinin herhangi bir görüntüyü okuyarak ona uygun bir açıklama (caption) üretmesi anlamına gelmektedir.

HuggingFace üzerinde BLIP veya LLaVA gibi modelleri kullanarak kolayca Image Captioning yapılabilmektedir. İşte bu modellerden bazıları;

Bizler bu içeriğimizde yazımızın ilk satırlarında bahsettiğimiz üzere ‘Salesforce/blip-image-captioning-base’ modelini kullanıyor olacağız. O halde hadi başlayalım…

Semantic Kernel İle Image Captioning Uygulaması

Semantic Kernel’da Image Captioning’i örneklendirebilmek için öncelikle bir .NET uygulaması oluşturmamız gerekmektedir. Bizler içerik sürecinde çalışmayı bir Asp.NET Core uygulaması üzerinden yürütüyor olacağız. Tabi sizler arzu ederseniz, içeriği Console Application ya da farklı bir altyapı eşliğinde takipte bulunabilirsiniz.

Çalışma sürecinde aşağıdaki paketlerden istifade edilecektir;

Paketler yüklendikten sonra Semantic Kernel üzerinden HuggingFace entegrasyonunu aşağıdaki gibi gerçekleştirebiliriz;

using Microsoft.SemanticKernel;

var builder = WebApplication.CreateBuilder(args);

builder.Services
    .AddKernel()
    .AddHuggingFaceImageToText(
        model: "Salesforce/blip-image-captioning-base",
        apiKey: "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"
    );

var app = builder.Build();
.
.
.

Tabi bu yapılandırma sürecinde aşağıdaki görselde olduğu gibi bir uyarıyla karşılaşma ihtimalinizin olduğunu söylemekte fayda görmekteyim;Semantic Kernel İle HuggingFace'de Image Captioning ÇalışmasıHatanın metinsel hali;

‘Microsoft.SemanticKernel.HuggingFaceKernelBuilderExtensions
.AddHuggingFaceImageToText(Microsoft.SemanticKernel.IKernelBuilder, string, System.Uri?, string?, string?, System.Net.Http.HttpClient?)’ is for evaluation purposes only and is subject to change or removal in future updates. Suppress this diagnostic to proceed.

Yani burada diyor ki, AddHuggingFaceImageToText metodu şimdilik değerlendirme aşamasındadır ve gelecekteki güncellemelerde bu kullanım değişikliğe uğrayabilir yahut komple kaldırılabilir. Bunu bil de ona göre kullan demektedir 🙂 Ee haliyle bizim bu projeyi derleyebilmemiz için şimdilik bu uyarıyı görmezden gelmemiz gerekmektedir. Bunun için derleyici uyarılarını geçici olarak kapatmamızı sağlayan aşağıdaki #pragma warning yönergelerinden istifade etmemiz yeterlidir;

using Microsoft.SemanticKernel;

var builder = WebApplication.CreateBuilder(args);

#pragma warning disable SKEXP0070
builder.Services
    .AddKernel()
    .AddHuggingFaceImageToText(
        model: "Salesforce/blip-image-captioning-base",
        apiKey: "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"
    );
#pragma warning restore SKEXP0070

var app = builder.Build();
.
.
.

Burada; #pragma warning disable SKEXP0070 talimatı ile SKEXP0070 kodlu derleyici uyarısını kapatırken, #pragma warning restore SKEXP0070 talimatı ile de aynı kodlu derleyici uyarısını o satırdan itibaren tekrardan açıyoruz.

Şimdi de bu yapılandırmanın içeriğine odaklanırsak eğer model ve apiKey değerlerinin verildiğini görüyorsunuz. Bu değerler için HuggingFace’e gitmemiz gerektiği aşikar. model değeri için kullanılacak modelin profilinden aşağıdaki görseldeki alanı kopyalamamız gerekmektedir.Semantic Kernel İle HuggingFace'de Image Captioning ÇalışmasıapiKey için ise aşağıdaki ekran alıntısında olduğu gibi Access Tokens yapılandırmalarına gidip ‘Create new token’ diyerek yeni bir access token oluşturulması yeterlidir.Semantic Kernel İle HuggingFace'de Image Captioning ÇalışmasıEvet, böylece artık Semantic Kernel aracılığıyla .NET uygulaması ile HuggingFace’de ki ilgili modelin entegrasyonunu başarıyla yapmış bulunuyoruz.

Şimdi sırada bu modelin işlevselliğini kullanma var! Bunun için aşağıdaki gibi bir endpoint oluşturalım ve client’tan gelen görsellerin açıklamalarını ilgili modelle üretip geriye döndürelim.

#pragma warning disable SKEXP0001
app.MapPost("/image-captioning", async (IImageToTextService imageToTextService, IFormFile file) =>
{
    using var memoryStream = new MemoryStream();
    await file.CopyToAsync(memoryStream);
    var imageContent = new ImageContent(memoryStream.ToArray(), "image/jpeg");
    var textContent = await imageToTextService.GetTextContentAsync(imageContent);
    return textContent.Text;
}).DisableAntiforgery();
#pragma warning restore SKEXP0001

Kliside Dua

Kliside Fatiha 🙂

Evet, burada da #pragma warning talimatları eşliğinde çalışmamız gerektiğini görüyorsunuz. Malum… Hala deneme sürümündeyiz. Velhasıl işlevselliğe odaklanırsak eğer, client’tan gelen görselin açıklamasını IImageToTextService türünden nesneyle oldukça basit bir şekilde gerçekleştiriyoruz. Detaylar kodda ap açık belli diye düşünüyorum…

Şimdi yapılan bu çalışmayı yandaki benim şahsi görselimle test edelim istiyorum. Bunun için Postman’de aşağıdaki isteği hazırlayıp, gönderelim.Semantic Kernel İle HuggingFace'de Image Captioning ÇalışmasıGörüldüğü üzere Image Captioning neticesinde üretilen açıklamaya göz atarsak eğer
a man standing in a stone building yorumunda bulunulduğunu göreceğiz. Halbuki bu görselde taş binada duran bir adamdan daha çok kilise de dua eden bir Gençay var diyerek bu modele dalası geliyor insanın içinden 🙂

Nasıl? Güzel değil mi? 👏👏👏

Tabi burada görsel hakkında üretilen açıklamanın İngilizce olduğu aşikar. Bizler bu açıklamanın Türkçe olarak yapılmasını istiyor olabiliriz. Bunun için ilgili modelin bir yapılandırması olabilir, bilmiyorum. Ben içeriği zenginleştirmek adına OpenRouter üzerinden bir modele daha bağlanıp, bu yorumu Türkçe’ye translate ettirmek istiyorum. Şimdi gelin bu çalışmayı da gerçekleştirelim.

Üretilen Açıklamayı Türkçe’ye Translate Etme

Bunun için OpenRouter platformu üzerinden Qwen: QwQ 32B (free) modelini kullanacağız.

Neden bu model? diye sorabilirsiniz. Herhangi bir nedeni yok 🙂 Açıklamasında belirtildiği üzere bir akıl yürütme modeli olması bu çalışma için seçilmesine yetti.

Peki, bu modele OpenRouter yerine HuggingFace’den erişim gösteremezmiydik? diye sorarsanız da, evet gösterebilirdik! Yani bu model bir yandan da HuggingFace’de ahanda şu adreste yayınlanmaktadır. Yine bu içerikte belirtiğim aynı metotlar aracılığıyla ilgili modeli yapılandırıp kullanabilirdik!

Neden OpenRouter? sorusunun cevabı ise bir kaç satır öncede belirttiğim üzere sadece zenginlik olması gayesindendir…

Velhasıl, şimdi uygulamamıza aşağıdaki yapılandırma üzerinden Semantic Kernel ile OpenRouter entegrasyonunu da gerçekleştirelim.

using Microsoft.SemanticKernel;
using Microsoft.SemanticKernel.ImageToText;
using OpenAI;
using System.ClientModel;

var builder = WebApplication.CreateBuilder(args);

#pragma warning disable SKEXP0070
builder.Services
    .AddKernel()
    .AddHuggingFaceImageToText(
        model: "Salesforce/blip-image-captioning-base",
        apiKey: "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"
    )
#pragma warning restore SKEXP0070
    .AddOpenAIChatCompletion(
        modelId: "qwen/qwq-32b:free",
        openAIClient: new OpenAIClient(
            credential: new ApiKeyCredential("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"),
            options: new OpenAIClientOptions
            {
                Endpoint = new Uri("https://openrouter.ai/api/v1")
            })
        );

var app = builder.Build();
.
.
.

Görüldüğü üzere, Semantic Kernel ile bir .NET uygulamasına birden fazla model yapılandırmasını bu şekilde gerçekleştirebilmekteyiz. Ayrıca dikkat ederseniz AddOpenAIChatCompletion yapılandırmasını gerek olmadığı için #pragma warning yönergesinin dışında uygulayarak normal bir şekilde yapılandırmada bulunuyorum. Çünkü sonraki sürümlerde değişiklik ihtimali sadece AddHuggingFaceImageToText metodunun bulunduğu kütüphane için geçerlidir.

Artık Qwen: QwQ 32B (free) modelini de uygulamaya dahil ettiğimize göre translate işlemine geçebiliriz. Bunun için yukarıda oluşturduğumuz endpoint’tin işlevselliğinde aşağıdaki gibi ufak bir katkıda bulunmamız yeterli olacaktır;

#pragma warning disable SKEXP0001
app.MapPost("/image-captioning", async (IImageToTextService imageToTextService, Kernel kernel, IFormFile file) =>
{
    using var memoryStream = new MemoryStream();
    await file.CopyToAsync(memoryStream);
    var imageContent = new ImageContent(memoryStream.ToArray(), "image/jpeg");
    var textContent = await imageToTextService.GetTextContentAsync(imageContent);

    string promptTemplate = "Bu metni Türkçe'ye çevir : {{$input}}";
    var function = kernel.CreateFunctionFromPrompt(promptTemplate);
    var arguments = new KernelArguments { ["input"] = textContent.Text };
    var result = await function.InvokeAsync(kernel, arguments);

    return result.GetValue<string>();
}).DisableAntiforgery();
#pragma warning restore SKEXP0001

Dikkat ederseniz, Image Captioning neticesinde AI modelden elde edilen açıklama metnini "Bu metni Türkçe'ye çevir : {{$input}}" şeklinde bir prompt template eşliğinde Kernel’a gönderiyor ve böylece translate işlemini de diğer AI modeli tarafından gerçekleştiriyoruz.

Uygulamayı bu vaziyette tekrar derleyip, aynı görsel üzerinden teste tabi tutarsak bu sefer de aşağıdaki neticeyi alıyoruz;Semantic Kernel İle HuggingFace'de Image Captioning ÇalışmasıEvet, görüldüğü üzere başarıyla translate işlemini de gerçekleştirmiş bulunuyoruz.

Anlayacağınız, iki farklı platformdaki AI modellerini, Semantic Kernel sayesinde aynı yapılandırma yaklaşımıyla uygulamaya rahatlıkla entegre etmiş bulunuyoruz. İşte Semantic Kernel’ın en büyük avantajı, sağladığı abstraction ile farklı yapılandırma gerektiren platformlar üzerinde kolaylıkla handle yapabilmemize ve biz geliştiricilerin sadece uygulamanın gereksinimlerine odaklanarak sadece koda odaklanmamıza olanak tanıması olduğunu söyleyebiliriz.

İlgilenenlerin faydalanması dileğiyle…
Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar…

Not : Örnek çalışmaya aşağıdaki GitHub adresinden erişebilirsiniz.
https://github.com/gncyyldz/SemanticKernel.HuggingFace.ImageCaptioning.Translate

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir