Как получить классы вместе с идентификаторами при использовании yolov8+SORT для обнаружения и отслеживания объектов?

Я новичок в йоло и СОРТИРОВКЕ. Я пытаюсь определить, сколько людей не имеют этих защитных средств. Но простое использование yolo выдаст выходные данные для каждого кадра и не будет отслеживать людей. Затем я попробовал реализовать SORT, но теперь застрял в том, как определять классы идентификаторов, обнаруженных SORT. Я попытался сохранить массив классов, а затем выполнить итерацию по результатам сортировки, но классы не были в одинаковом расположении до и после обработки сортировкой.

      class_names = ['Hardhat', 'Mask', 'NO-Hardhat', 'NO-Mask', 'NO-Safety Vest', 'Person', 'Safety Cone', 'Safety Vest', 'machinery', 'vehicle']

def process_video(video_path: str, model: YOLO):
    tracker = Sort(max_age=2000,min_hits= 3,iou_threshold=0.01)
    cap = cv2.VideoCapture(video_path)
    
    while True:
        # read a frame from the video
        ret, img = cap.read()
        if not ret:
            break

        # process the frame with YOLO
        results = model(img, stream=True)

        detections = np.empty((0,5))
        for r in results:
            boxes = r.boxes
            i = 0
            for box in boxes:
                x1, y1, x2, y2 = box.xyxy[0]
                x1, y1, x2, y2 = int(x1), int(y1), int(x2), int(y2)
                w,h = x2-x1 , y2-y1
                # getting confidence level
                conf = math.ceil((box.conf[0] * 100))
                # class names
                cls = class_names[int(box.cls[0])]
                if cls in ['Person','NO-Hardhat', 'NO-Mask', 'NO-Safety Vest']:
                    currentArray = np.array([x1,y1,x2,y2,conf])  #check conf[0]
                    detections = np.vstack((detections,currentArray))
        resultsTracker = tracker.update(detections)

        for result in resultsTracker:
                x1, y1, x2, y2, id = result
                x1, y1, x2, y2, id = int(x1), int(y1), int(x2), int(y2), int(id)
                (text_width, text_height), _ = cv2.getTextSize(f'{id}', cv2.FONT_HERSHEY_PLAIN, fontScale=0.5, thickness=1)
                text_offset_x = x1
                text_offset_y = y1 - text_height
                cv2.rectangle(img,(x1,y1),(x2,y2),(000,000,255),1)
                cv2.putText(img, f'{id} ', (text_offset_x, text_offset_y+6), cv2.FONT_HERSHEY_PLAIN, fontScale=0.5, color=(255, 255, 255), thickness=1)
  
    
        cv2.imshow('video',img)
        if cv2.waitKey(1) & 0xFF == ord('q'): # press 'q' to quit
            break
        elif cv2.waitKey(0):
            pass
    cap.release()
    cv2.destroyAllWindows()

Поправьте меня, если мой подход покажется неправильным. Любые предложения приветствуются. Спасибо

1 ответ

Вы пробовали использоватьmodel.track()вместоmodel()? Это означает, что вам не нужно управлять самим отслеживанием, и YOLOv8 сделает это за вас. Таким образом, вместо того, чтобы сопоставлять два списка, вы можете отслеживать и классифицировать результаты из одного списка. См. https://docs.ultralytics.com/modes/track/#tracking .

Другие вопросы по тегам