5.18.9.1. bytetrack_tracker_controller

针对ByteTrack算法,通过处理检测的结果,实现对目标的跟踪。

5.18.9.1.1. __init__

接口形式:
def __init__(frame_rate:int = 30,
        track_buffer:int = 30)

参数说明:

  • frame_rate: int

输入参数。用于控制被追踪物体允许消失的最大帧数,数值越大则被追踪物体允许消失的最大帧数越大。

  • track_buffer: int

输入参数。用于控制被追踪物体允许消失的最大帧数,数值越大则被追踪物体允许消失的最大帧数越大。

5.18.9.1.2. process

处理接口。

接口形式1:
def process(detected_objects:list[list[int, float, float, float, float, float, float, float]],
        tracked_objects:list[list[int, float, float, float, float, float, float, float, int]])
            -> int

参数说明1:

  • detected_objects: list[list[int, float, float, float, float, float, float, float]]

输入参数。检测出的物体框。

  • tracked_objects: list[list[int, float, float, float, float, float, float, float, int]]

输出参数。被跟踪的物体。

返回值说明:

int

成功返回0,失败返回其他。

示例代码:
# The example code relies on sophon-demo/sample/YOLOv5/python/yolov5_opencv.py
import sophon.sail as sail
import cv2
import numpy as np
from python.yolov5_opencv import YOLOv5
class yolov5_arg:
    def __init__(self, bmodel, dev_id, conf_thresh, nms_thresh):
        self.bmodel = bmodel
        self.dev_id = dev_id
        self.conf_thresh = conf_thresh
        self.nms_thresh = nms_thresh
if __name__ == '__main__':
    input = "datasets/test_car_person_1080P.mp4"
    bmodel = "models/BM1684X/yolov5s_v6.1_3output_int8_1b.bmodel"
    dev_id = 0
    conf = 0.4
    nms = 0.7
    yolov5_args = yolov5_arg(bmodel, dev_id, conf, nms)
    yolov5 = YOLOv5(yolov5_args)

    cap = cv2.VideoCapture(input)
    img_batch = []
    btt = sail.bytetrack_tracker_controller()
    track_res_all = np.array([])

    for i in range(50):
        _, im = cap.read()
        if im is None:
            break
        img_batch.append(im)
        results = yolov5(img_batch)
        det = results[0]

        # The order of this API and the demo is inconsistent, and the class_id and score are reversed
        det[:, [4,5]] = det[:,[5,4]]
        det = tuple(det)
        img_batch.clear()

        det_tuple = [tuple(row) for row in det]

        # tuple(left, top, right, bottom, class_id, score, track_id)
        track_res = btt.process(det_tuple)
        track_res = np.array(track_res)
        if i == 0:
            track_res_all = track_res
        else:
            track_res_all = np.concatenate((track_res_all, track_res), axis=0)

    cap.release()