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

.NET’te Amazon Rekognition İle Image Recognition – Yüz Tanıma ve Bulanıklaştırma

Merhaba,

Bu içeriğimizde Amazon Rekognition ile .NET’te Image Recognition hakkında bilgi edinecek, bu servise dair temel kavramları öğrenecek ve bir yandan da görsellerdeki insan/nesne görüntülerini tanımayı ya da gizlilik endişeleri nedeniyle bir görüntüdeki insan yüzlerini bulanıklaştırmayı ve bunların dışında bazı ek işlemleri pratiksel olarak nasıl gerçekleştirebileceğimizi inceliyor olacağız. Ayrıca Yüz Analizi(Facial Analysis), Etiket Algılama(Label Detection), Görüntü Düzenleme(Image Moderation) vb. gibi API’leri de dashboard üzerinden ele alacağız. Şimdi gelin, çok fazla uzatmaksızın, uygulamalarımıza bir çift dijital göz misali görsel dünyayı yorumlayabilmemizi sağlayacak olan nitelikleri kazandıracak bu ilginç servisi incelemeye geçelim…

Amazon Rekognition Nedir?

Amazon Rekognition, AWS tarafından sunulan makine öğrenimi(machine learning) tabanlı bir görüntü ve video analiz servisidir. Bu servis sayesinde, uygulamalara aşağıdaki gibi güçlü görüntü işleme yetenekleri eklenebilmektedir;

  • Yüz Tanıma ve Analizi
    • Görüntülerdeki yüzleri tespit etme
    • Yüz özelliklerini analiz ederek yaş tahmini, duygu analizi gibi işlemler gerçekleştirme
    • Belirli bir yüzü veritabanındaki yüzlerle eşleştirme
    • Gerçek zamanlı yüz tanıma sistemleri geliştirme
  • Nesne ve Sahne Algılama
    • Görüntülerde veya videolarda araba, köpek, plaj vs. gibi nesneleri, sahneleri ve aktiviteleri algılama
  • Metin Algılama
    • Görsellerde veya videolarda bulunan yazıları otomatik olarak tanıma ve işleme
  • Zararlı İçerik Algılama
    • Uygunsuz veya zararlı görselleri otomatik tespit etme
    • İçerik filtreleme
  • Kişi Tanıma
    • AWS tarafından sağlanan ünlü kişi veri seti sayesinde ünlü kişileri tanımlama
  • Olay Algılama
    • Videolar içinde birinin düşmesi veya bir nesnenin kaybolması gibi olayları tespit etme

Evet, görüldüğü üzere biz geliştiriciler, Amazon Rekognition’ın yetenekleri sayesinde görsel içeriklerden büyük ölçekte değerli bilgiler edinebilmekteyiz. Üstelik bunu yaparken de bu süper yetenekleri uygulamalarımıza kolayca entegre edebilmemiz için Amazon Rekognition tarafından çeşitli API’ler ve SDK’ler sunulmaktadır.

Fiyatlandırma açısından Amazon Rekognition’ı değerlendirirsek eğer her biri kendi fiyatlandırma ayrıntısına sahip 4 farklı kullanım türünden bahsedilmektedir. Bizler bu içeriğimizde genellikle Görüntü Tanıma(Image Recognition) ile ilgili seyirde bulunacağımızdan dolayı direkt bu konseptin fiyatlandırmasına odaklanırsak eğer, ayda 5000’den fazla görseli ilk 12 ay boyunca ücretsiz olarak analiz etmemizi sağlayacaktır. Ee bu bilgide şimdilik bizim için yeterlidir diyebiliriz 🙂 Daha ayrıntılı bilgi için şuradaki dokümana göz atmanızda fayda vardır.

Nerelerde Kullanacağız?

Amazon Rekognition servisini nerelerde, ne amaçlarla kullanacağımıza dair projeksiyon olması açısından bir kaç satırda yorumda bulunmak istiyorum. Şöyle ki;

  • Tarafınızca paylaşılmış özgün bir görselin hedef bir web sitesinde, herhangi bir sosyal medyada ya da içerik paylaşım platformunda yayınlanıp yayınlanmadığını Amazon Rekognition servisini kullanarak İçerik Denetleme(Content Moderation) yaklaşımıyla tarayabilirsiniz.
  • Duygu Analizi(Sentiment Analysis) ile bireylerin duygusal duyarlılık katsayılarını ölçebilir ve neticeye göre ticari ya da farklı eylemsel hamlelerde bulunabilirsiniz.
  • Görme engelli kullanıcılara bir görseli dijital olarak anlatmak için kullanabilirsiniz.
  • Online mağazalarınızda kullanıcıların ellerindeki görsellerle ya da metinsel bir tanımla ürün tarayabilmelerini sağlayabilir ve dijital pazarlarda fark yaratabilirsiniz.
  • Umumi uygulamalarda özellikle görsel materyallerde uygulama politikalarınıza uygun güvenlik ve gözetim amaçlı kullanabilirsiniz.
  • Ve daha nice ihtiyaç noktalarında kullanıp, yazılımlarınıza akla gelmeyecek özgün nitelikler kazandırabilirsiniz.

