Konvolüsyonel Sinir Ağı ve OpenCV Kullanarak Yaş ve Cinsiyet Tahmini

Andrew Ng

“Artificial Intelligence is the new electricity.”
~Andrew Ng

Profil Resmi

Tuncer Ergin

Giriş

Temel yüz özelliklerinden ikisi olan yaş ve cinsiyet, sosyal etkileşimde temel bir rol oynamakla birlikte, erişim kontrolü, insan-bilgisayar etkileşimi, kanun yaptırımı ve pazarlama zekası gibi akıllı uygulamalarda önemli bir görev görmektedir. Bir metroda yolculuk yaptığınızı düşünün, hemen yanınızda dijital bir ekran var ve o ekranda reklamların döndüğünü düşünün, 45 yaşındasınız ve erkeksiniz ama ekranda otobüs durağında otobüs beklediğiniz ve hemen yanınızda bir bilboard olduğunu düşünün, tahmin edeceğiniz üzere bu bilboard’ta her yaş grubuna ve cinsiyet gözekmeksizin reklam gösterilmektedir. 40 yaşındasınız ve yirmi yaşındaki bir kişiyi hedefleyen veya erkek iken makyaz malzemesi reklemı görebilirsiniz. Peki ya sizin yaşınıza ve vinsiyetinize uygun reklamlar görseniz nasıl olurdu? Tam isabet. Peki bu nasıl yapılabilir? Tabikide bilboardın önündeki kişiyi analiz ederek. peki nasıl olacak bu analiz? Aynı aşağıdaki resimde görüldüğü gibi.

Yukarıda anlatılan örnek tabikide çoğaltılabilir, burdaki asıl amaç örnek değil analiz işlemini, yani kişinin yaşını ve cinsiyetini tespit etmektir. Peki nasıl yapacağız bunu? Okumaya devamedin 🙂 

Kullanım senaryosu

Projede görüntü kaynağı olarak youtube videosu seçtim. Siz isterseniz kendi kameranızı seçebilirsiniz. Video veya kameradan gelen görüntüden yukarıdaki şekilde görüldüğü gibi önce yüz tespiti yapılır, daha sonra tespit edilen yüz kare şekilde kesilerek yeni bir resim oluşturulur, oluşturulan bu resimden sırası ile cinsiyet ve yaş bilgisi çıkartılır. Peki bu yüz tespiti ve sınıflandırılması nasıl yapılır? İştebu noktada yardımımıza OpenCV koşuyor. OpenCV içinde bulunan haarcascade_frontalface_alt.xml dosyasını kullanarak herhangi bir görüntüden yüz tespiti yapabiliriz. Peki ya sınıflanırma? Bunun için iki ayrı model kullanacağız. bu modellerden birisi yaş için diğeri ise cinsiyet için eğitilmiş modellerdir.

Gerekli kütüphaneler

pip install OpenCV-python (link)
numpy (link)
pip install pafy (link)
pip install youtube_dl (link)

Pafy: Pafy kütüphanesi, YouTube içeriğini ve meta verilerini (Başlık, görüntüleme sayısı, süre, derecelendirme, yazar, küçük resim, anahtar kelimeler vb.) almak için kullanılır. Pafy hakkında daha fazla bilgi için, şu örneğe göz atabilirisiniz.

Çıktı:

The future we're building -- and boring | Elon Musk

None

8771549

TED

2450

Elon Musk discusses his new project digging tunnels under LA, the latest from Tesla and SpaceX and his motivation for building a future on Mars in conversation with TED's Head Curator, Chris Anderson.

Get TED Talks recommended just for you! Learn more at https://www.ted.com/signup.

The TED Talks channel features the best talks and performances from the TED Conference, where the world's leading thinkers and doers give the talk of their lives in 18 minutes (or less). Look for talks on Technology, Entertainment and Design -- plus science, business, global issues, the arts and more.

Follow TED on Twitter: http://www.twitter.com/TEDTalks

Like TED on Facebook: https://www.facebook.com/TED

Subscribe to our channel: https://www.youtube.com/TED


