Python - OPENCV Yaya Tespiti (Görüntü İşleme) - Neyi Nasıl Yapsak

Post Top Ad


Yaya tarife (pedestrian detection) video takip, şahıs davranış analizi, akıllı arabalar amacıyla sürücü destek sistemi gibi değişik uygulamalarda kullanılabilir. Yaya belirlenmesi probleminde makine öğrenmesi teknikleri süregelen olarak kullanılmaktadır, bu tekniklerde eğitilmiş sınıflandırıcılar ile görüntü amacıyladeki yaya belirleme edilmeye çalışılır. Sınıflama yapılırken yani bizim örneğimizde görüntüdeki insanları bulurken, ideal bir sınıflandırıcı bulmak kadar bulunacak nesneye ait olan seçici/ayırt edici bir özelliğin (feature) çıkarılabilir olması da çok önemlidir. Yayaların tanınması probleminde HOG (Histograms of Oriented Gradient) ile özellik çıkarılması yönteminin başarılı neticeler verilen gösterilmiştir.

                 



HOG yalnızca şahıs tarife değil değişik nesnelerin tanınmasında da özellik çıkarımı amacıyla kullanılmaktadır ve OPENCV ortamında implementasyonu gerçekleştirilmiştir. Bizim örneğimizde HOG kullanarak görüntü üstündeki insanları tarif etmeye çalışacağız. Burada ön görü edeceğiniz üzere görüntü üstünde bir pencere dolaştırmak ve bu pencerelerde arama gerçekleştirme gerekecek, Çünkü amacımız şahısleri bulmak ve bir dikdörtgen içerisine almak. Görüntü üstünde pencere gezdiriyoruz diyelim, şahısleri neye göre ve nasıl tanıyacağız. Yani gezdirilen pencerenin içersinde ağaç mı var, tabela mı, araba mı yoksa insan mı? Cevabını araştırdığımız soru bu!. İşte burada metnin başında bahsetmiş olduğumuz HOG iyi neticeler verilen amacıyla tercih edilmekte. Tabi burada bir tarife prosedürü gerçekleştirme istediğimiz amacıyla, gerçekte bir makine öğrenmesi yöntemi uygulamamız gerekiyor. Yani evvelce bir takım etiketlenmişveriye HOG ile özellik çıkarımı yapıp, seçtiğimiz bir sınıflandırıcıya verip, bu sınıflandırıcıyı eğitmemiz gerekiyor. Daha sonra sunduğumuz yeni bir girdide, sınıflandırıcımız öğrenme kapasitesine göre bize bir yanıt veriyor.

Neyseki OPENCV ortamında halihazırda eğitilmiş HOG + Linear SVM modeli mevcut. Biz de bunu kullanarak görüntü ya da video üstünde yaya tarife prosedürünü gerçekleştirebiliriz. Bu makale kapsamında vereceğim örnekte KAIST Multispectral Pedestrian Detection veri seti kullanılmıştır Bu veri setinin avantajı RGB + Thermal band içermesidir. Hem böylelikle yaya tespitine örnek vermekle birlikte thermal bandının bu problemde kullanımının getirdiği avantajları da görmüş olacağız.

Şimdi kodlara başlayacak olursak; ( imutils kurmak için : pip install imutils)

.mat formatındaki görüntüyü okumak için

"""
Created on Mon Jan 23 11:07:09 2017

@author: ibrahim
"""

# Goruntuyu yeniden boyutlandırmak icin gerekli kütüphane
import imutils
from imutils.object_detection import non_max_suppression

import numpy as np
import scipy.io as sio
import matplotlib.pyplot as plt
import cv2

# initialize the HOG descriptor/person detector
hog = cv2.HOGDescriptor()
hog.setSVMDetector(cv2.HOGDescriptor_getDefaultPeopleDetector())

path = 'image_matlab/'
goruntu = 'set01_V003_I00699.mat'
mat_contents = sio.loadmat(path + goruntu)
I = mat_contents["im"]


Görüntüyü okuyup I değişkenine atmış olduk. Dikkatinizi çekmek istediğim nokta, bu görüntü 4 bandlı bir görüntü ve son bandı thermal görüntüyü içeriyor. İlk olarak yalnızca görüntünün ilk 3 bandını(RGB) kullanalım.

image = I[:,:,0:3]

image = imutils.resize(image, width=min(800, image.shape[1]))
orig = image.copy()

hog.detectMultiScale ile parametre olarak verdiğimiz görüntü üzerinde pencere gezdiriliyor ve OPENCV'de default tanımlı eğitilmiş veri seti üzerinden sınıflandırma sonucu elde ediliyor!!!!