Amazon Rekognition Dashboard’u Keşfedelim

Elbette ki içeriğimizin devamında image recognition için Asp.NET Core üzerinden pratiksel dokunuşlarda bulunacağız. Lakin öncelikle bu servisi daha iyi tanımak ve kavramak için Amazon Rekognition Dashboard’a göz atmakta fayda görmekteyim. Bunun için AWS Management Console üzerinden ilgili servisi aratarak açalım ve incelemeye başlayalım….NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve BulanıklaştırmaYukarıdaki görselden de görüldüğü üzere Amazon Rekognition yeteneklerini bizlere deneme yapabilmemiz için demo olarak açmaktadır ve label detection’dan tutun text in image’e kadar birçok servis burada listelenmektedir. Misal olarak bizler, örnek bir resim üzerinden label detection‘ı test ediyoruz. Dikkat ederseniz seçilen görsel içeriğinde aya bakan bir adam(ben 🙃) var. Haliyle Amazon Rekognition adamı da ayı da yakalayabilmekte ve bizlere sonucu döndürmektedir. (Ulan hadi adamı anladın da, ayın ay olduğunu nasıl anladın, helal be!) Bunun dışında yine dikkat ederseniz sağdaki ‘result’ kısmında görsele dair doğa, açık hava, gökyüzü vs. gibi analiz oranlarını vermekte (hatta görselde gözükmese de, bulunulan ortamın Gemi olma ihtimaline de %55 vermiş 😯) ve bir yandan da bu servisi API üzerinden kullanırken request’in nasıl yapılabileceğine ve request neticesinde gelecek olan response’un nasıl bir içeriğe sahip olacağına dair bilgiler sunmaktadır.

Benzer mantıkla image properties‘i test edersek eğer;.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve Bulanıklaştırmagörüldüğü üzere verilen görsele dair renk bileşenlerinden tutun parlaklık oranı vs. tüm teknik bilgileri vermektedir.

Image moderation yeteneğinde ise;.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve BulanıklaştırmaAmazon Rekognition, görseli değerlendirip güven puanı vermekte ve ima edici, uygunsuz ya da müstehcen olup olmama durumunu değerlendirmektedir. Misal olarak, yukarıdaki görselde herhangi bir ima ya da uygunsuzluk söz konusu olmadığı için bir oran vermediğini görüyorsunuz. Amma velakin müstehcen bir içerikle testi gerçekleştirirseniz burada değerlendirme neticesini alabilir ve ne kadar gerçekçi olduğunu gözlemleyip, bir yandan şaşırırken bir yandan da uygulamalarınız için Amazon Rekognition’ın gayet güvenilir bir araç olduğuna emin olabilirsiniz. Özellikle bu yeteneği bizler, çoğunlukla kullanıcıların görüntü paylaşmasına izin verilen public sahalarda kullanmayı tercih edebiliriz. Ne de olsa birinin oturup yayınlanan görselleri manuel olarak incelemesi yerine, bu denetim sorumluluğunu Amazon Rekognition gibi üstün yetenekli bir tool’a bırakmak mali açıdan çok daha hesaplı ve akıllıca olacaktır kanaatindeyim.

Son olarak facial analysis‘i test edersek eğer;.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve Bulanıklaştırmagörüldüğü üzere, görsel üzerindeki tüm yüzleri yakalayıp analizlerini gerçekleştirebiliyor; cinsiyet, yaş aralığı, duygu ve benzeri diğer özellikleri belirleyerek bizlere sunabiliyor. (peze*v*ke bak erkek gibi görünüyo diyo 😂 si**__) Düşünsenize, bu gelen verilerden yola çıkarak esasında uygulamaya yüklenecek bir görselin nasıl olması ve görünmesi gerektiğini tanımlayabilir ve böylece uygulamanın politikalarına uygun bir görsel dayatmasında bulunabilirsiniz.