Takip edilecek adımlar:

  • YouTube’dan video URL’sini alma

  • Haar cascade ile yüz tanıma

  • CNN ile cinsiyet tanıma

  • CNN ile yaş tanıma

1. YouTube’dan video URL’sini alma

Yukarıdaki örnekte olduğu gibi bir youtube videosunun url’sinden videonun ve bilgilerinin alınması.

2. Haar cascade ile yüz tanıma

Bu yazıyı okuyorsanız muhtelemelen openCv kütüphanesini uymuşsunuzdur. OpenCv’nin ne olduğunu bilmeyenler ise kısa bir google araştırması sonucunda gerekli bilgileri edinebilirler. OpenCV, Haar cascade bir resimde bulunan yüzleri tespit etmek için kullanılan bir yöntemdir. OpenCV kullanarak yüz tanıma hakkında daha fazla bilgi edinmek için şu yazıya göz atabilirsiniz.

3. CNN ile cinsiyet tanıma

OpenCV’nin fisherfaces uygulamalarını kullanarak cinsiyet tanıma oldukça popülerdir, hatta bazılarınız denemiş veya okumuş olabilirsiniz. Fakat bu örnekte, cinsiyeti tanımak için farklı bir yaklaşım kullanacağım. Bu yöntem iki İsrailli araştırmacı, Gil Levi ve Tal Hassner tarafından 2015 yılında tanıtılmıştır.
Bu örnekte Levi ve Hassner tarafından eğitilmiş CNN modellerini ve OpenCV’nin “Derin Sinir Ağları” anlamına gelen dnn paketini kullanacağız.

Dnn paketinde OpenCV, bir sinir ağını doldurmak için kullanılabilecek Net adlı bir sınıf sağlamıştır. Ayrıca, bu paket caffe, tensorflow ve torch gibi derin öğrenme modellerinide destekler. Yukarıda bahsedilen araştırmacılar CNN modellerini caffe model olarak yayınladılar. Bu nedenle modeli uygulamamıza CaffeImporter ile import edeceğiz.

4. CNN ile yaş tanıma

Bu aşama cinsiyet tanıma ile birebir benzerdir yine caffe modelini kullanacağız fakat bu model cinsiyet tespiti için kullanılan modelden farklı olarak softmax katmanında 8 farklı çıktı vermektedir. bu çıktılar sırası ile (“0–2”, “4-6”, “8–13”, “15–20”, “25–32” ”,“ 38–43 ”,“ 48–53 ”ve“ 60- ”) değerlerinden  oluşmaktadır.

Caffe modelini kullanabilmek için iki farklı dosyaya ihtiyacımız var;

          1. prototxt – CNN’in tanımı buraya giriyor. Bu dosya sinir ağındaki katmanları, her katmanın girişlerini, çıkışlarını ve işlevselliğini tanımlar.

          2. caffemodel – Bu, eğitilmiş bir modelin bilgilerini içerir.

          Buradan .prtotxt ve .caffemodel dosyasını indirebilirsiniz.

          Buradan yüz tespiti için haar cascade’i indirebilirsiniz.

Herşey tamam olduğuna göre modelimizi kodlamaya başlayalım.

Adım 1: Gerekli tüm kütüphaneleri import edelim.

Adım 2: Youtube video URL’sini alıp ve videonun mp4 biçiminde en iyi çözünürlüğünü içeren bir ‘oynat’ nesnesinin oluşturulması.

Adım 3: Siz kendi kameranızı veya evin dışındakibir kameradan alacağınız bir görüntü üzerinde çalışma yapmak istiyorsanız aşağıdaki kodu kullanabilirsiniz. buradaki 0 rakamı bağlı olan kamerayı temsil eder. bağladğınız ikinci bir kamerayı kullanmak için 0’ı 1 olarak değiştirmeniz gerekmekte. Aytıca bilgisayarınızda bulunan bir video dosyasınıda videonun bulunduğu dizinin adresini girerek seçebilirsiniz.

