Windows'ta Kendi Haar Cascade(.xml) Dosyanı Yaratmak



Windows'ta en basit şekilde kendi cascade dosyalarımızı yaratmak için Cascade Trainer GUI adlı programı kullanıyoruz. Programın indirme linkine bu sayfanın en aşağısından ulaşabilirsiniz.

Ne işe yarar?

Temelde yaptığı şey, training için bizden sadece gri tonlu negative ve positive image'ları alıp detection aşamasına gelince kullanacağımız 'cascade.xml' dosyasını oluşturması. Program sayesinde büyük bir yükten(hem negative hem positive image'lar için description dosyaları oluşturma, 'opencv_createsample' ile positive image'ların sayısını çoğaltıp training kısmında kullanılacak .vec dosyaları oluşturma, 'opencv_traincascade' ile cascade.xml dosyasını oluşturma gibi aşamalardan) kurtulup sadece gri tonlu resimleri sağlamamız yeterli oluyor. 'cascade.xml' dosyasını oluşturduktan sonra burada yazmış olduğum kodun aynısını (oluşturduğumuz yeni cascade.xml ile eskisini değiştirerek) uygulamak verilen herhangi bir videoda araba tespiti yapmak için yeterli.

Nasıl Çalışır?

Programı indirip kurduktan sonra, 'car_cascade' isimli bir klasör açalım. Program training'i tamamlayıp çalışmayı bitirdikten sonra bu klasörün içine 'classifier' isimli bir klasör oluşturacak. Bu klasörün içerisinde de istediğimiz cascade.xml dosyasını bulabiliriz. Ayrıca car_cascade klasörünün içine programı çalıştırmadan positive image'ların olduğu 'p' adlı ve negative image'ların olduğu 'n' adlı klasörleri oluşturup ekliyoruz. İsimlendirme programın dosyaları tanıması için bu şekilde olmak zorunda.

Gereken Negative-Positive Image Sayısı

Teorik olarak, negative image'ların(tespit etmek istediğimiz nesnenin içinde olmadığı) sayısı positive'lerin(tespit etmek istediğimiz nesnenin içinde olduğu) bir kaç katı olmalı. Bunun bir nedeni, programın bizim yerimize yaptığı 'creating sample' aşamasında, positive image'ları 'superimposing' ile döndürüp, negative image'ların üzerine yerleştirip çok sayıda positive image daha elde edebilmesi. (Mesela elimizde 200 positive, 1000 negative image olsun, 200*1000 den  200000-yaklaşık- positive image'a sahip olabiliyoruz.) Bu yüzden, -oranla- az sayıda positive image işimizi görüyor.

Positive image'lar için kullanabileceğiniz araba dataset'leri:
1.Stanford Cars Dataset
2.UIUC Image Database for Car Detection

Gri Tona Dönüştürme

Viola-Jones algoritmasının nesne tespitinin training aşamasında gri tondaki frame'ler ile çalışmasından dolayı (amacı image'ı renk düzeyinden kurtarıp training'i daha kolay/başarılı hale getirmek) öncelikle elde ettiğimiz image'ları gri tona çeviriyoruz. Bunun için, bir klasörün içerisindeki resimleri gri tona çevirip bunları başka bir klasörün içerisine kaydeden, yazdığım python koduna buradan ulaşabilirsiniz.

Uygulama

Image'ları toplama aşamasından sonra 'Input' sekmesinde 'Samples Folder'a, oluşturduğumuz 'car_cascade' klasörünün path'ini veriyoruz.




'Common' sekmesindeki 'Number of Stages', training kısmındaki tekrarlanma sayısı, 30 40 değerlerini verdiğimizde belki doğruluk değerlerini arttırabiliriz ama training çok fazla zaman alacaktır. Bu kısmın 15-20 olması idealdir. 'Pre-calculated Buffer Size'ı da training hızını yükseltmek için değiştirebiliriz. (Programın tutorial'ına göre, 8GB RAM bilgisayarlar için bu değerler 2048'e kadar yükseltilebilir.)




'Cascade' sekmesindeki 'Sample Width' ve 'Sample Height'de training hızını arttırmak için küçük ölçüler belirlemeliyiz. Bunlar büyüdükçe detection yavaşlar. Genişlik ve yükseklik için önerilen ayarlar ise bir yönü 24'te tutmak ve diğerini buna göre ayarlamaktır. 'Feature Type' içinse özellik türünü HAAR, LBP veya HOG olarak ayarlayabiliriz. HAAR sınıflandırıcısı çok hassastır fakat eğitmek için çok daha fazla zaman gerektirir, bu nedenle sınıflandırıcıya çok sayıda resim sunabiliyorsak LBP'yi kullanmak daha akıllıca olacaktır. Diğer yandan, LBP sınıflandırıcısı daha az hassastır ancak çok daha hızlı çalışır. Daha ayrıntılı bilgi için OpenCV dokümantasyonundan ve programın kendi sayfasından yararlanabilirsiniz. Her şey tamamsa training için 'Start'a basabiliriz.





Training tamamlandıktan sonra oluşturulan cascade.xml dosyasını daha önce yazdığım 'hazır cascade dosyalarıyla araba tespiti' kodunda kullanarak videoda araba tespiti yapabiliriz. Hatta programın sağladığı bir avantajı daha kullanıp 'Test' sekmesinde input ve output bilgilerini girerek oluşturduğumuz sınıflandırıcıyı(cascade.xml) test edebiliriz.

Yaptığım bir kaç test sonucunda, çok az sayıda(25 pozitif, 50 negatif) image'la çalışınca gerçekten başarısız sonuçlar aldım. Sadece araba değil ne var ne yok her şeyi tespit etti. Sonrasında 100 positive - 500 negative ve 200 positive - 1000 negative denediğimde başarılı sonuçlar alabildim (hatta hazır cascade sınıflandırıcısına göre daha başarılı olduğunu söyleyebilirim.) 100p-500n ve 200p-1000n arasında çok fazla fark gözlemlemedim. Training 10-15 dk sürüyor. Her ikisi için oluşturulan cascade dosyalarına buradan ulaşabilirsiniz.


200 positive - 1000 negative image ile oluşturulan cascade sınıflandırıcısıyla araba tespiti (2. videoyu buradan bulabilirsiniz.)




Yorumlar