Bunların dışında yüz karşılaştırma(face comparison), görseldeki yazıları okuma(text in image) vs. gibi daha birçok değerli özellikte mevcuttur. Artık bunları denemeyi sizlere bırakıyorum. Bizler içeriğimizin devamında Amazon Rekognition SDK’i eşliğinde bir Asp.NET Core uygulaması üzerinden label detection ve image moderation tekniklerini pratiksel inceleyecek ve bunların yanında görsel üzerindeki yüzleri bulanıklaştırmayı teknik olarak deneyimleyeceğiz. Hadi başlayalım…

Asp.NET Core’da Amazon Rekognition ile Image Recognition

İlk olarak bir Asp.NET Core uygulaması oluşturalım ve bu projeye aşağıdaki paketleri yükleyerek başlayalım;

AWSSDK.Extensions.NETCore.Setup (Install-Package AWSSDK.Extensions.NETCore.Setup)
AWSSDK.Rekognition (Install-Package AWSSDK.Rekognition)
SixLabors.ImageSharp (Install-Package SixLabors.ImageSharp)

Görüldüğü üzere AWS servislerini .NET uygulamalarına entegre etmemizi ve Rekognition yeteneğini kullanabilmemizi sağlayacak kütüphaneler eşliğinde, görüntü işleme kütüphanesi olan ImageSharp‘ı uygulamaya yüklemiş bulunuyoruz.

Ardından aşağıdaki yapılandırmayla uygulamaya Rekognition servisini ekleyelim;

builder.Services.AddDefaultAWSOptions(builder.Configuration.GetAWSOptions());
builder.Services.AddAWSService<IAmazonRekognition>();

Tabi burada çalışma sergilenen makineden AWS servislerini kullanabilmek için authentication yapıldığına dair emin olunması gerekmektedir. Bunun için, AWS CLI Profiles’ı kullanacağız.

AWS CLI Profiles’ın Yapılandırılması Adımları

  1. AWS CLI‘ı indirip, yükleyiniz.
  2. IAM servisinden bir user oluşturunuz.
  3. User’a access key oluşturunuz.
  4. Herhangi bir terminal ekranından aws configure --profile example-profile talimatını vererek bilgisayarda ‘example-profile’ adında bir profil oluşturunuz.
  5. Son olarak aws configure list --profile example-profile talimatıyla da oluşturulan profili doğrulayınız.

Haliyle uygulamanın ‘appsettings.json’ dosyasında aşağıdaki yapılandırmada bulunmamız gerekmektedir.

{
  .
  .
  .
  "AWS": {
    "Profile": "example-profile",
    "Region": "us-west-2"
  }
}

Artık temel yapılandırmayı sağladığımıza göre artık uygulamaya gerekli endpoint’leri eklemeye geçebiliriz.

Label Detection Endpoint

İlk olarak label detection işlevini halledeceğiz. Client’tan gelecek olan bir görseli Amazon Rekognition’la gerekli algılama işlemine tabi tutacağız. Bunun için aşağıdaki endpoint’i oluşturalım;

app.MapPost("/detect-labels", async (IFormFile file, IAmazonRekognition amazonRekognition) =>
{
    var memoryStream = new MemoryStream();
    await file.CopyToAsync(memoryStream);
    var response = await amazonRekognition.DetectLabelsAsync(new DetectLabelsRequest
    {
        Image = new Amazon.Rekognition.Model.Image
        {
            Bytes = memoryStream
        },
        MinConfidence = 95
    });

    Console.WriteLine(JsonSerializer.Serialize(response));

    var labels = new List<string>();
    foreach (var label in response.Labels)
        labels.Add(label.Name);

    return Results.Ok(labels);
})
    .DisableAntiforgery();

Yukarıda yapılan çalışmaya göz atarsanız eğer, client’tan gelen görseli MemoryStream‘e almakta ve DetectLabelsAsync metodu eşliğinde label detection’a göndermekteyiz. Ayrıca, görseldeki etiketlere dair minimum güven puanı olarak da %95 değerinde bir eşik(MinConfidence) belirleyerek bu şekilde optimizasyon dokunuşlarında da bulunabilmekteyiz.

Uygulamayı bu vaziyette derleyip çalıştırırsak ve aşağıdaki görseldeki örnek resimle testimizi gerçekleştirirsek eğer;.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve Bulanıklaştırma.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve Bulanıklaştırmayandaki gibi bir neticeyle karşılaşacağız…