Fakat bu projede online video kullanılacağından aşağıdaki kod çalıştırlımalıdır.
Adım 4: set () kullanarak Video karemizin yüksekliğini ve genişliğini ayarlayalım. cap.set (propId, value), buradaki 3 ve 4 rakamları genişlik ve yüksekliğin propertyId’leridir.
Adım 5: Model_Mean_Values, yaş ve cinsiyet bilgilerini deolamak için 3 farklı liste oluşturalım.
Adım 6: Önceden eğitilmiş(pre-trained) olan age_net ve gender_net  cafee modellerini import etmek için bir fonksiyon oluşturalım.
Adım 7: Ana metod içinde çalıştıracağımız bu metod ile yaş ve cinsiyet tespiti için kullanacağımız modeller import edilmiş olacak.
Yaş ve cinsiyet tespiti yapabilmek için yeni bir metod oluşturacağız ve bu metoda parametre olarak bir önceki fonksiyondan dönen yaş ve cinsiyet modellerini göndereceğiz.
Adım 8: Adım 3’te VideoCapture() tarafından oluşturulan cap nesnesini okumaya başlayalım.
cap.read() boolean değer döndürür, eğer videodan bir resim karesi okursa true aksi takdirde false değerini döndürecektir.
#Bu dönüş değerini kontrol ederek videonun sonunu kontrol edebilirsiniz. 
# Bazen, resim yakalama başlatmamış olabilir.
# Başlatılıp başlatılmadığını cap.isOpened() yöntemi ile kontrol edebilirsiniz eğer açılmamışsa cap.open() kodnu kullanarak açabilirsiniz.
Videodan resim yakalandıktan sonra gri tonlu reme çevirmemiz gerekir çünkü openCv’nin yüz algılama sistemi sadece gri(tek boyutlu resim) üzerinde çalışmaktadır.
Gri resim elde edildiğine göre artık yüz tespiti için kullanılan önceden oluşturulmuş modelimizi import edelim.
Adım 9: Yüz tanıma için kullanacağımız bu modeli import ettik. Peki bunu nasıl çalıştıracağız? Yani modele içinde yüz bulunan bir resim verdiğimizde model bu resimdeki yüzleri bulup bize nasıl geri dönüş yapacak?
Modeli çalıştırmak için modelin bir alt fonksiyonu olan detectMultiScale() metodunu kullanacağız.

Bu metod içine gönderildiği gri tonlamalı resimdeki yüzlerin kare(x,y,w,h) olarak yükseklik ve genişliğinin konumlarını geri gönderir, aldığı birinci parametre yüz tespitinin yapılcağı gri tonlu resim, ikinci parametre alynı anda üst üste binen iki yüzü tespit etmek için kullanılan hata faktörü, üçüncü parametre ise kayan pencere yapılırken aynı konumun çevresinde kaç yüz bulunacağını belirten parametredir. 

Adım 10: Resimdeki yüzler bulunduktan sonra her yüz için bir döngü oluşturalım ve orjinal resimdeki yüzün bulunduğu alanı kare içine alıp kırpalım. kırpılan bu resmi yaş ve cinsiyet tespiti için kullanacağımız modele vermeden önce kırmılan resmin modelin giriş katmanı ile(227,227) aynı boyutta olmayacağını göz önünde bulundurarak yeniden boyutlandıralım ve modellere giriş resmi olarak verelim. Her bir model yaş ve cinsiyet bilgisini tahmin ettikten sonra oluşturulan çıktıyı orjinal resimdeki karenin üzerine bu bilgiyi  ekleyelim. 

Adım 11: Bir resim üzerindeki her bir yüz için işlem yapıldıktan sonra  o anki orjinal resmi ekranda gösterelim ve videonun bir sonraki karesi için tekrardan işlem başalatalım, döngü bu videonun sonuna kadar devam etmelidir.

Sonuç

Oldukça eğlenceli değil mi? 
Tabiki sonuçlar %100 doğru değil, sebebi ise kullanılan modeller. Siz kendi veri setiniz ile eğiteceğiniz farklı bir model ile daha iyi bir başarım elde edebilirsiniz. ayrıca kişinin hislerini de algılayan(duygu analizi) yeni bir model eğitip projeye ekleyerek çok daha kullanışlı bir proje elde edebilirsiniz. 

İsterseniz projenin kaynak kodlarına buradan erişebilirsiniz.