Bir bilgisayar mühendisi için programlama dili, öğrendiklerini sınadığı, deneyler yaptığı bir laboratuardır ve mühendisler deneylerini, kestiremedikleri sonuçları gözlemlemek için değil, öngördükleri sonuçları doğrulamak için yapar...

HaarCascadeClassifier.dll

Viola-Jones nesne tespit algoritmasını kullanarak hazırladığım, başka hiçbir ek kütüphaneye gerek duymadan .NETin tüm dillerinde hızlı bir biçimde nesne tespiti yapabilmesini sağlayan açık kaynak kodlu .NET kütüphanem.
HaarCascadeClassifier.dll
Proje anasayfası: haar-object-detector-dot-net
Son sürüm: 1.0.0
Kod örnekleri ve kütüphane: tıklayınız

İlgili yazılar: Bitmapleri .Net Çatısı Altında Hızlıca İşleme (kütüphanede pikselleri hızlıca okumak için kullandığım yöntem)

Bir önceki yazımda Viola-Jones nesne tespit algoritmasının nesne tespiti ile ilgili kısmının implementasyonunu VB.Net ile yapmaya çalıştığımı yazmıştım. İlgili kütüphanenin yazımını tamamlayıp açık kaynak kodlu olarak yayınladım. Kullandığım yöntemi de ilerleyen günlerde ayrıntılı olarak yazmaya çalışacağım.

OpenCV ile hazırlanan XML formatındaki kademeli sınıflandırıcıların verilerini ayıklayıp kullanarak görüntülerde istenen nesnelerin tespitini yapan kütüphane, çalışmak için ne OpenCV'ye ne de bir başka kütüphaneye gerek duymaz. Kullanımı oldukça basit olan kütüphaneyi .NET tarafından desteklenen tüm dillerde rahatlıkla kullanabilirsiniz.

Kütüphaneyi nesne tespiti için kullanabileceğiniz gibi, sadece algoritmayı anlamak ve parametrelerin sonuçlar üzerindeki etkisini incelemek için de kullanabilirsiniz.

Parametreler

Parametrelerin rastgele seçilmesi, nesnelerin bulunamamasına veya işlemlerin çok uzun sürmesine neden olabilir. Parametreler aşağıdaki açıklamalar doğrultusunda amaca uygun olarak seçilmelidir. Bu değişkenler ve açıklamalar sadece bu kütüphanedeki implementasyona özel değil ve algoritmanın anlaşılması için önemli...

Parametre Açıklama
MaxDetCount Tespit edilecek maksimum nesne sayısı. Tespit edilen nesne sayısı (aynı nesnenin birden fazla kez tespiti de bu sayıya dahil) bu değere ulaştığında işlemler durdurulur ve sonuçlar döndürülür. Bir sınır konması istenmiyorsa bu Int32.MaxValue değeri gönderilebilir.
MinNRectCount Görüntünün nesneyi içerdiğinin kabulü için gerekli minimum komşu tespit sayısı. (Aynı nesne, aynı bölgede farklı ölçeklerle boyutlandırılmış arama penceresi tarafından birden fazla kez tespit edilebilir.)

Değer büyük olursa nesneler tespit edilemeyebilir. 0 veya 1 verilmesi önerilir.
FirstScale Arama penceresini ölçekleyecek ilk katsayı. Bu sayı, eğitimde kullanılan görüntülerin boyutları ile çarpılır ve çarpım arama penceresinin ilk boyutlarını belirler.

Görüntüdeki çok küçük nesnelerin de tespit edilmesi istenirse küçük bir değer seçilmelidir. Ancak değerin küçük seçilmesi hızı büyük oranda düşürür. Bu parametreye atama yapmak için piksel cinsinden minimum nesne boyutu belirtilebilmesini sağlayan kütüphaneye ait Size2Scale() fonksiyonu kullanılabilir.
MaxScale Arama penceresini ölçekleyen katsayı büyüye büyüye bu değeri aştığında işlemler durdurulur ve sonuçlar döndürülür.

