EmguCV – Face, Eye, Nose and Mouth Detection(Yüz, Göz, Burun ve Ağız Algılama)

Merhaba,

Bu içeriğimizde görüntü işleme frameworkü olan EmguCV ile yüz, göz, burun ve ağız tespiti üzerine konuşuyor olacağız. Peki bu işlemi nasıl yapacağız? Yani elde edilen görüntü üzerinde yüzü, gözü vs. nasıl algılayacağız?

Görüntü işlemede hedef olarak neyi arıyorsak arayalım ilgili nesneyi sisteme tanıtmamız gerekmektedir. Burada normal bir insanı baz alarak düşünürsek eğer; nasıl bir insan bir nesneyi önceden tanımlamadan o nesneyi ilk görüşünde tanıyamamaktaysa, benzer mantıkla bu durum bilgisayar içinde geçerli olmaktadır. Yani bir krem peynirden tutunda, bir buluta kadar herhangi bir nesneyi/şekli/şemali sisteme bir şekilde tanıtmamız gerekmektedir ki o sistemin zamanı gelince elinde ihtiyaca dönük karşılaştırma yapabileceği ve bir ölçüt olarak değerlendirebileceği bir veri olsun.

Nesneleri/şekilleri/şemalleri programatik olarak tanımlanmış ve o nesnelerin binlerce pozitif ve negatifi ile hazırlanmış xml uzantılı veri setlerine casecade sınıflandırıcıları denmektedir. Cascade veri setlerinde; pozitif tanımlanan görüntüler istenilen nesnenin bulunduğu, negatif tanımlanan görüntüler ise istenilen nesnenin bulunmadığı durumları göstermektedirler.

İlgili makalemizde içerik olarak yüz, göz, ağız ve burun söz konusu olduğu için bu nesneleri tanımlamamız gerekecektir. İşte böyle bir durumda OpenCV(doğal olarak EmguCV’de) imdadımıza yetişmekte ve bunlar ve bunlara benzer birçok nesneyi hali hazırda tanımlamış olarak bizlere sunmaktadır.

Buradan, bu makalede fazlasıyla işimize yarayacak olan tüm cascade dosyalarını elde edebilirsiniz.

Şimdi bu indirdiğiniz cascade dosyasının içeriğine göz atalım.
EmguCV - Face, Eye, Nose and Mouth Detection(Yüz, Göz, Burun ve Ağız Algılama)

Gördüğünüz üzere birçok nesne cascade veri seti olarak tanımlanmış durumda. Biz yüz, göz, burun ve ağız için yukarıda vurguladığım cascade dosyalarını kullanacağız. Tabi bunlar dışında piyasada birçok cascade dosyasının mevcut olduğunuda söylemekte fayda var.

Şimdi hiç uzatmadan direkt olarak konuya giriş yapalım.

Öncelikle şu adresteki yazımızda anlatıldığı gibi EmguCV ile ilgili tüm dll entegrasyon işlemlerinin yapıldığını varsayıyoruz ve konumuza devam ediyoruz.

Yukarıda elde ettiğimiz cascade dosyalarının erişimi kolay olması açısından projemizin “bin” -> “debug” dizinine yerleştirmeyide unutmayın.

İlk olarak kameradan görüntü elde edecek kodlarımızı yazalım.

        private void Form1_Load(object sender, EventArgs e)
        {
            Capture capture = new Capture();
            capture.Start();
            capture.ImageGrabbed += (x, y) =>
            {
                var image = capture.RetrieveBgrFrame();
                pictureBox1.Image = image.ToBitmap();
            };
        }

Ardından cascade dosyalarımızı sisteme dahil edelim.

        private void Form1_Load(object sender, EventArgs e)
        {
            Capture capture = new Capture();
            capture.Start();

            HaarCascade haaryuz = new HaarCascade("haarcascade_frontalface_default.xml");
            HaarCascade haargoz = new HaarCascade("haarcascade_eye.xml");
            HaarCascade haaragiz = new HaarCascade("haarcascade_mcs_mouth.xml");
            HaarCascade haarburun = new HaarCascade("haarcascade_mcs_nose.xml");

            capture.ImageGrabbed += (x, y) =>
            {
                var image = capture.RetrieveBgrFrame();
                pictureBox1.Image = image.ToBitmap();
            };
        }

