1. Giriş
Nesne Takibi veya Object Tracking işlemi YOLOv8 teknolojisi ile oldukça yüksek doğruluklu bir biçimde gerçekleştirilebilmektedir. Nesne takibi işlemine başlamadan önce ilk olarak Ultralytics ve OpenCV kütüphanesini aşağıdaki komutlarla indirmelisiniz:
pip install ultralytics
pip install opencv-python
Çalışma boyunca kullanacağımız dosyaları blog yazımın başındaki bağlantıdan bilgisayarınıza indirebilirsiniz.
Şimdi dosya düzenini ayarlayalım. Boş bir klasör içerisinde object_tracking.py adında bir dosya oluşturalım. Ardından test videomuzuda yine aynı dizine koyalım. Çalışmada kullanacağımız model yolov8n.pt olacak. bunu dizine indirmemize gerek yok. object_tracking.py içerisinde bunu indirecek kodu yazacağız.
Tüm bu işlemler size karmaşık gelmeye başladıysa yukarıdaki videoyu da takip ederek yapabilirsiniz.
2. Nesne Takibi
Kodlarımızı yazmaya başlamak için object_tracking.py dosyamızı açıp kütüphaneleri ekleyelim:
import os
os.environ ["KMP_DUPLICATE_LIB_OK"] = "TRUE"
import cv2
import imutils
import numpy as np
from ultralytics import YOLO
from collections import defaultdict
Kütüphaneler hatasız bir şekilde eklendikten sonra video ve modeli okumalıyız:
video_path = "test.mp4"
cap = cv2.VideoCapture(video_path)
model_name = "yolov8n.pt"
model = YOLO(model_name)
Burada 2 değişken tanımlayacağız:
vehicle_id = 2
track_history = defaultdict(lambda: [])
vehicle_id değişkeni takibini yapacağımız sınıfı ifade ediyor. track_history ise takip kuyruğu oluşturmamızda yardımcı olacak. Artık bir while döngüsü kurarak videodaki görüntüleri tek tek işlemeye başlayabiliriz. Aşadıdaki kod bloğu videoki kareleri tek tek işler, araba sınıfındaki nesnelerin takibini gerçekleştirir:
while True:
ret, frame = cap.read()
if ret == False:
break
frame = imutils.resize(frame, width=1280) # pip install imutils
results = model.track(frame, persist=True, verbose=False)[0]
bboxes = np.array(results.boxes.data.tolist(), dtype="int") # 2.0 -> 2
for box in bboxes:
x1, y1, x2, y2, track_id, score, class_id = box
cx = int((x1+x2)/2)
cy = int((y1+y2)/2)
if class_id == vehicle_id:
cv2.rectangle(frame, (x1,y1), (x2,y2), (0,255,0), 2)
text = "ID:{} CAR".format(track_id)
cv2.putText(frame, text, (x1, y1-5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0,255,0), 2)
track = track_history[track_id]
track.append((cx, cy))
if len(track) > 15:
track.pop(0)
points = np.hstack(track).astype("int32").reshape((-1,1,2))
cv2.polylines(frame, [points], isClosed=False, color=(0,255,0), thickness=2)
cv2.imshow("Object Tracking", frame)
if cv2.waitKey(10) & 0xFF == ord("q"):
break
Bunun ardından çıkış kodu yazarak çalışmamızı tamamlayabiliriz:
cap.release()
cv2.destroyAllWindows()
3. Endüstriyel Uygulamalar
Bu blog yazısı, nesne takibi işleminin YOLOv8 ile nasıl yapıldığını sizlere anlatmak amacıyla oluşturulmuştur. Buna benzer çalışmaları geliştirmenizi ve benimle paylaşmanızı dört gözle bekliyorum.
Son olarak, burada paylaşılan kodlar temel seviyede çalışmaları ifade etmektedir. Endüstriyel çalışmalara uygun algoritmalar geliştirmek ve sorunlarınıza hızlı bir şekilde çözüm üretmek için iletişim formu üzerinden benimle iletişime geçebilirsiniz.
Hocam çok güzel bir yazı olmuş, başka bir yazınızda da nesne sayımı konusuna değinebilir misiniz ?
Merhabalar,
Nesne sayımı (object counting) ile ilgili yazımıza bu bağlantıdan göz atabilirsiniz: https://gorselanaliz.com/yolov8-ile-nesne-sayimi-object-counting/