• Skip to main content
  • Skip to secondary menu
  • Skip to primary sidebar
  • Skip to footer
  • Home
  • Crypto Currency
  • Technology
  • Contact
NEO Share

NEO Share

Sharing The Latest Tech News

  • Home
  • Artificial Intelligence
  • Machine Learning
  • Computers
  • Mobile
  • Crypto Currency

Gerçek Zamanlı Nesne Takibi(Real-Time Object Detection w/Yolo-Python)

December 26, 2020 by systems

Şimdi yazımızın başrol oyuncusu olan YOLO’ya geçebiliriz 🙂

YOLO Nedir?

•YOLO konvolüsyonel sinir ağları kullanarak nesne tespiti yapan bir algoritmadır. Açılımı ‘’You Only Look Once’’ demektir.

•Sebebi ise algoritmanın nesne tespitini oldukça hızlı bir şekilde ve tek seferde yapabiliyor olmasıdır.

  • YOLO algoritmasının diğer algoritmalardan daha hızlı olmasının sebebi resmin tamamını tek seferde nöral bir ağdan geçiriyor olmasıdır.
  • YOLO algoritması görüntüler üzerinde tespit ettiği nesnelerin çevresini bounding box ile çevreler.

•YOLO kendisine girdi olarak verilen görüntüyü NxN’lik ızgaralara böler. Bu ızgaralar 5×5,9×9,17×17… olabilir.

•Her ızgara kendi içerisinde nesne olup olmadığını ve nesne var olduğunu düşünüyorsa merkez noktasının kendi alanında olup olmadığını düşünür.

•Nesnenin merkez noktasına sahip olduğuna karar veren ızgara o nesnenin sınıfını, yüksekliğini ve genişliğini bulup o nesnenin çevresine bounding box çizmelidir.

YOLO Izgara Sistemi(Temsili)

•Birden fazla ızgara, nesnenin kendi içerisinde olduğunu düşünebilir. Bu durumda ekranda gereksiz bounding box’lar oluşur.

•Bütün bounding boxların güven skoru vardır.

•Bu durumu engellemek için Non-Maximum Suppression algoritması kullanılır.

  • Kısaca Non-max Suppression algoritması görüntü üzerinde tespit edilen nesneler için çizilen bounding boxlardan güven değeri en yüksek olanı ekrana çizer.
Non-Max Suppression

Aşağıdaki grafiklerde YOLO ve diğer bazı algoritmaların MS COCO data set’i için object detection performanslarını görebiliriz.

https://arxiv.org/abs/2004.10934

Grafiklerde de göründüğü gibi sınıflandırıcı sayısının eşit olduğu bir case düşünürsek YOLOv4 rakiplerine göre neredeyse 3 kat fark atmış durumda.

Şimdi YOLO ile nesne tanıma aşamalarından kısaca bahsedelim. Örnek olarak Maskeli ve Maskesiz Yüzleri tespit eden bir projeyi inceleyelim.

1-)Data Toplama/Etiketleme

Data etiketleme işlemini https://www.makesense.ai/ üzerinden yapabilirsiniz. Etiketleme işlemi algoritmanın maskeli ve maskesiz insanları ayırt edip kendi kendini eğitebileceği train datasını kendisine verebilmemiz için önemlidir. Make Sense dışında görüntü etiketleme yapabileceğiniz bir çok ortam bulabilirsiniz. Ben tercihimi etiketleme sonucundaki datayı YOLO’nun istediği formatta verebilen Make Sense’den yana kullanıyorum.Aşağıda etiketleme aşaması için örnek görüntüleri görüyoruz.

Örnek olması açısından 2 adet görüntü etiketledim ve sonucu YOLO formatında export ettiğimde aşağıdaki şekilde 2 görüntü için 2 farklı matrise sahip oldum.

Görüntüleri etiketledikten sonra DarkNet aracılığı ile Google Colab üzerinden kendi YOLO modelimi eğittim. Eğitim aşamaları için bazı ekran görüntülerini sizler ile paylaşıyorum.

•YOLO algoritmasının çalıştırılabilmesi için Darknet bizden bazı dosyalar beklemektedir. Bunlardan bir tanesi de .cfg dosyasıdır.

•Config dosyası YOLO içerisindeki Sinir ağının başarısını,hızını vs etkileyecek özellikleri bizden talep eder.

•YOLO’nun bizden beklediği bir başka dosya ise .names dosyası.Names içerisinde sınıfların adlarını tutar.Maske tespiti uygulaması için Mask ve No-Mask olmak üzere 2 class vardır.

  • Ayrıca bütün dosyaların DarkNet klasöründeki konumunu belirten .data uzantılı dosyayı da bizden talep eder.
