Yaklaşık bir haftalık bir aradan sonra görüntü işleme için yeniden merhaba!

Bugünkü yazıda MATLAB ve MPT araçkutusu kullanılarak bir resimdeki yüzler ve bu yüzlere ait gözler nasıl bulunur onu anlatacağım. Bir resimdeki yüzleri bulmak kısmen çözülmüş bir problem. O yüzden biz de bu iş için bir araçkutusu kullanacağız. MATLAB ile resmimizi okuyup, MPT göz bulma fonksiyonuna gönderecek ve dönen bilgileri ekrana basacağız. Şu anlık bu bilgileri başka bir uygulamada kullanmıyoruz ve sadece gözlemliyoruz ama yazının sonunda bahsedeceğim değişik uygulamalar için bir önişlem olarak kullanabiliriz. “Bu yazıyı okumak bana ne katar?” diyorsanız alttaki resimlere bakın, işinize yararsa buyurun…

Orijinal resim Bulunan yüzler ve gözler

Başlamadan önce not edelim; ben bunu Windows’ta Visual C++ 6.0 ile yaptım, diğer işletim sistemleri ve programlarla da olmasını umuyorum.

MATLAB Mex Dosyaları

Malumunuz, her işi MATLAB’de yapamayız. Zaten halihazırda yapılmış binlerce çalışma var ve yazılan çoğu algoritma hızlı çalışması için C, C++, Fortran gibi programlama dillerinde yazılıyor. Fakat bu programlama dillerinde algoritma geliştirmek de her programcının harcı değil ve daha çok emek + sabır isteyen birşey. Yani şöyle bir gerçeklik var: MATLAB geliştirme sürecini hızlandırır fakat programlarımız bahsettiğim programlama dillerinde yazılırsa genelde daha hızlı çalışır. Bu yüzden MATLAB geliştiricileri, MATLAB’in içinden C ve Fortran kodunuzu çağırabileceğiniz bir sistem kurmuşlar: Mex dosyaları. Bu konuya çok girmeyeceğim, belki başka zaman daha detaylı anlatırım, ama şunları bilmekte fayda var. Yazdığınız C fonksiyonlarını MATLAB’den kullanmak istiyorsanız, “mex gateway function” diye anılan ve C dosyası olarak yazılan bir ara fonksiyon yazıyorsunuz. Bu fonksiyon MATLAB’deki değişkenleri C’ye aktarmanızı ve işlem sonucunu geri MATLAB’e döndürmenizi sağlıyor. Yazılan bu C fonksiyonunun derlenmesi sonucunda uzantısı .dll (MATLAB 7.1′e kadar) veya ana işlemcinizin bit sayısına göre .mexw32, .mexw64 (7.1′den sonra) olan yeni bir dosya oluşuyor. Bu dosyaya nasıl .m dosyalarına fonksiyon olarak erişebiliyorsak, MATLAB’in içinden erişebiliyoruz. Tabii ki bu dosyanın çalışma dizinimizde olması gerekiyor (daha doğrusu path ile görülebilmesi gerekiyor).

Zaten MATLAB’in kullandığımız (hızlı çalışan) çoğu fonksiyonu C’de yazılmış ve biz onlara MATLAB’den ulaşabiliyoruz.

MPT araçkutusu

Yüzleri ve gözleri bulabilmek için Machine Perception Toolbox’ı, yani Makine Algılama Araçkutusu’nu kullanacağız. Şimdi reçeteye geçelim:

MPT’ye bu adresten erişelim. Download kısmına geçelim. Bu yazı esnasında en yeni sürüm Beta 0.4b idi. Ben onu kullanacağım. Eğer Windows demo paketini indirirseniz, makinenize kurulum paketi olarak gelir ve Windows’a kurabilirsiniz. Fakat bu hazır yazılım olarak çalışıyor ve kameranızdan gerçek zamanlı işlem yapabiliyor. Biz MPT-0.4b-src.zip dosyasını indirelim ve içindekileri makinemizde uygun bir yere açalım.

Şimdi, açtığımız klasörde bulunan Libraries -> eyefinder -> matlab -> windows klasörüne gidelim. Buradaki mp_eyefinderMex.dsw dosyasını Visual C++ 6.0 ile açalım. .NET ile de olur ama ben 6.0 kullandım, ayarları değişik yerlerden yapılıyordur muhtemelen. Neyse, açınca alttaki gibi sınıflar gözükecek. Options’a tıklayalım:

Alttaki bilgileri sarı renkli yerler seçili iken Directories sekmesine girelim. Not: Bende MATLAB 2008a vardı, sizdeki adres farklı olabilir, sizdeki sürüme göre girin.

Şimdi de alttaki gibi aktif projeyi belirleyelim:

Son olarak da projeyi derleyelim:

Umarım hatasız derlenir ve bir üst klasörde mp_eyefinderMex.dll adında bir dosya oluşur. (Eğer “int to unsigned int typecasting” hataları verirse, hatanın oluştuğu dosyadaki hataya sebep veren değişkeni unsigned int olarak tanımlayın. Eğer mex veya mx ile başlayan fonksiyonlardan birinde hata verirse MATLAB help’ten o fonksiyonu bulun ve kullandığınız MATLAB sürümünde hangi parametrelerle çalıştığına bakın. Ben de mx ile başlayan bir iki fonksiyonda hata oluşmuştu, böyle yapıp düzelttim.)

Eğer bu dosyayı derleyemiyorsanız, benim makinemde oluşan dll için mp_eyefinderMex (67) - 2.01 MB dosyasını indirin. Ama unutmayın, ben Windows XP’de MATLAB 2008a konfigürasyonuyla derledim, sizde çalışmayabilir.