Dikkat ederseniz eğer HaarCascade sınıfı cascade dosyalarımızı tuttuğumuz sınıftır. Şimdi bu sınıf aracılığıyla programatik veri olarak tutulan ilgili nesneyi elimizdeki görüntüde DetectHaarCascade metodu ile keşfetmeye çalışacağız.

        private void Form1_Load(object sender, EventArgs e)
        {
            Capture capture = new Capture();
            capture.Start();


            HaarCascade haaryuz = new HaarCascade("haarcascade_frontalface_default.xml");
            HaarCascade haargoz = new HaarCascade("haarcascade_eye.xml");
            HaarCascade haaragiz = new HaarCascade("haarcascade_mcs_mouth.xml");
            HaarCascade haarburun = new HaarCascade("haarcascade_mcs_nose.xml");

            capture.ImageGrabbed += (x, y) =>
            {
                var image = capture.RetrieveBgrFrame();
                if (image != null)
                {
                    //Elde edilen kamera görüntüsü Image<Gray, byte> nesnesine convert ediliyor.
                    var grayimage = image.Convert<Gray, byte>();

                    //grayimage nesnemizde DetectHaarCascade metodu aracılığıyla HaarCascade
                    //nesnesinde tutulan cascade aranmaktadır.
                    MCvAvgComp[][] Yuzler = grayimage.DetectHaarCascade(haaryuz, 1.2, 5, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));
                    MCvAvgComp[][] Gozler = grayimage.DetectHaarCascade(haargoz, 1.2, 10, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));
                    MCvAvgComp[][] Agizlar = grayimage.DetectHaarCascade(haaragiz, 1.2, 100, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));
                    MCvAvgComp[][] Burunlar = grayimage.DetectHaarCascade(haarburun, 1.2, 50, HAAR_DETECTION_TYPE.DO_CANNY_PRUNING, new Size(15, 15));

                    //Bulunan tüm nesnelerin koordinatları elde edilip gerekli çizim
                    //işlemi gerçekleştirilmektedir.
                    foreach (MCvAvgComp yuz in Yuzler[0])
                        image.Draw(yuz.rect, new Bgr(Color.Red), 2);
                    foreach (MCvAvgComp goz in Gozler[0])
                        image.Draw(goz.rect, new Bgr(Color.Black), 2);
                    foreach (MCvAvgComp agiz in Agizlar[0])
                        image.Draw(agiz.rect, new Bgr(Color.Blue), 2);
                    foreach (MCvAvgComp burun in Burunlar[0])
                        image.Draw(burun.rect, new Bgr(Color.Yellow), 2);
                }
                pictureBox1.Image = image.ToBitmap();
            };
        }

Eğer ki yukarıdaki çalışmayı derleyip çalıştırırsak aşağıdaki ekran görüntüsündeki gibi görüntüde istenilen yapılar algılanacak ve vurgulanmış olacaktır.

EmguCV - Face, Eye, Nose and Mouth Detection(Yüz, Göz, Burun ve Ağız Algılama)

Evet… Her ne kadar makalemizde hedeflediğimiz noktaya gelmiş bulunsakta şimdide bu çalışmayı dahada güçlendirmek üzere nelere dikkat edebiliriz bu hususları konuşalım.

Daha Güçlü ve Hassas Görüntü Algılama Nasıl Yapılır?

