Bu yıl Algoritma Analizi dersinde kod yazarken “Nasıl daha verimli kod yazarız?” bunları öğrendik. Dönem içerisinde yazdığımız kodların karmaşıklıklarını hesaplayarak, yazılan kodun verimli olup olmadığını veya daha verimli halinin nasıl olacağını bularak ona göre dönüşüm yaptık.

Bu işleyiş sonucunda bizden; Yapay Zeka, Makina Öğrenmesi, Doğal Dil İşleme, Derin Öğrenme veya bunların alt yapısı olan İstatistik, Lineer Cebir gibi konulardan birinin üzerinde bir dönem sonu projesi istenildi. Proje tamamlandıktan sonra projeyi anlatan ve karmaşıklığını söyleyen bir blog yazısı yazılarak artık son dönemi noktalayabileceğimiz söylendi. 🙂

Bu yazımda Algoritma Analizi dersi için Kişilerin İl(Rastgele) Tespiti projesini anlatacağım.

Bu proje Microsoft’un geliştirdiği yaş tahmin etme uygulamasından yola çıkarak yapılmış bir il tahmin etme projesidir. Proje iki aşamadan oluşmaktadır: HTML kodu ve Python kodu. HTML kodu içerisinde PHP ve Processing programlama dilleri kullanılmıştır.

Proje php uzantılı dosyanın web üzerinde açılmasıyla çalışır. İlk olarak PHP ile Python dosyasını çalıştıran bir komut çalıştırılır ve sonucunda resimde elde edilen yüzlerin x, y koordinatları, genişliği ve yüksekliği döndürülür. Daha sonra koda Processing dilini kullanabilmek için geliştirilmiş javascript dosyası eklenir. Javascript ile Python kodundan elde edilen yüz koordinatları bir değişkene atanır ve bu değişkendeki istenilen indisteki değeri veren bir fonksiyon yazılır. Artık bulunan yüzleri belirtmek ve onlara il atamak için Processing kodu yazılır.

Processing de temel 2 fonksiyon bulunur: setup() ve draw() fonksiyonları. Program çalıştığında ilk olarak çalışan metot setup() dır ve bir kez çalışır. draw() ise sürekli çalışan bir metottur.

Proje için setup() metotu; öncelikle ekranın arka planını turuncuya boyar ve üzerinde işlem yapılacak resmi alır. Daha sonra çizim yapmak için kullanılan canvas elementine 2 boyutlu çizim yapılacağı belirtilir. Canvas ve resmin boyutları birbirine eşlenir. Bir dizi oluşturularak içerisine il isimleri eklenir.

draw() metotu; image() fonksiyonu ile ekranın 0’a 0’ıncı noktasından alınan resmin çizileceği belirtilir. Ve bir for döngüsü yapılarak Python kodundan alınan yüz koordinatları üzerinde fakat 4er 4er gezilir. Çünkü bir yüzün x, y koordinatları, genişlik ve yükseklik değerleri olduğundan her bir yüz için 4 değer olur. daha sonra çizgileri belirgin bir dikdörtgen çizilir. Parametre olarak da js değişkeninde olan x, y koordinatları, genişlik, yükseklik değerlerini alır. Böyle belirlenen yüzü dikdörtgen içerisine almış olur. Sonra da il tespiti için bir dikdörtgen oluşturulur. İl yazımı olacağından text’e boyut verilir. İl ataması için oluşturulan counties dizisinden bir eleman alınır. Fakat kullanıcı aynı resmi ikinciye yüklediğinde farklı illerin atanmaması için tespit edilen yüzün x koordinatıyla dizi boyutu bir mod işlemine tabi tutulur. Seçilen ilin doğru şekilde kutu içerisine yazılması için doğru koordinatlar ayarlanır ve text ekranda belirlenen yere yazılır.

Python kodunda ise; yazılan komuttan resim yolu ve yüzün nasıl olduğunun tanımlandığı XML dosyasının yolu alınır ve bunlar okunarak ilgili değişkenlere atanır. Resim griye dönüştürülür. Daha sonrada XML dosyasında bulunan detectMultiScale() metotu kullanılarak yüzler tespit edilir. Bu tespit edilen yüzlerin de x, y koordinatları, genişlik, yükseklik bilgileri bir diziye aktarılır ve PHP dosyasında kullanılmak üzere yazdırılır.

Projenin input formatı ise fotoğraftır.

Yukarıda da bahsettiğim gibi projenin php ve python tarafı bulunmaktadır. Bu yüzden karmaşıklık hesabını iki dosya için ayrı ayrı göstereceğim.

index.php dosyasında karmaşıklık için önemli olan kod parçacığı şu şekildedir:

Processing ile yazılan draw() fonksiyonunda görüldüğü gibi tek for içerisinde kodlar yazılıdır. Tek for kullanıldığı için karmaşıklık O(n)‘dir.

face_detect.py dosyasında karmaşıklık için önemli olan kod parçacığı şu şekildedir:

Burada da tek for bulunduğu için karmaşıklık O(n)‘dir.

Sonuç olarak bu kod girdi olarak alınan fotoğrafda bulunan kişileri bularak onlara il atamaktadır.

Proje Demo Linki: https://www.youtube.com/watch?v=iyjHl-PSMoI

Proje Github Linki: https://github.com/haticeerturk/CountryDetect

202 Total Views 6 Views Today
Share on FacebookTweet about this on TwitterShare on Google+Share on LinkedIn