【目标跟踪】DeepSORT

DeepSort(Deep Simple Online and Realtime Tracking)是一种基于深度学习的多目标追踪(Multi-Object Tracking, MOT)算法,在准确性和实时性之间取得了良好的平衡,适用于各种场景下的多目标跟踪任务。

论文链接:https://arxiv.org/pdf/1703.07402

代码链接:https://github.com/MuhammadMoinFaisal/YOLOv7-DeepSORT-Object-Tracking

之前的SORT算法使用简单的kalman滤波处理逐帧数据的关联性,使用匈牙利算法进行关联度量。但由于SORT忽略了被检物体的表面特征,因此SORT算法只适用于遮挡情况少的、运动比较稳定的对象。

在DeepSORT中,使用更加可靠的度量代替关联度量,并使用CNN网络在大规模行人数据集上训练,提取外观特征,增加网络对目标遗失和遮挡的鲁棒性。

一. 具体实现

流程如下图所示。

其中

max_dist :余弦距离的最大阈值(越相似,值越小);

min_confidence: 置信度的最小阈值;

nms_max_overlap: 非极大值抑制;

max

### DeepSort 目标跟踪实现方法 #### 选择合适的环境配置 为了成功运行DeepSort,建议在一个稳定的Python环境中操作。通常推荐使用Anaconda创建虚拟环境并安装必要的依赖库[^1]。 #### 安装所需软件包 根据具体需求,在Ubuntu系统上部署DeepSort目标跟踪算法前,需确保已经安装了诸如PyTorch、CUDA等相关工具链以及OpenCV等计算机视觉库。对于YOLOv5+DeepSort组合而言,还需特别注意两者版本兼容性问题[^3]。 #### 准备数据集与预训练模型 获取适当的数据集用于测试非常重要;同时下载官方提供的或者自己训练好的YOLOv5权重文件作为物体检测的基础。此外,还需要准备或训练一个能够有效提取行人外观特征的Re-ID网络模型以供DeepSort调用[^4]。 #### 修改参数设置 调整`max_cosine_distance`, `nn_budget` 和 `nms_max_overlap`这些超参可以帮助优化性能表现。比如降低最大余弦距离阈值可以让匹配更加严格从而减少误关联情况发生;而合理设定神经网络预算(nn_budget)则有助于控制内存消耗[^2]。 #### 编写主程序逻辑 编写一段脚本读取视频流输入并通过循环帧处理的方式依次执行如下步骤: - 使用YOLOv5进行当前帧内的所有感兴趣区域(ROI)定位; - 对于每一个被检出的对象框利用预先加载的人脸识别或其他形式的身份验证机制计算其对应的特征向量; - 调用DeepSort模块完成现有轨迹更新及新出现个体初始化工作; 最后将带有标注信息的画面输出显示出来以便观察实际效果。 ```python from deep_sort import nn_matching, preprocessing from deep_sort.tracker import Tracker import numpy as np import cv2 def create_tracker(): metric = nn_matching.NearestNeighborDistanceMetric( "cosine", max_cosine_distance=0.2, budget=None) tracker = Tracker(metric) return tracker video_capture = cv2.VideoCapture('test.mp4') tracker = create_tracker() while True: ret, frame = video_capture.read() # 假设detections是从YOLOv5得到的结果列表[(left,top,w,h),...] detections = ... features = encoder(frame, detections) detection_list = [] for i in range(len(detections)): detection_list.append(Detection(detections[i], scores[i], features[i])) tracker.predict() matches = tracker.update(detection_list) for track in tracker.tracks: if not track.is_confirmed() or track.time_since_update > 1: continue bbox = track.to_tlbr() id_num = str(track.track_id) cv2.rectangle(frame, (int(bbox[0]), int(bbox[1])), ( int(bbox[2]), int(bbox[3])), (255, 255, 255), 2) cv2.putText(frame, str(id_num), (int( bbox[0]), int(bbox[1])), 0, 5e-3 * 200, (0, 255, 0), 2) cv2.imshow('', frame) if cv2.waitKey(1) & 0xFF == ord('q'): break video_capture.release() cv2.destroyAllWindows() ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值