网站盈利模式设计,wordpress 获取数据,wordpress无法创建文件,wordpress 增大内存在ByteTrack被提出之前#xff0c;可以说DeepSORT是最好的目标跟踪算法之一。本文#xff0c;我们就来应用这个算法实现目标跟踪。
DeepSORT的官方网址是https://github.com/nwojke/deep_sort。但在这里#xff0c;我们不使用官方的代码#xff0c;而使用第三方代码#…在ByteTrack被提出之前可以说DeepSORT是最好的目标跟踪算法之一。本文我们就来应用这个算法实现目标跟踪。
DeepSORT的官方网址是https://github.com/nwojke/deep_sort。但在这里我们不使用官方的代码而使用第三方代码其网址为https://github.com/levan92/deep_sort_realtime。
下面我们就来应用DeepSORT。首先在虚拟环境内安装必要的软件包
conda install python3.8
pip install deep-sort-realtime可以看出DeepSORT算法只是需要几个常规的软件包numpy、scipy和opencv-python对用户十分友好。
使用DeepSORT也很方便先导入DeepSORT
from deep_sort_realtime.deepsort_tracker import DeepSort
实例化
tracker DeepSort()
DeepSort有一些输入参数在这里只介绍几个常用的参数
max_iou_distanceIoU的门控阈值大于该值的关联会被忽略默认值为0.7
max_age当遗漏次数大于该值时轨迹会被删除默认值为30
n_init在初始阶段轨迹被保留的帧数默认值为3
nms_max_overlap非最大值抑制阈值如果该值为1.0表示不使用非最大值抑制默认值为1.0
max_cosine_distance余弦距离阈值默认值为0.2
nn_budget外观描述符的最大尺寸int类型如果为None则不强制执行默认值为None
实现目标跟踪
tracks tracker.update_tracks(bbs, frameframe)
bbs为目标检测器的结果列表每个结果是一个元组形式为([left,top,w,h],置信值,类型)其中类型为字符串型
frame为帧图像
输出tracks为目标跟踪结果使用for循环可以得到各个目标的跟踪信息
for track in tracks:
下面介绍一些track的常用属性和方法
track_id目标ID
orginal_ltwh、det_conf、det_class分别表示目标边框信息、置信值和类型这三个值都是由tracker.update_tracks传入系统的原始目标的信息但此时已匹配上了目标ID
to_ltrb()和to_ltwh()得到目标边框信息两者的形式不同
is_confirmed()表示如果该目标ID被确认则返回True
下面我们就给出DeepSORT实现目标跟踪的完整程序在这里我们仍然使用YOLOv8作为目标检测器
import numpy as np
import cv2
from ultralytics import YOLO
from deep_sort_realtime.deepsort_tracker import DeepSortmodel YOLO(yolov8l.pt)cap cv2.VideoCapture(D:/track/Highway Traffic.mp4)
fps cap.get(cv2.CAP_PROP_FPS)
size (int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)))
fNUMS cap.get(cv2.CAP_PROP_FRAME_COUNT)
fourcc cv2.VideoWriter_fourcc(*mp4v)
videoWriter cv2.VideoWriter(D:/track/mytrack.mp4, fourcc, fps, size)tracker DeepSort(max_age5)def box_label(image, box, label, color(128, 128, 128), txt_color(255, 255, 255)):p1, p2 (int(box[0]), int(box[1])), (int(box[2]), int(box[3]))cv2.rectangle(image, p1, p2, color, thickness1, lineTypecv2.LINE_AA)if label:w, h cv2.getTextSize(label, 0, fontScale2 / 3, thickness1)[0] outside p1[1] - h 3p2 p1[0] w, p1[1] - h - 3 if outside else p1[1] h 3cv2.rectangle(image, p1, p2, color, -1, cv2.LINE_AA)cv2.putText(image,label, (p1[0], p1[1] - 2 if outside else p1[1] h 2),0, 2/3, txt_color, thickness1, lineTypecv2.LINE_AA)while cap.isOpened():success, frame cap.read()if success: results model(frame,conf0.4)outputs results[0].boxes.data.cpu().numpy()detections []if outputs is not None:for output in outputs:x1, y1, x2, y2 list(map(int, output[:4]))if output[5] 2:detections.append(([x1, y1, int(x2-x1), int(y2-y1)], output[4], car))elif output[5] 5:detections.append(([x1, y1, int(x2-x1), int(y2-y1)], output[4], bus))elif output[5] 7:detections.append(([x1, y1, int(x2-x1), int(y2-y1)], output[4], truck))tracks tracker.update_tracks(detections, frameframe)for track in tracks:if not track.is_confirmed():continuetrack_id track.track_idbbox track.to_ltrb()box_label(frame, bbox, #str(int(track_id)) track.det_class , (167, 146, 11))cv2.putText(frame, https://blog.csdn.net/zhaocj, (25, 50),cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 255), 2)cv2.imshow(YOLOv8 Tracking, frame)videoWriter.write(frame)if cv2.waitKey(1) 0xFF ord(q):breakelse:breakcap.release()
videoWriter.release()
cv2.destroyAllWindows()