宁波企业网站制作要多少钱,高薪聘请网站开发工程师,广告联盟怎么加入,郑州做网站zzmshlDAMO-YOLO TinyNAS多目标跟踪#xff1a;DeepSORT算法集成实战 你是不是遇到过这样的场景#xff1f;用目标检测模型识别出了视频里的行人、车辆#xff0c;但画面一复杂#xff0c;目标一多#xff0c;就分不清谁是谁了。上一帧检测到的“红衣服行人”#xff0c;下一帧…DAMO-YOLO TinyNAS多目标跟踪DeepSORT算法集成实战你是不是遇到过这样的场景用目标检测模型识别出了视频里的行人、车辆但画面一复杂目标一多就分不清谁是谁了。上一帧检测到的“红衣服行人”下一帧可能就被识别成了另一个新目标跟踪完全断了线。这就是单纯目标检测的局限——它只能告诉你“这里有什么”却没法告诉你“这个东西从哪来、到哪去”。而多目标跟踪技术就是为了解决这个“身份连续”的问题。今天我们就来动手把目前速度与精度兼顾的佼佼者——DAMO-YOLO TinyNAS和经典的多目标跟踪算法DeepSORT“撮合”到一起打造一个既能实时检测又能稳定跟踪的实用系统。整个过程并不复杂我会带你一步步走通从理解原理到跑通代码最后还能根据自己的需求调调参数让跟踪效果更上一层楼。1. 先搞清楚我们要做什么检测与跟踪的强强联合在开始敲代码之前我们得先弄明白把DAMO-YOLO和DeepSORT结合起来到底能解决什么问题。想象一下交通路口的监控摄像头。如果只用检测模型每一帧画面都会独立地框出汽车和行人但你看不到某辆车是如何从左到右穿过马路的也看不出那个行人是不是在闯红灯。多目标跟踪的核心价值就是为每个检测到的目标分配一个唯一的ID并在后续帧中持续地“跟住”这个ID形成运动轨迹。DAMO-YOLO TinyNAS在这里扮演“火眼金睛”的角色。它基于神经架构搜索技术能在给定的计算资源下自动找到又快又准的网络结构。相比其他YOLO版本它在速度和精度之间取得了更好的平衡特别适合需要实时处理的视频流场景。你可以把它理解为一个效率极高的“侦察兵”能快速发现画面中的所有目标。DeepSORT则是“记忆大师”和“匹配专家”。它接收DAMO-YOLO侦察到的目标信息位置、大小然后做两件事第一利用卡尔曼滤波预测目标下一帧会在哪里出现第二通过外观特征比如用深度学习模型提取的行人衣着、体型特征和运动信息位置、速度进行匹配判断新一帧的哪个检测框对应上一帧的哪个老目标。这样即使目标被短暂遮挡或外观变化也能大概率找回正确的ID。我们的任务就是搭建一个管道Pipeline视频帧输入 → DAMO-YOLO检测 → DeepSORT跟踪 → 输出带ID和轨迹的画面。2. 动手前的准备工作理论明白了接下来我们得把“战场”布置好。这里假设你已经有基本的Python环境并且有一张支持CUDA的NVIDIA显卡没有的话用CPU也行就是慢点。2.1 环境搭建首先我们需要克隆DAMO-YOLO的官方代码库并安装其依赖。# 1. 克隆DAMO-YOLO仓库 git clone https://github.com/tinyvision/DAMO-YOLO.git cd DAMO-YOLO # 2. 创建并激活Python虚拟环境推荐 conda create -n damo-deepsort python3.8 -y conda activate damo-deepsort # 3. 安装PyTorch请根据你的CUDA版本调整 # 例如CUDA 11.3 pip install torch1.12.1cu113 torchvision0.13.1cu113 torchaudio0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113 # 4. 安装DAMO-YOLO的其他依赖 pip install -r requirements.txt # 5. 将当前目录加入Python路径 export PYTHONPATHpwd:$PYTHONPATH # Linux/Mac # 或者 set PYTHONPATH%cd%;%PYTHONPATH% # Windows cmd2.2 获取模型与DeepSORT代码DAMO-YOLO需要预训练权重DeepSORT则需要其本身的代码和用于提取外观特征的重识别ReID模型。# 进入项目目录 cd DAMO-YOLO # 下载一个DAMO-YOLO预训练模型例如小巧的TinyNAS-L25-S模型 # 你可以从官方Model Zoohttps://github.com/tinyvision/DAMO-YOLO#model-zoo找到下载链接 # 这里假设我们下载了 damoyolo_tinynasL25_S.pth放在项目根目录 # wget -O damoyolo_tinynasL25_S.pth 模型下载链接 # 接下来获取DeepSORT的核心代码。 # 我们可以使用一个流行的PyTorch实现版本。 git clone https://github.com/ZQPei/deep_sort_pytorch.git cd deep_sort_pytorch # 下载DeepSORT所需的ReID模型mars-small128.pb和检测文件 # 这个仓库通常自带或提供了下载脚本请查看其README。 # 例如可能需要运行 # wget https://drive.google.com/open?id1uSBXLJcOZOc1RGhVbXgxzvkgV-8X3Qiq -O deep_sort/deep/checkpoint/ckpt.t7 # 由于网络原因你可能需要手动寻找并下载 mars-small128.pb 文件放入 deep_sort/deep/checkpoint/ 目录 cd .. # 返回DAMO-YOLO根目录现在你的目录结构应该大致如下DAMO-YOLO/ ├── configs/ ├── tools/ ├── damo/ ├── deep_sort_pytorch/ # 刚克隆的DeepSORT代码 │ ├── deep_sort/ │ │ ├── deep/ │ │ │ └── checkpoint/ # 需要放入ReID模型文件 │ │ └── sort/ │ └── ... ├── damoyolo_tinynasL25_S.pth # 检测模型权重 └── ...3. 核心集成编写检测与跟踪的桥梁代码环境准备好了模型也下载了最关键的一步来了写一个脚本让DAMO-YOLO和DeepSORT能够对话。我们会在tools目录下创建一个新的脚本比如叫demo_track.py。这个脚本的主要逻辑是加载DAMO-YOLO检测模型。初始化DeepSORT跟踪器。循环读取视频帧。对每一帧用DAMO-YOLO检测目标。将检测结果转换成DeepSORT需要的格式并更新跟踪器。在画面上绘制带ID的检测框和轨迹。输出结果。下面是一个高度整合且可运行的示例代码框架# tools/demo_track.py import argparse import time import cv2 import torch import numpy as np from pathlib import Path import sys sys.path.insert(0, .) from damo.apis.detector_infer import Detector from deep_sort_pytorch.deep_sort import DeepSort from deep_sort_pytorch.utils.parser import get_config def main(): parser argparse.ArgumentParser() parser.add_argument(--video_path, typestr, default./assets/demo_video.mp4, helpsource video path) parser.add_argument(--det_config, typestr, default./configs/damoyolo_tinynasL25_S.py, helpdetector config file path) parser.add_argument(--det_checkpoint, typestr, default./damoyolo_tinynasL25_S.pth, helpdetector checkpoint path) parser.add_argument(--deep_sort_config, typestr, default./deep_sort_pytorch/configs/deep_sort.yaml) parser.add_argument(--output_path, typestr, default./output_track.mp4, helpoutput video path) parser.add_argument(--device, typestr, defaultcuda:0, helpcompute device, cuda:0 or cpu) parser.add_argument(--conf_threshold, typefloat, default0.5, helpdetection confidence threshold) parser.add_argument(--nms_threshold, typefloat, default0.5, helpNMS IoU threshold) parser.add_argument(--show_video, actionstore_true, helpdisplay video while processing) args parser.parse_args() # 1. 初始化DAMO-YOLO检测器 print(fLoading detector from {args.det_checkpoint}...) detector Detector(args.det_config, args.det_checkpoint, deviceargs.device) # 2. 初始化DeepSORT跟踪器 cfg get_config() cfg.merge_from_file(args.deep_sort_config) deepsort DeepSort( cfg.DEEPSORT.REID_CKPT, max_distcfg.DEEPSORT.MAX_DIST, min_confidencecfg.DEEPSORT.MIN_CONFIDENCE, nms_max_overlapcfg.DEEPSORT.NMS_MAX_OVERLAP, max_iou_distancecfg.DEEPSORT.MAX_IOU_DISTANCE, max_agecfg.DEEPSORT.MAX_AGE, n_initcfg.DEEPSORT.N_INIT, nn_budgetcfg.DEEPSORT.NN_BUDGET, use_cuda(args.device ! cpu) ) print(DeepSORT tracker initialized.) # 3. 打开视频文件 cap cv2.VideoCapture(args.video_path) if not cap.isOpened(): print(fError opening video file {args.video_path}) return # 获取视频属性用于创建输出视频 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)) fourcc cv2.VideoWriter_fourcc(*mp4v) out cv2.VideoWriter(args.output_path, fourcc, fps, (width, height)) frame_id 0 print(Start tracking...) while True: ret, frame cap.read() if not ret: break # 4. 使用DAMO-YOLO进行检测 # Detector的predict方法通常返回一个包含检测结果的字典或列表 # 具体格式需要参考DAMO-YOLO的API这里假设它返回(x1, y1, x2, y2, conf, cls)的列表 detections detector.predict(frame, confargs.conf_threshold) # 5. 将检测结果转换为DeepSORT需要的格式 [x1, y1, x2, y2, conf] # 注意这里需要根据DAMO-YOLO的实际输出进行调整并过滤掉不需要的类别如只跟踪人 bbox_xywh [] confidences [] for det in detections: # det 可能是 tensor 或 numpy array # 假设 det 格式为 [x1, y1, x2, y2, score, class_id] x1, y1, x2, y2, score, cls_id det[:6] # 假设我们只跟踪类别0人根据你的数据集调整 if int(cls_id) 0 and score args.conf_threshold: w x2 - x1 h y2 - y1 # DeepSORT 需要中心点坐标和宽高 bbox_xywh.append([(x1x2)/2, (y1y2)/2, w, h]) confidences.append(float(score)) if len(bbox_xywh) 0: bbox_xywh torch.Tensor(bbox_xywh) confidences torch.Tensor(confidences) # 6. 更新DeepSORT跟踪器 outputs deepsort.update(bbox_xywh, confidences, frame) # 7. 在帧上绘制跟踪结果 if len(outputs) 0: for j, output in enumerate(outputs): bbox output[:4] # x1, y1, x2, y2 id output[4] # 绘制边界框和ID cv2.rectangle(frame, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), (0, 255, 0), 2) cv2.putText(frame, fID:{int(id)}, (int(bbox[0]), int(bbox[1])-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2) else: # 如果没有检测到目标DeepSORT也会更新其内部状态 deepsort.update([], [], frame) # 显示帧可选 if args.show_video: cv2.imshow(Tracking, frame) if cv2.waitKey(1) 0xFF ord(q): break # 写入输出视频 out.write(frame) frame_id 1 if frame_id % 50 0: print(fProcessed {frame_id} frames.) cap.release() out.release() cv2.destroyAllWindows() print(fTracking finished. Result saved to {args.output_path}) if __name__ __main__: main()注意上面的代码是一个集成框架其中最关键的第4步detector.predict的返回格式和第5步数据转换需要你根据DAMO-YOLO实际提供的推理接口进行调整。你可能需要查阅damo.apis.detector_infer.Detector类的具体文档或源码看看它的输出到底是什么结构。4. 让跟踪效果更好关键参数调优指南代码跑起来能看到带ID的框在动这就算成功了一大半。但你可能发现有时候ID会跳变或者目标被遮挡后就跟丢了。别急我们可以通过调整一些“旋钮”来优化效果。这些参数主要在DeepSORT的配置文件中例如deep_sort_pytorch/configs/deep_sort.yaml。4.1 DeepSORT核心参数解析打开这个YAML文件你会看到类似下面的配置。我们来解读几个最重要的DEEPSORT: REID_CKPT: deep_sort/deep/checkpoint/ckpt.t7 # 外观特征模型路径 MAX_DIST: 0.2 # 外观特征匹配的最大距离阈值。值越小匹配要求越严格。 MIN_CONFIDENCE: 0.3 # 检测结果的最低置信度低于此值不送入跟踪器。 NMS_MAX_OVERLAP: 0.5 # 用于跟踪器内部检测框NMS的IoU阈值。 MAX_IOU_DISTANCE: 0.7 # 基于IoU匹配的最大距离阈值。用于关联预测框和检测框。 MAX_AGE: 70 # 一个跟踪轨迹在被删除前最多可以丢失多少帧。值越大抗遮挡能力越强但也更容易产生ID粘连。 N_INIT: 3 # 需要连续关联多少帧才将一个检测框初始化为新的跟踪轨迹。防止误检产生短暂轨迹。 NN_BUDGET: 100 # 为每个ID保存的外观特征向量的数量。用于计算平均特征值越大记忆越久但计算开销也大。4.2 调参实战建议场景拥挤ID频繁跳变这可能是外观相似目标太多匹配错了。可以尝试调低MAX_DIST比如从0.2调到0.15让外观匹配更严格。同时可以适当提高MIN_CONFIDENCE只把确信度高的检测框交给跟踪器减少噪声。目标被短暂遮挡后就跟丢可以增大MAX_AGE比如从70调到100给跟踪轨迹更长的“存活”时间等待目标重新出现。同时确保你的ReID模型质量较好能在目标重现时正确匹配。误检如晃动的树叶产生短暂的虚假轨迹增加N_INIT比如从3调到5要求目标必须被连续稳定地检测到更多帧才被认为是一个有效的跟踪目标。运动匹配与外观匹配的权衡MAX_IOU_DISTANCE控制基于运动预测的匹配。如果摄像头静止或目标运动规律可以依赖它。如果摄像头运动或目标运动复杂可以适当调低此值更多地依赖外观特征(MAX_DIST)。调参是一个观察-调整-再观察的过程。最好的方法是用一段有代表性的视频固定其他参数每次只调整一个观察效果变化记录下最适合你场景的组合。5. 试试效果看看还能怎么用运行我们写好的脚本看看效果吧conda activate damo-deepsort cd DAMO-YOLO python tools/demo_track.py \ --video_path ./your_video.mp4 \ --det_config ./configs/damoyolo_tinynasL25_S.py \ --det_checkpoint ./damoyolo_tinynasL25_S.pth \ --deep_sort_config ./deep_sort_pytorch/configs/deep_sort.yaml \ --output_path ./tracked_video.mp4 \ --device cuda:0 \ --conf_threshold 0.5 \ --show_video如果一切顺利你会得到一个tracked_video.mp4文件里面每个被跟踪的目标都有了自己独一无二的ID。这个技术组合的用武之地非常广智慧交通统计车流量、跟踪车辆轨迹分析行驶行为、检测违章。安防监控跟踪可疑人员活动路径、计算区域内人数。零售分析跟踪顾客在店内的移动轨迹分析热区。体育赛事自动跟踪运动员和球生成数据统计。6. 写在最后把DAMO-YOLO和DeepSORT集成起来其实思路很清晰一个负责精准快速地“看”一个负责聪明地“记”和“连”。整个过程从环境搭建到代码集成虽然会遇到一些细节上的小坑比如API接口对齐、模型文件下载但一步步拆解下来都是可以解决的。我建议你先用提供的代码框架跑通一个简单例子看到跟踪效果。然后再根据你的具体需求去微调。比如如果不是跟踪人而是跟踪车那么在第5步的数据转换那里就需要修改类别ID如果对实时性要求极高可以尝试更小的DAMO-YOLO模型如Nano系列或者将推理引擎转换为TensorRT。动手试试吧当你看到视频中那些被赋予连续ID并画出运动轨迹的目标时你会感受到多目标跟踪技术的魅力。它让冰冷的检测框“活”了起来为我们理解动态世界提供了更强大的工具。获取更多AI镜像想探索更多AI镜像和应用场景访问 CSDN星图镜像广场提供丰富的预置镜像覆盖大模型推理、图像生成、视频生成、模型微调等多个领域支持一键部署。