Bu yazımda Python ve OpenCV2 kütüphanesi ile HOG (Histogram of Oriented Gradients) özellik tanımlayıcısını kullanarak İnsan, Yaya, Nesne, Obje algılama ile ilgili örnek çalışma yapacağız.
Öncelikli olarak aşağıda bulunan kodların tamamı : Github
HOG (Histogram of Oriented Gradients) nasıl çalışır onu inceleyelim;
HOG gri tonlamalı sektörler üzerinde çalışır, resimde gradyan geçişli gri kısımları arar.
Bunu daha kolay hale getirmek için kullanılacak resmi gri tonlamalı olarak işleyebilirsiniz.
HOG bu gri tonlamalı resimler üzerinde gradyan geçişleri bulur ve karşılaştırır, bunu da gradyan yönlerinin dağılımı(Histogram) üzerinden yapar.
HOG ile verimli çalışabilmek için dataset olarak tanımladığımız nesnelerin en boy oranları 1:2 veya 2:1 olması gerekir. Örnek vermek gerekirse 100×200, 64×128 veya tam tersi.
Şimdi örnek kodlarımıza adım adım bakalım;
1. Adım : İhtiyacımız olan kütüphaneleri kodumuz ekliyoruz.
1 2 3 4 5 |
# Gerekli Kutuphanelerimizi Ekliyoruz import cv2 import numpy as np import imutils from imutils.object_detection import non_max_suppression |
2. Adım : HOG (Histogram of Oriented Gradients) Dedektörümüzü oluşturup dataset olarak HOGDescriptor_getDefaultPeopleDetector()’ü tanımlıyoruz.
1 2 3 |
# Histogram of Oriented Gradients Dedektorumuzu Tanimliyoruz HOGCV = cv2.HOGDescriptor() HOGCV.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector()) |
3. Adım : Üzerinden İnsan veya Yaya bulmak istediğimiz kaynak resmimizi tanımlıyoruz.
1 2 3 |
Resim = cv2.imread("insan.jpg"); ResimGenislik = Resim.shape[1] EnYuksekGenislik = 800 |
4. Adım : Eğer resim genişliği EnYuksekGenişlikten fazla ise kaynak resmimizi yeniden boyutlandırıyoruz.
1 2 3 4 |
# Eger Resim Genisligi En Yuksek Genislikten Fazla Ise, # Resim Boyutumuzu En Yuksek Genislige Gore Boyutlandiriyoruz. if ResimGenislik > EnYuksekGenislik: Resim = imutils.resize(Resim, width=EnYuksekGenislik) |
5. Adım : Kaynak resmimiz üzerinde bulunan insan veya yayaların konumlarını belirliyoruz.
1 2 |
# Resimde Bulunan Insanlar veya Yayalarin Koordinatlarini Belirliyoruz. Insan, weights = HOGCV.detectMultiScale(Resim, winStride=(4, 4), padding=(8, 8), scale=1.2) |
6. Adım : Belirlediğimiz koordinatlari daha sonra sağlıklı bir şekilde kullanabilmek için Numpy Array nesnesine çeviriyoruz.
1 2 |
# Belirledigimiz Koordinatlari Numpy Array'a Ceviriyoruz. Insan = np.array([[x, y, x + w, y + h] for (x, y, w, h) in Insan]) |
7. Adım : Belirlediğimiz koordinatlar arasında üst üste denk gelen birden fazla koordinat varsa bu koordinatları teke indiriyoruz.
1 2 3 |
# Ust uste binen kutucuklari tek bir genel kutucuk haline getirmek icin, # non_max_suppression fonksiyonunu kullaniyoruz. Insan = non_max_suppression(Insan, probs=None, overlapThresh=0.6) |
8. Son Adım : Belirlenen koordinatları resim üzerinde işaretliyoruz ve resmi gösteriyoruz.
1 2 3 4 5 6 7 8 9 10 11 |
Say = 0 # Belirlenen koordinatlari isaretliyoruz. for x, y, w, h in Insan: cv2.rectangle(Resim, (x, y), (w, h), (0, 0, 100), 2) cv2.rectangle(Resim, (x, y - 20), (w,y), (0, 0, 255), -1) cv2.putText(Resim, f'Zombi{Say}', (x, y-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) Say += 1 cv2.imshow('wwPHP.com Human Detection', Resim) cv2.waitKey(0) cv2.destroyAllWindows() |
Kaynak Resmimiz – insan.jpg :
Kodun Çıktısı :