# detect people in the image
(rects, weights) = hog.detectMultiScale(image, winStride=(4, 4),
padding=(8, 8), scale=1.01)
# draw the original bounding boxes
for (x, y, w, h) in rects:
     cv2.rectangle(orig, (x, y), (x + w, y + h), (0, 0, 255), 2)

Buraya kadar görüntüdeki kişileri bulup dikdörtgen içerisine aldık. Gördüğünüz gibi kod çok kısa, esasen özellik çıkarımı, eğitme prosedürü vs hiçbirşey ile uğraşmadık herşeyi hazır kullandık. Unutmayalım ki; kendi özel problemumiz amacıyla bu işlemleri biliyor ve yapabiliyor olmamız son derece önemli!!! Herneyse şimdi bir ileri adım olan non-maxima suppression(NMS) prosedürüne bakacak olursak: bu şu manaya geliyor:



Kişileri bulduk dikdörtgen amacıylae aldık, bunu gerçekleştirme amacıyla görüntü üstünde pencere gezdirdik. Buradaki problem aynı bireyin pencerenin kaydırılmasına bağlı olarak yine yine bulunabilecek olması. Bu problemu elimine etmek amacıyla non-maxima suppression prosedürü uygulanıyor, yani üst üste binen dikdörtgenlerin kesişme seviyesine göre(overlapThresh) eleme prosedürü gerçekleştiriyor.

# apply non-maxima suppression to the bounding boxes using a
# fairly large overlap threshold to try to maintain overlapping
# boxes that are still people
rects = np.array([[x, y, x + w, y + h] for (x, y, w, h) in rects])
pick = non_max_suppression(rects, probs=None, overlapThresh=0.5)
# draw the final bounding boxes
for (xA, yA, xB, yB) in pick:
    cv2.rectangle(image, (xA, yA), (xB, yB), (0, 255, 0), 2)
# show the output images
plt.figure(0)
plt1=plt.imshow(orig)
plt.figure(1)
plt2=plt.imshow(image)



Görüntümüzün thermal band içerdiğinden bahsetmiştik, ancak yalnızca üç bandı kullandık. Şimdi yukarıdaki kodda yalnızca bir satırı güncelleyip, aynı prosedürü yalnızca thermal band amacıyla gerçekleştirirsek;

Kodda yapılacak düzenleme :   image = I[:,:,3]




Gördüğünüz üzere, thermal band ile soldaki şahısleri de algıladık ancak iki bireyi bir şahıs olarak algıladı. Thermal bandı kullanmak bize bir üstünlük sağladı gibi, peki thermal band ile RGB görüntüyü birleştirsek ne olur!

RGB ile thermal bandı birleştirmek için kullandığım yöntem:
  • ilk olarak görüntünün görünür ksımını (yani RGB görüntüyü) YCC ye dönüştürdüm
  • Daha sonra dönüştürülmüş görüntünün ilk bandına thermal bandı yerleştir.

Yukardaki işlem için kodları vermeyeceğim, basit bir araştırma ile bulunabilir. Ben kendi yazdığım fonksiyonu çağırıyorum, içerisini doldurmak size kalmış.

image = Fonksiyonlar.color_transform(I,'YCC')

RGB ve Thermal birleştirilmiş görüntüyü kullanırsak sonuç :



Yukarıdaki kodda NMS amacıyla eşik sayısal sayısal değeri 0.5 olarak kullandık, ve üstteki görüntüde(ortada) görüldüğü gibi çakışma ortaya geldi. Eşik sayısal sayısal değeri 0.4 olarak ayarlarsak elde edeceğimiz netice ise alttaki olacaktır. Yalnız bu defa da, ortadaki bir adet çok dikdörtgen kaybolurken, soldaki doğru olarak tespit edilen bir bireyi de yitirmiş olduk. Yani burada da bir optimum nokta var, hayatın her bir noktasında bulunduğu gibi!!! Hem de şunu da fark ettiniz ki, RGB ve thermal bandı birleştirince false pozitifler artmış oldu, yani getirisi bulunduğu gibi götürüsü de oldu. Burada araştırılması gereken nokta her iki bulguyu aynı anda nasıl daha elverişli kullanabiliriz?? Yazımı burada noktalıyorum, umarım her ne kadar giriş adımında bulgular de olsa birilerine yararı dokunur...


Hiç yorum yok:

Yorum Gönderme

Popüler Yayınlar

Post Bottom Ad

Pages