Burada not etmekte fayda var; biz eyefinder kullanacağız, diğer modülleri kullanmak isterseniz benzer yolları denemelisiniz.

Herneyse dosyayı elde ettiyseniz artık MATLAB koduna geçelim.

MATLAB ile MPT fonksiyonlarına erişim

MATLAB’i açalım ve çalışma dizini olarak oluşturduğumuz dll fonksiyonunun bulunduğu klasöre gidelim. Oraya test amaçlı test_eyefinder.m adında bir dosya oluşturalım ve içine alttaki kodu ekleyelim.

% Önce ortamı bi temizleyelim
clear, clc
 
% Resmi okuyalım, isterseniz o klasörde bulunan loadImage ile de okuyabilirsiniz.
img = imread('ornek_resim.jpg');
 
% Yüzleri ve gözleri bulalım
F = eyefinder(img);
 
% Sonuçları görelim
imshow(img);
truesize % Gerçek boyutları ile göster
hold on
for i=1:size(F,1) % Bulunan her yüz için
faceRect = rectangle('Position', [F(i).x F(i).y F(i).size F(i).size]); % Yüz karesini çiz
set(faceRect, 'FaceColor', 'none', 'EdgeColor', 'r', 'Linewidth', 2); % Kırmızı ve 2 genişliğinde olsun
plot(F(i).xLeft, F(i).yLeft, 'go', 'Linewidth', 2, 'Markersize', F(i).size/12) % Sol göz
plot(F(i).xRight, F(i).yRight, 'go', 'Linewidth', 2, 'Markersize', F(i).size/12) % Sağ göz
end
hold off

Koddaki resim dosyasının adını değiştirmeyi ve bulunduğunuz klasörde eyefinder.m olduğunu unutmayalım! Bir de F=eyefinder(img); kodunun başına tic sonuna da toc eklersek geçen süreyi saniye olarak görebiliriz. Örneğin, yukarıdaki masa tenisçileri fotoğrafını işlemesi benim makinemde 4.31 saniye sürdü. Bir seferinde de yanlışlıkla fotoğraf makinesinden aldığım resmi küçültmeden (yaklaşık 5 megapixel) denedim, program bir ‘halt’ edemedi! MATLAB’i öldürmek zorunda kaldım. Siz de örnekteki boyutlara yakın resimlerde deneyin bence veya da resimleri ölçekleyip verin.

Aşağıda başka resimler üstündeki sonuçlarına da bakabilirsiniz:

Sonuçlar

Değerlendirme

Benim gözlemlediğim kadarıyla önden görünen yüzler için sonuçlar iyi. Ama profile yakın yüzleri bulamıyor. Gözlerin yerini de yanlış bulabiliyor. Bazı yüzleri bulamayabiliyor, bakınız: üstteki toplu fotoğraflar. Hem renkli hem de gri resimlerde çalışıyor ama anladığım kadarı ile mpisearch gri resimlerde arama yapıyor, çünkü renkli arama yapan başka fonksiyonu da var, onu kullanmıyor.

En zayıp yönü yavaş çalışıyor olması. Daha önceden OpenCV’ye ara bir fonksiyon yazıp MATLAB’den yüz bulma fonksiyonunu çağırmıştım, en çok yarım saniyede buluyordu! Tabii gözleri bulamıyordu, sadece yüzler. Belki başka bir yazıda onu anlatırım.

Şimdi gelelim fasulyenin faydalarına…

Kullanım alanları

Benim aklıma alttakiler geliyor ama liste uzayabilir. Sizin de eklemek istedikleriniz varsa beklerim:

  • Yüz bozunumu (face morphing) uygulamaları için temel iş gözbebeklerini birbirine çakıştırmak. Bunu elle yapmak yerine otomatik yapıp kullanıcıya ince ayar yapması sorulabilir. Diğer öznitelik noktalarını da yine kullanıcı seçer.
  • Tarayıcıdan tarattığınız bir portrenizi otomatik olarak düzgün boyutlarda kırpmak isteyebilirsiniz. Bakınız: Yüz normalizasyonu kodu
  • Yüzlerde herhangi bir uygulama öncesi yüzleri hizalama için kullanılabilir.
  • “Bir fotoğrafta kaç kişi var?” sorusuna cevap olabilir.
  • Hani lunaparklarda modeller olur, arkasına geçersiniz, gözlerinizi veya yüzünüzü oturtursunuz. İşte böyle bir uygulama yapılabilir. Daha önceden hazırlanan bir takım maskelere verilen yüz otomatik olarak oturtulur.
  • Herhangi bir ressamın tüm yüz çalışmalarını (tabi gerçek kişilerden olmayan, kafasından çizdiği) toplayıp, işleyip, bu ressamın hangi oranları kullandığını bulabiliriz.
  • Bir filmdeki veya bir oyundaki zamana göre yüz sayısını çıkarırız ve buna kalabalıklık grafiği deriz, sonra filmleri/oyunları bu özelliğiyle işleyebiliriz.
  • Filmlerde veya resimlerde altyazı kullanmak yerine bulunan yüzün konumuna göre baloncuk yerleştirip, içine yazılar koyabiliriz.
  • Web kameranız siz sohbet ederken yüzünüzü otomatik olarak takip eder. Konferans ve derslere de uygulanabilir.

Belki ileride bunun üstüne devam eden bir uygulama yazarız. Şimdilik bu kadar. Yorumlarınızı ve sizin uygulama önerilerinizi beklerim…