kişisel internet günlüğü
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…
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.
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.
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’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:
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…
Benim aklıma alttakiler geliyor ama liste uzayabilir. Sizin de eklemek istedikleriniz varsa beklerim:
Belki ileride bunun üstüne devam eden bir uygulama yazarız. Şimdilik bu kadar. Yorumlarınızı ve sizin uygulama önerilerinizi beklerim…
murat
14 Ekim 2008, 2:35 am
sizin dll ile denedigimde gözleri buldu ancak kendim yukarda yazdıgım gibi dll yaratamadım
LINK : fatal error LNK1181: cannot open input file “mpisearch.lib”
Error executing link.exe.
bu hatayı verdi
birde bu sekılde agız ve burunuda detect edebilen bir yazılım var mı . birde bu olayın opencvden farkı ne acaba ondada face detection var ama bu hem yüzü buluyo(open cvnın yaptıgı işi yapıyor) hemde gözleri bilginiz varsa paylaşabilir misiniz cok tesekkur ederım
ismailari
14 Ekim 2008, 9:16 am
@murat: Sorunuzla ben karşılaşmamıştım. Muhtemelen sizin projeniz oluşurken mpisearch.lib’in bulunduğu dizini link dizinlerinde görmüyor. Biliyorsanız bu dizini, projenizin link dizininize ekleyin, yoksa da mpisearch.lib’i system32′ye koyun. Başka çözümünü bilemiyorum ne yazık ki. Belki yazarlarına sorarsanız daha iyi yardımcı olurlar.
OpenCV’den algoritmik olarak fark olması lazım. Bu renkli resimlerde de çalışıyor, yani s/b’a çevirmeden. Çok detayını şu an hatırlamıyorum. İnternette yüz bulan araçkutusu benim bildiğim ve kullandığım kadarıyla OpenCV’ninki ve bu var.