Görüldüğü üzere, label detection için gönderdiğimiz örnek görselde ben deniz kota benzer giysiler giydiğim için Clothins, Jeans ve Pants değerlerini vermektedir. Benzer mantıkla; Face, Portrait, Adult, Male ve Man etiketleriyle yüzü gözüken yetişkin bir erkeği; Photography, Nature ve Outdoors etiketleriyle görselin doğada veya açık havada çekilmiş bir fotoğraf olduğunu; Rock, Grass, Plant ve Tree etiketleriyle görselde kaya, çimen, bitki, ağaç vs. gibi doğal öğelerin bulunduğunu; Sea, Water, Beach, Coast, Shoreline ve Horizon etiketleriyle görselde deniz, kıyı şeridi veya plaj manzarası olduğunu ve Sitting etiketiyle de görseldeki kişinin oturduğunu ifade etmektedir.

Burada gelen etiketler, yukarıdaki yapılandırmada MinConfidence‘da vurguladığımız eşik değerinin üzerinde olan etiketlerdir. Eğer eşiğin değerini düşürürseniz sezgisel olarak görselle alakasızlaşan daha fazla etiketin sonuç olarak gelmeye başladığını görebilirsiniz.

Tüm bunların dışında label detection sürecine aşağıdaki yapılandırmalar eşliğinde de türlü kısıtlamalar getirebilir ve daha ince optimizasyonlarda bulunabilirsiniz;

  • Maksimum Etiket Sayısı (MaxLabels)
    En fazla tespit edilecek etiket sayısını belirler;

    .
    .
    .
        var response = await amazonRekognition.DetectLabelsAsync(new DetectLabelsRequest
        {
            Image = new Amazon.Rekognition.Model.Image
            {
                Bytes = memoryStream
            },
            MinConfidence = 95,
    
            MaxLabels = 5
        });
    .
    .
    .
    

    Eğer sonuç olarak çok fazla etiket istemiyorsanız bu değeri sınırlandırabilir ve böylece gereksiz etiketleri filtreleyerek işlem yükünü azaltabilirsiniz.

  • Özellikler (Features)
    Label detection sürecinde belirli özellikleri belirterek algılanacak nesnelere müdahale edebilirsiniz;

    .
    .
    .
        var response = await amazonRekognition.DetectLabelsAsync(new DetectLabelsRequest
        {
            Image = new Amazon.Rekognition.Model.Image
            {
                Bytes = memoryStream
            },
            MinConfidence = 95,
    
            Features = [
                "GENERAL_LABELS",
                "IMAGE_PROPERTIES"
                ]
        });
    .
    .
    .
    

    Burada mevcut features seçenekleri aşağıdaki gibidir;

     – GENERAL_LABELS : Genel nesneleri ve sahneleri algılar. Varsayılan seçenektir.
     – IMAGE_PROPERTIES : Görselin renk bilgilerini ve metadata bilgilerini döndürür.
     – TEXT_DETECTION : Görseldeki metinleri algılar.

Evet, label detection’ı yeterince incelediğimize göre artık (muhtemelen) içeriğimizin en havalı bölümü olan kısma, görseldeki yüzleri algılamaya ve bu yüzleri bulanıklaştırmaya geçebiliriz.

Blur Faces Endpoint

Aşağıdaki çalışmada Amazon Rekognition ile görseldeki yüzleri algılamakta ve böylece hem toplam yüz sayısını hem de bu yüzlerin konumunu ve boyutunu belirten koordinatlarını(BoundingBox) elde etmekteyiz. Haliyle bu bilgiler eşliğinde SixLabors.ImageSharp paketini kullanarak görüntüdeki yüzler kolaylıkla bulanıklaştırılmaktadır.