Görüntüde tespit edilebilecek nesnelerin boyutunu sınırlar. Size2Scale() fonksiyonuna görüntü genişliğinin yaklaşık 2/3'ü yollanarak elde edilecek değerin kullanılması önerilir.
ScaleMul Arama penceresinin ölçekleyicisini çarpa çarpa arttıran katsayı. Bu katsayı sayesinde FirstScale ve MaxScale arasındaki ölçekler dolaşılır.

Değerin küçük seçilmesi aranacak alt bölge sayısını arttıracağı için hızı düşürür. Ama aynı zamanda nesnelerin atlanma ihtimalini de zayıflatır. Bulunacak nesneler çok küçükse 1.1 civarında, aksi halde biraz daha büyük bir değer verilmesi önerilir.
SizeMultForNesRectCon Tespit sonunda iç içe olan dikdörtgenlerin belirlenebilmesi için kullanılır. Katsayı, dikdörtgenlerden birinin boyutlarını çarparak, dikdörgenlerin iç içe kabul edilebilmesini sağlayacak maksimum uzaklığı belirler. Dikdörgenlerin köşeleri arasındaki uzaklık hesaplanan maksimum uzaklıktan küçükse dikdörtgenler iç içe kabul edilir.

Küçük değerler, aynı nesne için birden çok iç içe konum döndürülmesine sebep olur. 0.3 civarında verilmesi önerilir.
SlidingRatio Arama penceresinin görüntüde her adımda kendisinin kaçta kaçı kadar kaydırılacağını belirleyen oran.

Değişkenin değerinin sonuçlar üzerindeki etkisi ScaleMul değişkeninin etkisi ile aynıdır. 0.2 civarında bir değer verilmesi önerilir.
Pen Tespit edilen nesnelerin gönderilen Bitmap üzerinde işaretlenmesini sağlayan System.Drawing.Pen nesnesi. Bir Pen nesnesinin rengi ve çizgi kalınlığı belirlenebilir. Bitmap üzerinde işaretleme yapılması istenmiyorsa, Pen parametresi boş gönderilebilir. (Vb.Net: Nothing, C#: null)

C# Örneği

(Diğer dillerle yazılmış örnekleri proje anaysafasında bulabilirsiniz.)

1. Parametreleri hazırlama:

int maxDetCount = Int32.MaxValue;
int minNRectCount = 0;
float firstScale = detector.Size2Scale(100);
float maxScale = detector.Size2Scale(400);
float scaleMult = 1.1f;
float sizeMultForNesRectCon = 0.3f;
float slidingRatio = 0.2f;
Pen pen = new Pen(Brushes.Red, 4);
HaarCascadeClassifer.HaarDetector.DetectionParams detectorParameters;
detectorParameters = new HaarCascadeClassifer.HaarDetector.DetectionParams(maxDetCount,
    minNRectCount, firstScale, maxScale, scaleMult, sizeMultForNesRectCon, slidingRatio, pen);

2. Bir haar sınıflandırcısı yükleme:

XmlDocument xmlDoc=new XmlDocument();
xmlDoc.LoadXml(HaarCascadeClassifer.EmbeddedCascades.Resources.haarcascade_frontalface_alt);
HaarDetector detector = new HaarDetector(xmlDoc);

3. Nesnelerin tespiti:

HaarCascadeClassifer.HaarDetector.DResults results = detector.Detect(ref bmp, detectorParameters);

Sonuçları taşıyan results değişkeni aşağıdaki üyelere sahiptir:

results.NOfObjects             // Tespit edilen nesne sayısı
results.DetectedOLocs          // Tespit edilen nesnelerin konumları (Rectangle tipinde dizi)
results.SearchedSubRegionCount // Aranan toplam alt bölge sayısı

Kısıtlamalar

Sayfayı
Yayın tarihi: 16 Ağustos 2012 Perşembe, 09:51
Anahtar kelimeler: haar öznitelikleri, haar sınıflandırıcı, haar cascade, nesne bulma, viola jones algoritması

Yorum Gönder

 
Yorumunuzu -1. yoruma yanıt olarak gönderiyorsunuz. Yanıtlamayı iptal etmek için buraya tıklayabilirsiniz.

 

Yorumlar

Onaylanmış yorum bulunmuyor.
 
 
Sayfa 37 sorgu ile 0.005 saniyede oluşturuldu.
Atasoy Blog v4 © 2008-2017 Hüseyin Atasoy