尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

YOLOv9与DeepSort目标跟踪实战:从原理到源码调优全解析

YOLOv9与DeepSort目标跟踪实战:从原理到源码调优全解析 简介本资源是一套基于YOLOv9与DeepSort融合架构的目标跟踪算法Python实现面向计算机视觉方向的初学者与进阶开发者适用于智能监控、交通流量分析、行为识别等实际应用场景。压缩包共8个文件包含核心跟踪脚本.py、Jupyter Notebook交互式演示.ipynb、模型配置.yml、类别定义.names、依赖清单.txt、说明文档.md及效果演示GIF总大小16.85MB结构清晰、开箱即用。已有594人学习下载体现了该方案在轻量化部署与多目标ID稳定追踪方面的实践热度。用户可直接运行object_tracking.py或YOLOv9_DeepSORT.ipynb完成视频/摄像头实时跟踪配套requirements.txt与conda.yml支持快速环境复现README.md详述参数调优与常见问题处理逻辑便于理解检测-外观特征提取-卡尔曼滤波-匈牙利匹配的全流程实现机制。1. 项目概述从静态检测到动态追踪的跨越最近在整理过往的项目资料翻出了之前做的一个目标跟踪Demo核心就是YOLOv9配合DeepSort。这个组合在业内其实挺经典的但每次重新梳理都能发现一些新的优化点和值得分享的实操细节。目标跟踪简单说就是不仅要在一帧图像里把目标“框”出来这是目标检测干的活还要在连续的视频帧中给同一个目标赋予一个唯一的ID并持续追踪它的运动轨迹。这听起来像是给每个目标发了一张“身份证”然后在人潮涌动的监控画面里始终能锁定它。YOLOv9作为YOLO系列的最新成员之一在检测精度和速度上做了不少优化而DeepSort则是多目标跟踪MOT领域久经考验的关联算法。把它们俩捏在一起就构成了一个从检测到跟踪的完整Pipeline。这个“python源码.zip”包里通常就包含了模型文件、核心算法脚本、依赖配置和示例让你能快速跑起来看到效果。无论是做安防监控的同行还是研究自动驾驶、智慧零售、体育分析的伙伴这个工具链都能提供一个扎实的起点。接下来我就把这个项目的里里外外拆开揉碎了讲清楚包括设计思路、代码关键模块、参数调优的坑以及怎么让它在你自己的场景里跑得更稳。2. 核心架构与工作流程拆解整个系统的运作可以理解为一个高效的“检测-关联”流水线。YOLOv9扮演着“火眼金睛”的角色负责在每一帧图像中快速、准确地找出所有感兴趣的目标并给出它们的边界框Bounding Box和类别置信度。而DeepSort则是一位“记忆大师”和“匹配专家”它的任务是将当前帧检测到的目标与之前帧已经跟踪的目标进行关联匹配维持ID的连续性并对丢失的目标进行短时预测。2.1 YOLOv9检测器更快更准的“侦察兵”YOLOv9的改进是这套系统性能的基石。相比前代它在网络结构上可能引入了更高效的梯度流路径设计比如传说中的PGI可编程梯度信息或者用了更轻量、更强的骨干网络。这些改进的核心目的就两个提升精度mAP和保证速度FPS。在跟踪任务里检测器的召回率Recall尤其重要。如果检测器“看漏了”目标那么跟踪器后续根本无从谈起。因此源码中通常会使用在COCO等大型数据集上预训练好的YOLOv9模型权重通常是.pt或.pth文件我们直接加载使用或者在自己的数据上进行微调Fine-tuning。在代码层面YOLOv9检测部分会封装成一个类比如叫YOLOv9Detector。它的核心工作流程是图像预处理将输入图像缩放到模型要求的固定尺寸如640x640并进行归一化。前向推理将预处理后的图像张量送入模型得到预测输出。后处理这是关键且容易出问题的一步。模型原始的输出包含大量冗余的预测框。需要通过非极大值抑制NMS来剔除那些重叠度高且置信度低的框。NMS有两个关键参数conf_threshold置信度阈值和iou_threshold交并比阈值。conf_threshold决定了多“确定”的检测结果才被保留设得太高会漏检太低则杂波多。iou_threshold决定了两个框多“重叠”时才被认为是同一个目标而需要剔除一个这个值直接影响同一个目标是否会被重复检测。注意在跟踪场景下conf_threshold不宜设得过高。因为跟踪算法如DeepSort本身具备一定的抗噪声和误检关联能力适当保留一些置信度稍低但可能是真实目标的检测框有助于在目标外观模糊、遮挡时维持跟踪链。我通常从0.25开始调试。2.2 DeepSort跟踪器稳健的“身份管家”DeepSort在经典SORT算法的基础上引入了外观特征Appearance Feature关联极大地解决了目标遮挡后ID切换ID Switch的问题。它的核心组件包括卡尔曼滤波Kalman Filter用于预测目标在下一帧的位置一个8维状态向量包含中心点坐标、宽高、以及它们在图像坐标系中的速度。它基于匀速运动模型对目标运动轨迹进行平滑和预测。匈牙利算法Hungarian Algorithm一个分配算法用于解决“当前帧的检测框”与“已有跟踪轨迹的预测框”之间的最优匹配问题。它要找到一个匹配方案使得所有匹配对的综合代价最小。深度外观描述符Deep Appearance Descriptor这是DeepSort的“灵魂”。它使用一个在大规模行人重识别ReID数据集上预训练的深度神经网络为每个检测到的目标提取一个高维特征向量比如128维或256维。这个向量编码了目标的外观信息。在匹配时除了计算预测框和检测框之间的IOU交并比距离还会计算它们外观特征之间的余弦距离。两者加权结合共同决定最终的匹配代价。在源码中DeepSort通常被封装成DeepSort或Tracker类。其单帧处理流程如下预测对所有已存在的跟踪轨迹使用卡尔曼滤波预测它们在当前帧的位置。匹配 a.第一次关联IOU匹配计算预测框与当前帧检测框的IOU距离矩阵。使用匈牙利算法进行匹配关联那些空间位置高度重合的目标。这步效率高能处理大部分简单情况。 b.第二次关联外观匹配对于第一次匹配中未匹配成功的检测框和轨迹计算它们的外观特征余弦距离矩阵再次使用匈牙利算法进行匹配。这步用于处理目标被短暂遮挡后 reappear重现的情况。轨迹管理 a.确认Confirm一个新检测框被成功匹配一定次数如连续3帧后其轨迹状态从“暂定Tentative”转为“确认Confirmed”并分配一个唯一的ID。 b.更新Update对于匹配成功的轨迹用对应的检测框信息位置、外观特征来更新卡尔曼滤波器的状态。 c.删除Delete如果一个已确认的轨迹连续多帧如max_age30未能匹配到任何检测框则认为目标已离开画面删除该轨迹。 d.暂定删除如果一个暂定轨迹在初始阶段未能连续匹配则直接删除。实操心得max_age最大丢失帧数这个参数非常关键。设得太小目标被短暂遮挡比如走过一棵树后ID就会变设得太大画面中会残留很多“幽灵”轨迹目标已离开但预测框还在飘。需要根据视频中目标的运动速度和可能被遮挡的时长来调整。对于室内人流可能设15-20对于交通路口可能设30-50。3. 源码结构解析与关键模块实现拿到“python源码.zip”后解压开来通常会看到类似下面的目录结构。我们以一个典型的、结构清晰的实现为例进行拆解yolov9_deepsort_project/ ├── README.md ├── requirements.txt ├── yolov9/ │ ├── models/ # YOLOv9模型定义文件.py │ ├── utils/ # 工具函数NMS、画图、指标计算等 │ └── weights/ # 存放下载的YOLOv9预训练权重.pt ├── deep_sort/ │ ├── deep_sort/ # DeepSort核心算法包 │ │ ├── deep_sort.py # 跟踪器主类 │ │ ├── kalman_filter.py │ │ ├── iou_matching.py │ │ ├── linear_assignment.py # 匈牙利算法实现 │ │ └── ... │ └── deep_sort_pytorch/ # 或 deep_sort_reid/ │ └── checkpoint/ # 存放外观特征提取模型权重.pth ├── detector.py # YOLOv9检测器封装类 ├── tracker.py # DeepSort跟踪器封装类或直接调用 ├── main.py # 主程序入口视频读取、处理、显示/保存 ├── utils.py # 项目通用工具函数 ├── configs/ # 配置文件目录可选但推荐 │ └── track_config.yaml ├── input_video.mp4 └── output/ └── output_video.avi3.1 检测器模块detector.py深度剖析这个文件是YOLOv9检测功能的封装。一个好的封装应该让调用者只需关心输入和输出。import cv2 import torch import numpy as np from yolov9.models.experimental import attempt_load from yolov9.utils.general import non_max_suppression, scale_coords class YOLOv9Detector: def __init__(self, weights_path, devicecuda:0, img_size640, conf_thres0.25, iou_thres0.45): 初始化检测器 Args: weights_path: YOLOv9模型权重文件路径 device: 计算设备cuda:0 或 cpu img_size: 模型输入图像尺寸 conf_thres: 置信度阈值 iou_thres: NMS的IOU阈值 self.device torch.device(device) self.img_size img_size self.conf_thres conf_thres self.iou_thres iou_thres # 加载模型 self.model attempt_load(weights_path, map_locationself.device) self.model.eval() # 设置为评估模式 # 获取类别名通常从模型元数据中获取假设为80类COCO self.names self.model.module.names if hasattr(self.model, module) else self.model.names def preprocess(self, img): 图像预处理缩放、填充、归一化、转Tensor # 原始图像尺寸 h0, w0 img.shape[:2] # 计算缩放比例 r min(self.img_size / h0, self.img_size / w0) new_h, new_w int(h0 * r), int(w0 * r) # 等比例缩放 img_resized cv2.resize(img, (new_w, new_h), interpolationcv2.INTER_LINEAR) # 创建画布将缩放后的图像放在左上角 canvas np.full((self.img_size, self.img_size, 3), 114, dtypenp.uint8) canvas[:new_h, :new_w, :] img_resized # 转换通道顺序 HWC - CHW并归一化到[0,1] img_tensor torch.from_numpy(canvas).permute(2, 0, 1).float() / 255.0 # 添加批次维度并送到设备上 img_tensor img_tensor.unsqueeze(0).to(self.device) return img_tensor, (h0, w0), (new_h, new_w) def detect(self, img): 执行检测 Args: img: 原始BGR格式的numpy图像 Returns: detections: list of [x1, y1, x2, y2, conf, cls] 在原图坐标下的检测结果 # 1. 预处理 img_tensor, (orig_h, orig_w), (new_h, new_w) self.preprocess(img) # 2. 前向推理 with torch.no_grad(): pred self.model(img_tensor)[0] # 获取预测结果 # 3. NMS后处理 pred non_max_suppression(pred, self.conf_thres, self.iou_thres, classesNone, agnosticFalse) detections [] # 4. 遍历批次中的每一张图这里批次大小为1 for det in pred: if det is not None and len(det): # 将检测框坐标从预处理后的画布尺寸映射回原始图像尺寸 det[:, :4] scale_coords(img_tensor.shape[2:], det[:, :4], (orig_h, orig_w)).round() for *xyxy, conf, cls in det: # 转换为list格式为[x1, y1, x2, y2, conf, cls_id] detections.append([int(xyxy[0]), int(xyxy[1]), int(xyxy[2]), int(xyxy[3]), float(conf), int(cls)]) return detections关键点解析attempt_load这是YOLO系列常用的一个智能加载函数能自动处理模型结构兼容不同版本的YOLO权重。scale_coords这是后处理中极易出错的一步。模型是在固定尺寸如640x640的画布上预测的但画布可能有填充padding。这个函数的作用就是将模型预测的坐标精确地映射回原始图像的坐标空间。如果映射错误检测框就会错位。返回格式detections列表中的每个元素其坐标(x1, y1, x2, y2)是原始图像上的绝对像素坐标。这个格式需要与DeepSort的输入要求对齐。3.2 跟踪器模块集成与主程序main.py流程主程序main.py是串联整个流程的“导演”。它需要读取视频流在每一帧中调用检测器获取目标框然后将这些框喂给跟踪器最后将跟踪结果可视化。import cv2 import argparse import time from detector import YOLOv9Detector # 假设DeepSort以包的形式导入 from deep_sort.deep_sort import DeepSort def main(args): # 初始化检测器 detector YOLOv9Detector( weights_pathargs.yolo_weights, deviceargs.device, img_sizeargs.img_size, conf_thresargs.conf_thres, iou_thresargs.iou_thres ) # 初始化DeepSort跟踪器 # 需要提供外观特征提取模型的配置文件路径和权重路径 tracker DeepSort( model_pathargs.deepsort_weights, max_distargs.max_dist, # 外观特征匹配的最大余弦距离阈值 min_confidenceargs.min_confidence, # 检测置信度阈值跟踪器会再用一次 nms_max_overlapargs.nms_max_overlap, # 跟踪器内部的NMS IOU阈值通常设为1.0即不进行二次NMS max_iou_distanceargs.max_iou_distance, # IOU匹配的最大距离阈值 max_ageargs.max_age, # 轨迹最大存活帧数丢失后仍保留 n_initargs.n_init # 新轨迹需要连续匹配多少次才能转为确认状态 ) # 打开视频文件或摄像头 cap cv2.VideoCapture(args.input_video if args.input_video else 0) # 获取视频属性用于创建输出视频 fps int(cap.get(cv2.CAP_PROP_FPS)) width int(cap.get(cv2.CAP_PROP_FRAME_WIDTH)) height int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT)) if args.output_video: fourcc cv2.VideoWriter_fourcc(*XVID) out cv2.VideoWriter(args.output_video, fourcc, fps, (width, height)) frame_id 0 print(开始处理视频...) while cap.isOpened(): ret, frame cap.read() if not ret: break frame_id 1 # 1. 目标检测 start_detect time.time() detections detector.detect(frame) # 得到 [[x1,y1,x2,y2,conf,cls], ...] end_detect time.time() # 2. 准备DeepSort输入格式 # DeepSort需要的是 numpy array of (x1, y1, x2, y2, confidence) # 同时我们可以根据类别进行过滤例如只跟踪“人”COCO类别0 bbox_xyxy [] confidences [] for det in detections: x1, y1, x2, y2, conf, cls_id det if cls_id 0: # 只跟踪人可根据需要修改 bbox_xyxy.append([x1, y1, x2, y2]) confidences.append(conf) if len(bbox_xyxy) 0: bbox_xyxy np.array(bbox_xyxy) confidences np.array(confidences) # 3. 目标跟踪 start_track time.time() tracks tracker.update(bbox_xyxy, confidences, frame) # 注意这里传入了原始帧用于提取外观特征 end_track time.time() # 4. 可视化结果 for track in tracks: if not track.is_confirmed(): continue track_id track.track_id ltrb track.to_ltrb() # 获取跟踪框 [left, top, right, bottom] x1, y1, x2, y2 map(int, ltrb) # 画框 cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 0), 2) # 画ID标签 label fID:{track_id} (label_width, label_height), baseline cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2) cv2.rectangle(frame, (x1, y1-label_height-baseline), (x1label_width, y1), (0, 255, 0), -1) cv2.putText(frame, label, (x1, y1-baseline), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 2) # 显示处理耗时 detect_time (end_detect - start_detect) * 1000 track_time (end_track - start_track) * 1000 if end_track in locals() else 0 cv2.putText(frame, fDetect: {detect_time:.1f}ms, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) cv2.putText(frame, fTrack: {track_time:.1f}ms, (10, 60), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2) # 显示或保存帧 if args.show_video: cv2.imshow(YOLOv9DeepSort Tracking, frame) if cv2.waitKey(1) 0xFF ord(q): break if args.output_video: out.write(frame) # 释放资源 cap.release() if args.output_video: out.release() cv2.destroyAllWindows() print(处理完成。) if __name__ __main__: parser argparse.ArgumentParser() parser.add_argument(--input_video, typestr, default, help输入视频路径默认为摄像头) parser.add_argument(--output_video, typestr, defaultoutput.avi, help输出视频路径) parser.add_argument(--yolo_weights, typestr, defaultyolov9/weights/yolov9-c.pt, helpYOLOv9权重路径) parser.add_argument(--deepsort_weights, typestr, defaultdeep_sort/deep_sort_pytorch/checkpoint/ckpt.t7, helpDeepSort外观特征模型权重路径) parser.add_argument(--device, typestr, defaultcuda:0, help计算设备 cuda:0 or cpu) parser.add_argument(--img_size, typeint, default640, help模型输入图像尺寸) parser.add_argument(--conf_thres, typefloat, default0.25, help检测置信度阈值) parser.add_argument(--iou_thres, typefloat, default0.45, help检测NMS IOU阈值) parser.add_argument(--max_dist, typefloat, default0.2, help外观特征匹配最大余弦距离) parser.add_argument(--max_iou_distance, typefloat, default0.7, helpIOU匹配最大距离) parser.add_argument(--max_age, typeint, default30, help轨迹最大存活帧数) parser.add_argument(--n_init, typeint, default3, help新轨迹确认所需连续匹配帧数) parser.add_argument(--show_video, actionstore_true, help是否实时显示视频) args parser.parse_args() main(args)流程与参数详解初始化分别加载YOLOv9和DeepSort模型。注意DeepSort需要两个模型一个是跟踪逻辑本身另一个是独立的外观特征提取网络通常是一个ReID网络其权重通过model_path指定。检测过滤在将检测框送入跟踪器前我通常会根据类别ID进行一次过滤例如if cls_id 0:。这可以避免将车辆、动物等非目标物体纳入跟踪减少计算负担和干扰。这是源码中一个常见的优化点。跟踪器更新tracker.update()是核心调用。它接收当前帧的检测框、置信度和原始图像。内部会执行预测、匹配、更新轨迹状态等一系列操作。特别注意frame参数是必须的因为DeepSort需要从原始图像中裁剪出目标区域送入ReID网络提取外观特征。可视化遍历tracks只绘制状态为“确认Confirmed”的轨迹。track.to_ltrb()获取的是跟踪器预测/更新后的边界框可能比原始检测框更平滑。4. 关键参数调优与性能优化实战一套源码能跑起来只是第一步要想在不同的场景下如室内低光照、交通路口高速运动、密集人群都取得良好效果参数调优至关重要。下面我结合自己的踩坑经验梳理出一张核心参数调优表参数模块参数名默认值/建议范围作用与影响调优策略YOLOv9检测conf_thres0.25检测置信度阈值。高于此值的检测框才被保留。场景简单、目标清晰可适当调高0.4-0.5减少误检。场景复杂、目标小/模糊需调低0.15-0.25提高召回率避免漏检。跟踪器能处理部分低置信度误检。iou_thres0.45NMS的IOU阈值。用于合并重叠框。通常0.4-0.5即可。目标密集时如人群可略微调低如0.3防止一个目标被多个框覆盖导致跟踪混乱。目标稀疏时可调高。img_size640输入模型的图像尺寸。尺寸越大检测精度通常越高但速度越慢。在GPU允许下可尝试增大如1280以提升小目标检测能力。实时性要求高时可降低如416但会损失精度。DeepSort跟踪max_dist0.2外观特征余弦距离阈值。小于此值才可能匹配。目标外观变化小如固定工服可调低0.15匹配更严格。目标外观变化大如行人多角度、遮挡需调高0.3-0.4允许更大的外观差异。太高会导致ID切换频繁。max_iou_distance0.7IOU匹配的距离阈值。1-IOU作为距离。通常0.5-0.8。目标运动平缓、重叠少可调高0.8优先依赖位置匹配。目标快速运动或频繁交叉可调低0.5降低位置匹配权重让外观匹配发挥更大作用。max_age30轨迹最大丢失帧数。目标短暂遮挡常见如走过柱子需调高40-60给目标重现留出时间。场景干净、目标离开即消失可调低15-25及时清理轨迹避免“幽灵框”。这是影响ID稳定性最关键的参数之一。n_init3新轨迹确认所需连续匹配帧数。防止短暂噪声被误认为新目标。场景噪声多如树叶晃动可调高5。需要快速响应新目标可调低2。但过低会增加误跟踪风险。整体性能设备选择cuda:0计算设备。务必确认CUDA和PyTorch版本匹配。使用torch.cuda.is_available()检查。GPU内存不足时可减小img_size或批次大小。性能优化技巧推理加速对于YOLOv9可以使用TensorRT或ONNX Runtime进行模型转换和加速能显著提升FPS。PyTorch自身的torch.jit.trace也能带来一定优化。视频流读取优化使用cv2.VideoCapture时对于高分辨率视频可以尝试跳帧如每2帧处理1帧或降低解码分辨率来平衡实时性和精度。批量处理Batch Processing如果处理的是离线视频可以考虑将多帧图像组成一个批次batch送入检测模型充分利用GPU的并行计算能力大幅提升平均处理速度。但需要注意跟踪算法的因果性批次内帧的顺序需严格保持。选择性特征提取DeepSort的外观特征提取是计算瓶颈。可以只为那些在第一次IOU匹配中未匹配成功的检测框和轨迹计算外观特征减少计算量。5. 常见问题排查与实战避坑指南即使代码和参数都配置好了在实际运行中还是会遇到各种“妖魔鬼怪”。下面是我总结的一些典型问题及解决方法。5.1 检测框漂移或错位症状跟踪框不贴合目标或者在画面边缘严重偏移。根因几乎都是坐标映射错误。问题出在detector.detect()函数中的scale_coords步骤或者预处理时填充padding方式不对。排查在detect函数中在处理完一帧后将原始的det模型原始输出和映射后的detections同时打印出来对比坐标值。检查缩放比例r和填充位置计算是否正确。在main.py中在调用tracker.update之前先将检测框用绿色画在原始帧上并显示看是否准确框住了目标。解决确保你的预处理preprocess函数和scale_coords函数与所使用的YOLOv9版本官方代码保持一致。不要自己随意写缩放逻辑。5.2 ID频繁切换ID Switch症状同一个目标其ID在短时间内频繁变化。根因这是多目标跟踪的核心挑战。主要原因有1)外观特征区分度不够max_dist设得太高2)目标间交互频繁如人群拥挤、车辆并线导致IOU匹配混乱3)检测器漏检或误检。排查与解决调整匹配阈值尝试降低max_dist如从0.2调到0.15让外观匹配更严格。同时可以适当降低max_iou_distance如从0.7调到0.5在目标交叉时更依赖外观信息。优化检测器这是根本。确保检测器在复杂场景下的稳定性。可以尝试使用更大、更准的YOLOv9模型如YOLOv9-e或者在自己的数据上进行微调。引入运动模型约束DeepSort的卡尔曼滤波是匀速模型。对于高速非线性运动的目标如突然转弯的行人预测不准会导致匹配失败。可以考虑使用更复杂的运动模型如恒定转向率和速度模型但这会大幅增加复杂度。5.3 跟踪框滞后或“鬼影”症状目标已经停止或转向但跟踪框还朝着原方向移动一段距离或者目标已离开画面跟踪框还在原地停留多帧。根因max_age参数设置过大。卡尔曼滤波的预测在目标丢失后仍在继续而max_age设置过长导致这些“幽灵”轨迹被保留太久。解决根据目标在画面中的典型停留时间和运动速度减小max_age值。例如对于步行行人如果视频是30FPS目标穿过画面大约需要100帧那么max_age设为20-30帧是合理的。如果目标移动很快这个值应该更小。5.4 运行速度慢无法实时症状FPS远低于视频帧率处理卡顿。根因计算瓶颈通常在两个地方YOLOv9检测和DeepSort的外观特征提取。排查与解决性能分析使用Python的cProfile模块或简单的time.time()在代码中打点精确测量detect()和tracker.update()中特征提取部分的耗时。降低输入分辨率将img_size从640降到416或320这是提升速度最直接有效的方法但会牺牲小目标检测精度。使用更轻量模型换用YOLOv9更小的变体如YOLOv9-tiny。优化特征提取如前所述采用选择性特征提取。或者可以考虑使用更轻量级的ReID网络。硬件与后端确保代码在GPU上运行devicecuda:0并考虑使用TensorRT进行模型加速。5.5 依赖环境配置失败症状ImportErrorCUDA error 或版本冲突。根因Python环境、PyTorch版本、CUDA版本、OpenCV版本等不兼容。标准解决流程创建纯净虚拟环境使用conda create -n tracking python3.8推荐3.8或3.9兼容性好。根据CUDA版本安装PyTorch去PyTorch官网使用对应的命令安装。例如CUDA 11.7pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu117。逐一安装其他依赖按照项目requirements.txt安装如果遇到问题可以尝试先安装opencv-python,numpy,scipy等基础包。验证DeepSort子模块有些源码包中的deep_sort文件夹可能是一个git子模块。如果它是空的你需要手动从原仓库如https://github.com/ZQPei/deep_sort_pytorch克隆代码并放置到对应目录或者直接下载ZIP包解压进去。这套YOLOv9DeepSort的源码提供了一个非常强大的目标跟踪基线。它的价值在于清晰的模块化设计让你可以轻松地替换其中的组件——比如把YOLOv9换成更快的YOLOv10或者更准的DETR或者把DeepSort换成ByteTrack、OC-SORT等更先进的跟踪器。理解每一行代码背后的逻辑掌握每个参数的含义你就能真正驾驭它让它为你的具体应用场景服务。本文还有配套的精品资源点击获取
返回列表