app.MapPost("blur-faces", async (IFormFile file, IAmazonRekognition amazonRekognition) =>
{
    using var memoryStream = new MemoryStream();
    await file.CopyToAsync(memoryStream);
    var response = await amazonRekognition.DetectFacesAsync(new DetectFacesRequest
    {
        Image = new Amazon.Rekognition.Model.Image()
        {
            Bytes = memoryStream
        }
    });

    if (response.FaceDetails.Count > 0)
    {
        var image = SixLabors.ImageSharp.Image.Load(file.OpenReadStream());
        foreach (var face in response.FaceDetails)
        {
            var rectangle = new SixLabors.ImageSharp.Rectangle
            {
                Width = (int)(image.Width * face.BoundingBox.Width),
                Height = (int)(image.Height * face.BoundingBox.Height),
                X = (int)(image.Width * face.BoundingBox.Left),
                Y = (int)(image.Height * face.BoundingBox.Top)
            };

            image.Mutate(context => context.BoxBlur(30, rectangle));
            memoryStream.Position = 0;
        }
        var outputMemoryStream = new MemoryStream();
        await image.SaveAsync(outputMemoryStream, new WebpEncoder());
        outputMemoryStream.Position = 0;

        #region İsterseniz Dosyayı Fiziksel Kaydedebilirsiniz
        //outputMemoryStream.Position = 0;
        //using var fileStream = File.Create("output.webp");
        //await outputMemoryStream.CopyToAsync(fileStream); 
        #endregion

        return Results.File(outputMemoryStream, file.ContentType);
    }
    return Results.NotFound();
})
    .DisableAntiforgery();

Bu sefer de görseldeki yüzleri DetectFacesAsync metoduyla algıladığımıza dikkatinizi çekerim. Hemen aşağıdaki görsel eşliğinde gerekli testimizi gerçekleştirirsek;.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve Bulanıklaştırmaaşağıdaki gibi oldukça başarılı bir netice elde ettiğimizi gözlemleyeceğiz;.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve BulanıklaştırmaHarika değil mi? 🙂

AWS S3 Bucket’a her görsel yüklendiğinde bu kod parçasını bir AWS Lambda üzerinden tetikleyip yüz bulanıklaştırma işlemini otomatik gerçekleştirebilirsiniz. İlham kaynağına pratik eşlik için bakınız : .NET’te S3 Event’leriyle AWS Lambda’yı Tetikleyelim

Image Moderation Endpoint

Son olarak da gelen görüntüleri herhangi bir ima edici, müstehcen ya da uygunsuz içeriğe karşın denetmek için bir endpoint çalışması gerçekleştirelim;

app.MapPost("/moderate", async (IFormFile file, IAmazonRekognition amazonRekognition) =>
{
    var memoryStream = new MemoryStream();
    await file.CopyToAsync(memoryStream);
    var response = await amazonRekognition.DetectModerationLabelsAsync(new DetectModerationLabelsRequest
    {
        Image = new Amazon.Rekognition.Model.Image
        {
            Bytes = memoryStream
        },
        MinConfidence = 90
    });

    Console.WriteLine(JsonSerializer.Serialize(response));

    return response.ModerationLabels.Any() ? Results.Ok("unsafe") : Results.Ok("safe");
})
    .DisableAntiforgery();

Burada DetectModerationLabelsAsync metoduyla görseli kontrol ediyor ve MinConfidence ayarını da %90 belirterek minimum güven eşiğini ayarlıyoruz. Böylece Amazon Rekognition, görseldeki ima edici, müstehcen ya da uygunsuz içeriği %90 ya da daha fazla ihtimalle algıladığından emin olduğunda ModerationLabels verilerini döndürmekte ve bizler de işlemlerimizi buna göre şekillendirmekteyiz.

Tabi burada gelen ModerationLabels değerlerine de göz atabilir ve görseldeki uygun olmayan nesne ya da durumları ifade eden label’ları da işlevsel kaynak olarak uygulamanızda kullanabilirsiniz. Misal olarak aşağıdaki savaş görselini moderation ettiğimizde neticeyi gözlemleyebilirsiniz;.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve Bulanıklaştırma.NET'te Amazon Rekognition İle Image Recognition - Yüz Tanıma ve Bulanıklaştırma

İşte bu kadar 🙂

Nihai olarak;
İçerik seyrinde Amazon Rekognition ile label detection, image moderation ve facial analysis gibi teknikleri hem teorik hem de pratik olarak incelemiş ve bir yandan da görsel üzerindeki yüzleri bulanıklaştırarak teknik bir ihtiyaca karşın basit bir çözümü tecrübe etmiş bulunuyoruz. Bu işlemler özünde ayrı bir uğraş ve matematik bilgisi gerektiriyor olsa da Amazon Rekognition sayesinde bu kısımların sorumluluğunu kodumuzdan soyutlayabilmekte, bir SDK aracılığıyla oldukça kolay bir şekilde uygulayabilmekte ve yazılımlara entegre edebilmekteyiz.

Bundan gayrı ihtiyaç noktalarında kesin tercihim Amazon Rekognition’dır diyebilirim 🙂

İ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/AmazonRekognition.Example

Bunlar da hoşunuza gidebilir...

Bir yanıt yazın

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