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.
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) |
(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ı
Thanks; This is a great example! Works...
One Question : How did you train your trainer?
I have used the openCV Xml's But they are not compatible.
If i could train a XML for other objects i would be good for me!
Could you please send me Message or reply here.
Thanks
The xml files in the examples are distributed with opencv. I haven't trained any classifier for HaarCascadeClassifier.dll and unfortunately, there is no function related to cascade training in the library.
Not all but some of the xml files distributed with opencv are compatible. You should use an xml that doesn't contain tilted features. Tilted features are not supported by the library.