Google Colab ile Eğitim Sırasında Alınmış Bir Görüntü

Bir eğitimin başarısını eğitim sonrası oluşan loss grafiğinden anlaşılabilir. Eğer YOLO modelimiz için çok fazla data train edip ve yapay sinir ağımızın iterasyon sayısını çok fazla arttırırsak sistem Over Train(Aşırı Öğrenme) olabilir. Bu da modelimizde yaşanmasını istemediğimiz bir durum.

Eğitim aşamasını tamamlayıp .weights uzantılı dosyamıza sahip olduğumuzu varsayıyoruz. Artık modelimiz hazır.

Data etiketleme eğitim vs. gibi işlemler ile uğraşmak sıkıcı olabilir. Alternatif olarak bir başkası tarafından eğitilmiş bir modeli kullanabilirsiniz. Maske basit 2 sınıfa sahip bir örnek olduğu için belki bilmediğimiz bir modeli kullanabiliriz fakat özel durumlar ve unique bir konu için nasıl eğitildiğini bilmediğimiz bir modeli kullanmak iyi bir tercih olmayabilir.

Bu aşamaya kadar hepimizin Maske Tanıma için weights ve config dosyalarımızın elimizde olduğunu kabul ediyorum.

Maske tanıma işlemini local kamera ile real time olarak yapabildiğim programa aşağıdan ulaşabilirsiniz.

Github : https://github.com/alperenyildiz/mask-detection

import cv2
import numpy as np

whT = 320
cap = cv2.VideoCapture(0)
confThreshold=0.5
nmsThreshold=0.3

classFile="maske.names"
classNames=[]

with open(classFile,"rt") as f:
classNames=f.read().rstrip("n").split("n")

modelConfiguration="maske.cfg"
modelWeights="maske_final.weights"

model=cv2.dnn.readNetFromDarknet(modelConfiguration,modelWeights)

model.setPreferableBackend(cv2.dnn.DNN_TARGET_CPU)
model.setPreferableTarget(cv2.dnn.DNN_TARGET_CPU)

def findObject(detectionLayers,img):
hT,wT,cT=img.shape
bbox=[] #sınırlayıcı kutularımızı tutan liste
classIds=[] #sınıflarımızı tutan id listesi
confs=[] #Bulunan nesnelerin güven değerini tutan listemiz

for detectionLayer in detectionLayers:
for objectDetection in detectionLayer:
scores=objectDetection[5:]
classId=np.argmax(scores)
confidence=scores[classId]
if confidence>confThreshold:
w,h=int(objectDetection[2]*wT),int(objectDetection[3]*hT)
x,y=int((objectDetection[0]*wT)-w/2),int((objectDetection[1]*hT)-h/2)
bbox.append([x,y,w,h])
classIds.append(classId)
confs.append(float(confidence))

#Non maxiumum suppression ;
indices=cv2.dnn.NMSBoxes(bbox,confs,confThreshold,nmsThreshold)

for i in indices:
i=i[0]
box=bbox[i]
x,y,w,h=box[0],box[1],box[2],box[3]

if classNames[classIds[i]].upper() == "NO-MASK":
g,b,r = 0,0,255
else:
g,b,r = 0,255,0

cv2.rectangle(img,(x,y),(x+w,y+w),(g,b,r),3)
cv2.putText(img, f'{classNames[classIds[i]].upper()} {int(confs[i] * 100)}%',
(x, y - 10), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (g,b,r), 2)

while True:
success,img=cap.read()
blob=cv2.dnn.blobFromImage(img,1/255,(whT,whT),[0,0,0],1,crop=False) #[img,scale factor,boyut,]
model.setInput(blob)

layerNames=model.getLayerNames()
outputLayers=[layerNames[i[0]-1] for i in model.getUnconnectedOutLayers()]
detectionLayers=model.forward(outputLayers)
findObject(detectionLayers,img)
#cv2.namedWindow("Mask Detection", cv2.WINDOW_NORMAL)
#cv2.flip(img,1)
cv2.imshow("Mask Detection",img)
k = cv2.waitKey(20) & 0xFF
if k == 27:
break

cv2.waitKey(50)

Filed Under: Machine Learning

Primary Sidebar

Stay Ahead: The Latest Tech News and Innovations

Cryptocurrency Market Updates: What’s Happening Now

Emerging Trends in Artificial Intelligence: What to Watch For

Top Cloud Computing Services to Secure Your Data

The Future of Mobile Technology: Recent Advancements and Predictions

Footer

  • Privacy Policy
  • Terms and Conditions

Copyright © 2025 NEO Share

Terms and Conditions - Privacy Policy