Makine Öğrenmesi Eğlencelidir! Bölüm 4: Derin Öğrenme ile Modern Yüz Tanıma | by Hasan Damirli | Mar, 2025


Yüz Tanıma — Adım Adım
Bu problemi adım adım ele alalım. Her adımda farklı bir makine öğrenme algoritması öğreneceğiz. Bunun bir kitaba dönüşmesini engellemek için her algoritmayı tek tek açıklamayacağım, ancak her birinin ardındaki ana fikirleri öğreneceksiniz ve OpenFace ve dlib kullanarak Python’da kendi yüz tanıma sisteminizi nasıl oluşturabileceğinizi öğreneceksiniz.

Adım 1: Tüm Yüzleri Bulmak
Boru hattımızdaki ilk adım yüz algılamadır. Açıkçası, bir fotoğraftaki yüzleri birbirinden ayırmaya çalışmadan önce onları bulmamız gerekir!

Son 10 yılda herhangi bir kamera kullandıysanız, yüz algılama özelliğini muhtemelen uygulamada görmüşsünüzdür:

Yüz algılama, kameralar için harika bir özelliktir. Kamera yüzleri otomatik olarak seçebildiğinde, resmi çekmeden önce tüm yüzlerin odakta olduğundan emin olabilir. Ancak bunu farklı bir amaç için kullanacağız: boru hattımızdaki bir sonraki adıma geçirmek istediğimiz görüntü alanlarını bulmak.

Yüz algılama, 2000’lerin başında Paul Viola ve Michael Jones’un ucuz kameralarda çalışacak kadar hızlı yüz algılama yöntemi icat etmesiyle ana akıma girdi. Ancak, artık çok daha güvenilir çözümler mevcut. 2005’te icat edilen Histogram of Oriented Gradients — veya kısaca HOG — adlı bir yöntemi kullanacağız.

Bir görüntüdeki yüzleri bulmak için, yüzleri bulmak için renkli verilere ihtiyacımız olmadığından, görüntümüzü siyah beyaz yaparak başlayacağız:

Daha sonra görüntümüzdeki her piksele tek tek bakacağız. Her piksel için, onu doğrudan çevreleyen piksellere bakmak istiyoruz:

Amacımız, mevcut pikselin doğrudan çevresindeki piksellere kıyasla ne kadar koyu olduğunu bulmaktır. Daha sonra, görüntünün hangi yönde koyulaştığını gösteren bir ok çizmek istiyoruz:

Sadece bu piksele ve ona dokunan piksellere bakıldığında, görüntünün sağ üst tarafa doğru koyulaştığı görülüyor.

Bu işlemi görüntüdeki her bir piksel için tekrarlarsanız, her pikselin bir okla değiştirildiğini görürsünüz. Bu oklara gradyan denir ve tüm görüntü boyunca açık renkten koyu renge doğru akışı gösterirler:

Bu rastgele bir şey gibi görünebilir, ancak pikselleri gradyanlarla değiştirmek için gerçekten iyi bir neden var. Pikselleri doğrudan analiz edersek, aynı kişinin gerçekten karanlık görüntüleri ve gerçekten aydınlık görüntüleri tamamen farklı piksel değerlerine sahip olacaktır. Ancak yalnızca parlaklığın değiştiği yönü dikkate alarak, hem gerçekten karanlık görüntüler hem de gerçekten parlak görüntüler aynı tam temsile sahip olacaktır. Bu, sorunu çözmeyi çok daha kolay hale getirir!

Ancak her bir piksel için degradeyi kaydetmek bize çok fazla ayrıntı veriyor. Ağaçlardan ormanı göremiyoruz. Daha yüksek bir seviyede temel açıklık/koyuluk akışını görebilseydik daha iyi olurdu, böylece görüntünün temel desenini görebilirdik.

Bunu yapmak için, görüntüyü her biri 16×16 piksellik küçük karelere böleceğiz. Her karede, kaç tane degradenin her ana yöne işaret ettiğini sayacağız (kaç tane yukarı, kaç tane yukarı-sağ, kaç tane sağ vb. işaret ediyor). Sonra görüntüdeki o kareyi en güçlü olan ok yönleriyle değiştireceğiz.

Sonuç olarak orijinal görüntüyü, yüzün temel yapısını basit bir şekilde yakalayan çok basit bir gösterime dönüştürüyoruz:

Orijinal görüntü, görüntü parlaklıklarından bağımsız olarak görüntünün önemli özelliklerini yakalayan bir HOG gösterimine dönüştürülür.

Bu HOG görüntüsündeki yüzleri bulmak için yapmamız gereken tek şey, bir dizi diğer eğitim yüzünden çıkarılan bilinen bir HOG desenine en çok benzeyen görüntümüzün kısmını bulmaktır:

Bu tekniği kullanarak artık herhangi bir görüntüdeki yüzleri kolayca bulabiliriz:

Bu adımı Python ve dlib kullanarak kendiniz denemek istiyorsanız, görüntülerin HOG gösterimlerinin nasıl oluşturulacağını ve görüntüleneceğini gösteren kod burada.

Adım 2: Poz Verme ve Yüzleri Yansıtma
Vay canına, görüntümüzdeki yüzleri izole ettik. Ama şimdi farklı yönlere bakan yüzlerin bir bilgisayara tamamen farklı görünmesi sorunuyla uğraşmamız gerekiyor:

İnsanlar her iki fotoğrafın da Will Ferrell’a ait olduğunu kolaylıkla anlayabilir, ancak bilgisayarlar bu fotoğrafları tamamen farklı iki kişi olarak görecektir.

Bunu hesaba katmak için, her resmi, gözler ve dudaklar her zaman görüntüdeki örnek yerinde olacak şekilde çarpıtmaya çalışacağız. Bu, sonraki adımlarda yüzleri karşılaştırmamızı çok daha kolaylaştıracaktır.

Bunu yapmak için, yüz sınır tahmini adı verilen bir algoritma kullanacağız. Bunu yapmanın birçok yolu var, ancak 2014 yılında Vahid Kazemi ve Josephine Sullivan tarafından icat edilen yaklaşımı kullanacağız.

Temel fikir, her yüzde bulunan 68 belirli nokta (dönüm noktası olarak adlandırılır) bulmamızdır — çenenin üstü, her gözün dış kenarı, her kaşın iç kenarı, vb. Daha sonra, herhangi bir yüzdeki bu 68 belirli noktayı bulabilecek bir makine öğrenme algoritması eğiteceğiz:

Her yüze yerleştireceğimiz 68 dönüm noktası. Bu görüntü, OpenFace üzerinde çalışan CMU’dan Brandon Amos tarafından oluşturuldu.

İşte test resmimizde 68 yüz noktasını bulmanın sonucu:

İPUCU: Aynı tekniği, Snapchat’in gerçek zamanlı 3 boyutlu yüz filtrelerinin kendi versiyonunuzu uygulamak için de kullanabilirsiniz!

Recent Articles

Related Stories

Leave A Reply

Please enter your comment!
Please enter your name here