Görüntüyü algılarken hassasiyeti arttırarak daha güçlü ve verimli bir çalışma gerçekleştirmek istiyorsanız eğer DetectHaarCascade metodunun parametrelerini doğru değerlerle ayarlamanız gerekmektedir.
EmguCV - Face, Eye, Nose and Mouth Detection(Yüz, Göz, Burun ve Ağız Algılama)

  • scaleFactor parametresi;
    “Ölçek Artış Oranı” olarak nitelendirebileceğimiz bu parametre ile aranan nesnenin algılama ölçeğinin ne kadar hızlı arttırması gerektiğini belirtir. Bu parametre ne kadar yüksek ayarlanırsa detektör bir o kadar hızlı çalışacaktır. Tabi burada ölçeği yüksek ayarlamanız nesne araması sırasında geniş periyotlarla bir arama sağlayacaktır.

    Varsayılan değeri : 1.1’dir. Yani bir başka deyişle, her geçişte ölçek 1.1(%10) artmaktadır.

    Şuana kadar yaptığım çalışmalarda en ideal ölçeğin 1.2 olduğunu test etmiş oldum.

  • minNeighbors parametresi;
    Buda “Minumum Komşu Eşiği” olarak nitelendirilen bir parametredir. Yani hedeflenen nesneden tespit edilenlerin minumum ne kadar aralıklarda vurgulanmasını ifade etmektedir.
  • [HAAR_DETECTION_TYPE] flag parametresi;
    DO_CANNY_PRUNING
    Bu özellik seçilirse, dedektör aranan nesnenin mevcut görüntü bölgelerini atlayacak ve hesap maliyetini düşürecektir.

Algılanıp Vurgulanan Görüntülere Metinsel Olarak İsim Yazma

Bu işlem için algılanan nesne her ne ise bizlere koordinatları gerekmektedir. Haliyle bu koordinatlar yukarıdaki kod bloğunda var olan foreach döngülerinin kullanıldığı yerlerde bulunmaktadırlar. O halde bu foreach döngülerinde aşağıdaki gibi değişiklik oldukça yeterli olabilir.

                    foreach (MCvAvgComp hFAce in Yuzler[0])
                    {
                        image.Draw(hFAce.rect, new Bgr(Color.Red), 2);
                        MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.3, 0.3);
                        //Yazı Yazıyorum
                        image.Draw("Yuz", ref font, new Point(hFAce.rect.X, hFAce.rect.Y), new Bgr(Color.Yellow));
                    }
                    foreach (MCvAvgComp hEye in Gozler[0])
                    {
                        image.Draw(hEye.rect, new Bgr(Color.Blue), 2);
                        MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.3, 0.3);
                        //Yazı Yazıyorum
                        image.Draw("Goz", ref font, new Point(hEye.rect.X, hEye.rect.Y), new Bgr(Color.Yellow));
                    }
                    foreach (MCvAvgComp hMouth in Agizlar[0])
                    {
                        image.Draw(hMouth.rect, new Bgr(Color.Gray), 2);
                        MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.3, 0.3);
                        //Yazı Yazıyorum
                        image.Draw("Agiz", ref font, new Point(hMouth.rect.X, hMouth.rect.Y), new Bgr(Color.Yellow));
                    }
                    foreach (MCvAvgComp hNose in Burunlar[0])
                    {
                        image.Draw(hNose.rect, new Bgr(Color.Orange), 2);
                        MCvFont font = new MCvFont(FONT.CV_FONT_HERSHEY_COMPLEX, 0.3, 0.3);
                        //Yazı Yazıyorum
                        image.Draw("Burun", ref font, new Point(hNose.rect.X, hNose.rect.Y), new Bgr(Color.Yellow));
                    }

Bu işlemden sonra projeyi derleyip çalıştırdığımızda aşağıdaki videoda olduğu gibi algılanan görüntülere gerekli isimler verilmektedir.


Tabi CPU ve RAM düşüklüğünden dolayı bunca işlemi benim yaşlı bilgisayarım anca bu kadar canlı sergileyebildiği için mazur görünüz efendim 🙂

Ve son olarak,
Örnek projeyi indirmek için buraya tıklamanız yeterlidir dostlar…

Velhasıl bir makalenin daha sonuna gelmiş bulunmaktayız.

Sonraki yazılarımda görüşmek üzere…
İyi çalışmalar diliyorum…

Bunlar da hoşunuza gidebilir...

1 Cevap

  1. 06 Ağustos 2017

    […] ait olduğu o anlık mevzu bahis değildir. Bu konu üzerinde yapmış olduğumuz önceki şu ve şu çalışmalarıma göz […]

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

CAPTCHA (Şahıs Denetim Kodu) Resmi

*

Copy Protected by Chetan's WP-Copyprotect.