VOT + YOLO & BOT-SORT: Bewertung von Multi-Object-Tracker auf Einzelobjekt-Benchmark-Code stoppt nach 2 FramesPython

Python-Programme
Anonymous
 VOT + YOLO & BOT-SORT: Bewertung von Multi-Object-Tracker auf Einzelobjekt-Benchmark-Code stoppt nach 2 Frames

Post by Anonymous »

Ich versuche, einen Multi-Objekt-Tracker auf einem Einzel-Objekt-Tracking-Benchmark auf Python zu bewerten. Mein Ansatz besteht darin, die Ziel -ID aus dem Begrenzungsfeld im ersten Frame auszuwählen, der am besten mit dem anfänglichen Begrenzungsfeld im ersten Frame übereinstimmt. Ich verwende dafür eine Get_Best_Match () -Funktion. Da Yolo möglicherweise mit kleinen oder nicht lernenden Objekten zu kämpfen hat, teste ich speziell auf Videosequenzen, in denen YOLO das Ziel erfasst.

Code: Select all

import numpy as np

import vot
import sys
import cv2

from ultralytics import YOLO

def iou(box_a, box_b):
# Compute intersection-over-union for two boxes [x1, y1, x2, y2]
x_a = max(box_a[0], box_b[0])
y_a = max(box_a[1], box_b[1])
x_b = min(box_a[2], box_b[2])
y_b = min(box_a[3], box_b[3])
interArea = max(0, x_b - x_a) * max(0, y_b - y_a)
boxAArea = (box_a[2] - box_a[0]) * (box_a[3] - box_a[1])
boxBArea = (box_b[2] - box_b[0]) * (box_b[3] - box_b[1])
IoU = interArea / float(boxAArea + boxBArea - interArea)
return IoU

def get_best_match(selection_box, boxes):
# selection_box: [x1, y1, x2, y2]
# boxes: iterable of box objects with .xyxy attribute
max_iou = 0
best_id = None
best_box = None
for box in boxes:
box_xyxy = box.xyxy.cpu().numpy().tolist()[0]
iou_score = iou(selection_box, box_xyxy)
if iou_score > max_iou:
max_iou = iou_score
best_id = int(box.id.item()) if box.id is not None else None
best_box = box
if max_iou == 0 and len(boxes) > 0:
# Fallback: pick closest box by center
sel_cx = (selection_box[0] + selection_box[2]) / 2
sel_cy = (selection_box[1] + selection_box[3]) / 2
min_dist = float('inf')
for box in boxes:
box_xyxy = box.xyxy.cpu().numpy().tolist()[0]
bx = (box_xyxy[0] + box_xyxy[2]) / 2
by = (box_xyxy[1] + box_xyxy[3]) / 2
dist = (sel_cx - bx) ** 2 + (sel_cy - by) ** 2
if dist < min_dist:
min_dist = dist
best_id = int(box.id.item()) if box.id is not None else None
best_box = box
return best_id, best_box

detector = YOLO('/home/uuu/jupyter_projects/MyProjects/baka/yolo11n.pt')

handle = vot.VOT("rectangle")
selection = handle.region()
selection_box = [selection.x, selection.y, selection.x + selection.width, selection.y + selection.height]

max_iou = 0
target_id = None
score = 0
x1, y1, x2, y2 = 0, 0, 0, 0

results = detector.track(handle.frame(), tracker='botsort.yaml', stream=True, persist=True)

for result in results:
boxes = result.boxes
try:
if target_id is None:
for box in boxes:
target_id, _ = get_best_match(selection_box, boxes)
if target_id is None:
print("Target ID not found -_-")
handle.report(vot.Rectangle(0, 0, 0, 0), 0.0)

found = False
for box in boxes:
curr_id = int(box.id.item()) if box.id is not None else None
if curr_id == target_id:
box_xyxy = box.xyxy.cpu().numpy().tolist()[0]
x1, y1, x2, y2 = map(int, box_xyxy)
score = float(box.conf.item())
found = True
break

if found:
handle.report(vot.Rectangle(x1, y1, x2 - x1, y2 - y1), score)
else:
handle.report(vot.Rectangle(0, 0, 0, 0), 0.0)

except Exception as e:
# Always respond, even if something goes wrong
handle.report(vot.Rectangle(0, 0, 0, 0), 0.0)
print(f"Error: {e}", file=sys.stderr)
Die Ausgabe:

Ideen, wie ich herausfinden kann, warum mein Code nach dem zweiten Rahmen stoppt? Oder wenn Sie offensichtliche Fehler in meinem Code sehen, lassen Sie es mich bitte wissen. Das Problem, mit dem ich konfrontiert war, war zu verstehen>

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post