FEATURED · 精选文章

基于YOLOv5与DeepSORT的无人机目标检测与轨迹跟踪实战

发布时间 / 2026/8/27 7:17:40
来源 / 创域科博编辑部
栏目 / 资讯中心
基于YOLOv5与DeepSORT的无人机目标检测与轨迹跟踪实战 简介目标检测与多目标跟踪是计算机视觉领域的核心基础技术它们构成了智能视频分析系统的基石。目标检测负责在图像中定位并识别出感兴趣的物体而多目标跟踪则在此基础上通过数据关联算法为每个目标分配唯一ID并在连续帧中维持其身份从而形成连续的运动轨迹。这项技术的核心价值在于将静态的“看见”升级为动态的“理解”为行为分析、态势感知和决策支持提供了数据基础。其应用场景广泛从安防监控、交通流量统计到智慧城市管理都离不开稳定可靠的目标跟踪能力。本文聚焦于工程实践中广泛采用的YOLOv5DeepSORT技术栈深入探讨了如何将高效的目标检测与鲁棒的多目标跟踪相结合并针对无人机这一特殊视角提供了从环境搭建、代码实现到参数调优的全流程实战指南旨在解决目标遮挡、ID切换和实时性等工程挑战。1. 项目概述当无人机“看见”并“记住”目标最近在做一个挺有意思的项目核心就一句话让无人机不仅能实时“看见”画面里的目标还能“记住”它并把它运动的“足迹”给画出来。听起来像是给无人机装上了一双会思考的眼睛和一个不会忘事的脑子。这个项目的技术骨架就是标题里的DeepSORT-YOLOv5组合拳。简单拆解一下YOLOv5负责“看见”也就是目标检测。它像是一个反应极快的哨兵能在视频流的每一帧里瞬间找出所有我们关心的物体比如人、车、特定型号的无人机并给出它们的位置框。但光有“看见”还不够帧与帧之间目标可能移动、被遮挡、或者多个目标交错如何确定上一帧的“张三”就是这一帧的“张三”而不是“李四”这就需要DeepSORT出场了。它负责“记住”和“关联”通过外观特征和运动轨迹的匹配为每个目标分配一个唯一的ID并跨帧追踪形成连续的运动轨迹。最后可视化目标运动轨迹就是把这一系列的位置点在视频画面上用平滑的线条连接起来直观地展示目标从哪里来到哪里去。这个技术栈组合在安防监控、交通流量分析、智慧园区管理乃至体育赛事分析等领域都有非常实在的应用场景。比如在大型活动现场你可以用它自动统计不同区域的人流密度和移动趋势在交通路口可以分析车辆的行驶轨迹和违规行为在特定区域还能用于无人机的入侵检测与跟踪。我选择这个组合进行实现主要是看中YOLOv5在精度和速度上优秀的平衡性以及DeepSORT在多目标跟踪领域的成熟度和稳定性两者结合能快速搭建一个效果可观、便于二次开发的基线系统。2. 核心思路与方案选型为什么是YOLOv5DeepSORT在动手之前方案选型是决定项目成败和后期维护难易度的关键。目标检测和目标跟踪的算法浩如烟海为什么偏偏是这对组合这背后是一系列工程化的权衡。2.1 检测器选型YOLOv5的工程化优势目标检测是跟踪的基石检测器的性能直接决定了跟踪系统的上限。我对比过几种主流方案两阶段检测器如Faster R-CNN精度通常很高但速度慢难以满足无人机机载设备或地面站对实时性的要求通常需要25 FPS。其他单阶段检测器如SSD, RetinaNet速度有提升但在精度和速度的平衡上社区支持和易用性方面综合来看不如YOLOv5。YOLOv5它吸引我的点非常明确极高的工程友好度PyTorch框架代码结构清晰从数据准备、模型训练到模型导出ONNX, TensorRT等的链条非常完整文档和社区资源极其丰富。这对于快速原型开发和问题排查至关重要。优秀的精度-速度权衡提供了n/s/m/l/x多个尺度的预训练模型你可以根据硬件算力比如是服务器GPU、边缘计算盒子还是嵌入式设备灵活选择。对于无人机场景通常选择YOLOv5s或YOLOv5m在保证一定精度的前提下追求更高帧率。强大的数据增强与训练工具内置了Mosaic数据增强、自动锚框计算等“黑科技”大大降低了从头训练模型的难度和所需数据量。对于无人机视角这种可能存在独特角度、尺度的数据这些工具非常有用。注意虽然已有更新的YOLOv8、v9等版本但YOLOv5的生态成熟度、稳定性以及在各种边缘设备上的部署案例目前仍然是最丰富的。对于一个要求稳定、可复现的项目来说成熟有时比“最新”更重要。当然核心思路是相通的掌握了v5迁移到v8也不难。2.2 跟踪器选型DeepSORT的可靠性与可解释性目标跟踪算法主要分为基于检测的跟踪Tracking-by-Detection和联合检测跟踪JDT两类。DeepSORT属于前者也是目前工业界应用最广泛的范式之一。它的前身是SORTSimple Online and Realtime Tracking一个非常简洁高效的算法但SORT只用了卡尔曼滤波预测运动轨迹和匈牙利算法做IOU匹配在目标遮挡后容易ID切换ID Switch。DeepSORT的“Deep”就体现在这里它引入了一个深度学习的外观特征提取器通常是一个在行人重识别数据集上预训练的小型CNN网络。在匹配时它不仅考虑目标框的位置重叠度运动模型还考虑目标的外观相似度外观模型。这带来了两大好处减轻遮挡导致的ID切换即使目标被短暂遮挡重新出现时只要外观特征匹配度高依然能关联回原来的ID。可解释性强整个跟踪过程可以分解为“运动匹配”和“外观匹配”两个可量化的部分出问题时容易定位是检测不准还是特征提取不好或是匹配阈值设置不合理。相比于一些端到端的JDT模型如FairMOT, ByteTrackDeepSORT模块化更清晰允许你单独优化检测器或特征提取器调试自由度更高这也是我选择它的主要原因。2.3 整体架构设计整个系统的数据流非常清晰可以用一个简单的流水线来描述无人机视频流/本地视频文件 ↓ [YOLOv5检测器] ↓ (输出每帧的检测框bboxes, 置信度conf, 类别cls) [DeepSORT跟踪器] ↓ (输入检测结果 输出带唯一ID的跟踪框) [轨迹可视化模块] ↓ 实时显示画面/保存结果视频在这个架构中检测器和跟踪器是解耦的。这意味着你可以轻松替换检测器比如换成YOLOv8甚至换成针对无人机特定优化的检测模型而无需重写整个跟踪逻辑。可视化模块则独立于核心算法只负责将跟踪器输出的结果进行渲染。3. 环境搭建与核心组件部署理论清楚了接下来就是动手把架子搭起来。这里我会详细列出步骤并附上我踩过坑的地方。3.1 基础环境配置我强烈建议使用Anaconda来管理Python环境避免包版本冲突。这里以Ubuntu 20.04/Windows 10WSL2为例macOS也类似。# 1. 创建并激活一个新的conda环境Python 3.8是一个兼容性很好的版本 conda create -n drone_tracking python3.8 conda activate drone_tracking # 2. 安装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 # 如果没有GPU或CUDA安装CPU版本 # pip install torch torchvision torchaudio3.2 YOLOv5的安装与验证直接从官方仓库克隆是最好最稳的方式。# 克隆YOLOv5仓库 git clone https://github.com/ultralytics/yolov5.git cd yolov5 # 安装依赖requirements.txt里包含了几乎所有需要的包如opencv-python, pandas, matplotlib等 pip install -r requirements.txt安装完成后立刻进行一次快速验证用官方预训练模型检测一张图片确保核心功能正常。python detect.py --source data/images/bus.jpg --weights yolov5s.pt --conf 0.25运行后会在runs/detect/exp目录下生成结果图片。如果能看到图片上画出了巴士、行人等检测框说明YOLOv5部分安装成功。实操心得requirements.txt里的opencv-python在某些系统上可能安装失败可以尝试pip install opencv-python-headless这是一个不包含GUI功能的轻量版本对于服务器部署更友好。另外如果网络问题导致预训练模型yolov5s.pt下载慢可以手动从提供的链接下载并放到项目根目录。3.3 DeepSORT的集成DeepSORT没有像YOLOv5那样一个“官方”的单一仓库但GitHub上有许多高质量的实现。我选择的是一个结构清晰、易于与YOLOv5集成的版本。通常你需要获取两部分代码DeepSORT核心算法包含卡尔曼滤波、匈牙利匹配、特征提取等实现。特征提取器ReID模型的预训练权重通常是ckpt.t7或.pth文件。一个常见的集成方式是在YOLOv5项目目录下新建一个deep_sort文件夹将DeepSORT的核心代码放进去。然后你需要编写一个“胶水”脚本将YOLOv5的检测输出[x1, y1, x2, y2, conf, cls]转换成DeepSORT需要的格式通常是[x1, y1, width, height, conf]并调用DeepSORT的update()函数。关键步骤通常包括初始化DeepSORT跟踪器传入特征提取器权重路径、最大余弦距离用于外观匹配、最大IOU距离用于运动匹配等参数。逐帧处理YOLOv5检测当前帧过滤掉低置信度的检测框。将检测框从(x1, y1, x2, y2)格式转换为(x, y, w, h)格式中心点坐标和宽高这是卡尔曼滤波常用的状态表示。调用tracker.predict()预测现有轨迹在当前帧的位置。调用tracker.update(detections)将当前帧的检测框与预测的轨迹进行匹配更新所有轨迹的状态包括新建、确认、删除。从跟踪器获取当前帧的所有跟踪目标每个目标包含边界框、ID、类别。踩坑记录不同DeepSORT实现的特征提取器输入格式可能不同。有的要求输入图像是BGR有的是RGB有的要求图像尺寸归一化到[0,1]有的要求是[0,255]。务必与你使用的代码实现保持一致否则特征提取无效跟踪就退化成SORT了。一个检查方法是查看特征提取器网络的第一层输入要求。4. 核心代码解析与实现细节环境搭好组件就位现在来看看如何把它们“粘合”起来并实现轨迹可视化。我会用一个简化的主循环代码结构来说明并解释关键参数。4.1 YOLOv5检测结果提取与格式化首先我们需要修改或创建一个新的Python脚本比如track.py在其中初始化YOLOv5模型和DeepSORT跟踪器。import cv2 import torch from yolov5.models.experimental import attempt_load from yolov5.utils.general import non_max_suppression, scale_coords from deep_sort import build_tracker # 假设你的DeepSORT入口函数是 build_tracker class DroneTracker: def __init__(self, yolo_weightsyolov5s.pt, deepsort_ckptdeep_sort/deep/checkpoint/ckpt.t7): # 初始化YOLOv5模型 self.device torch.device(cuda:0 if torch.cuda.is_available() else cpu) self.model attempt_load(yolo_weights, deviceself.device) self.model.eval() self.names self.model.module.names if hasattr(self.model, module) else self.model.names # 初始化DeepSORT跟踪器 self.tracker build_tracker(deepsort_ckpt, use_cudatorch.cuda.is_available()) # 轨迹历史记录 {track_id: [(frame_idx, x_center, y_center), ...]} self.tracks_history {} def detect(self, img): 运行YOLOv5检测一帧图像 # YOLOv5的预处理调整大小、BGR-RGB、归一化、转换维度 img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) img_resized cv2.resize(img_rgb, (640, 640)) # YOLOv5默认输入尺寸 img_tensor torch.from_numpy(img_resized).to(self.device).float() img_tensor / 255.0 # 归一化 img_tensor img_tensor.permute(2, 0, 1).unsqueeze(0) # HWC - BCHW # 前向推理 with torch.no_grad(): pred self.model(img_tensor)[0] # 非极大值抑制 (NMS) pred non_max_suppression(pred, conf_thres0.5, iou_thres0.45)[0] detections [] if pred is not None and len(pred): # 将检测框坐标缩放回原始图像尺寸 pred[:, :4] scale_coords(img_tensor.shape[2:], pred[:, :4], img.shape).round() for *xyxy, conf, cls in pred: # 只保留‘person’类假设类别0是人根据你的数据集调整 if int(cls) 0: x1, y1, x2, y2 map(int, xyxy) w, h x2 - x1, y2 - y1 # DeepSORT需要的格式[x_center, y_center, width, height, confidence] detections.append([(x1x2)/2, (y1y2)/2, w, h, conf.item()]) return detections这段代码定义了检测的核心方法。conf_thres和iou_thres是两个关键参数分别控制检测框的置信度阈值和NMS的IOU阈值。调高conf_thres可以减少误检但可能漏检调低iou_thres可以让重叠的框保留更多但可能重复检测同一个目标。4.2 DeepSORT跟踪与轨迹记录接下来在每一帧中我们将检测结果送入跟踪器并更新轨迹历史。def update_tracks(self, img, detections): 更新跟踪器并记录轨迹 # 将检测结果转换为numpy数组 if len(detections) 0: dets np.array(detections) else: dets np.empty((0, 5)) # DeepSORT更新 tracked_objects self.tracker.update(dets, img) # 注意有些实现需要传入原始图像用于特征提取 current_frame_tracks [] for obj in tracked_objects: x_center, y_center, w, h, track_id obj[:5] # 假设返回格式如此 x1, y1 int(x_center - w/2), int(y_center - h/2) x2, y2 int(x_center w/2), int(y_center h/2) # 记录轨迹点使用边界框底部中心点更接近地面真实位置 track_point (int(x_center), int(y2)) # 使用底部中心 if track_id not in self.tracks_history: self.tracks_history[track_id] [] self.tracks_history[track_id].append(track_point) # 保留最近N个轨迹点用于绘制避免线条过长过乱 if len(self.tracks_history[track_id]) 50: self.tracks_history[track_id].pop(0) current_frame_tracks.append((x1, y1, x2, y2, track_id)) return current_frame_tracks这里有几个细节轨迹点选择我选择了边界框的底部中心点(x_center, y2)作为轨迹点。对于行人或地面车辆这比框的中心点更接近其与地面的接触点轨迹更稳定。对于无人机目标可能需要根据实际情况调整例如使用中心点。轨迹历史长度只保留最近50个点约2秒假设25FPS。这既保证了轨迹的可视性又避免了早期轨迹点对当前画面的干扰画面更清爽。跟踪器输出不同DeepSORT实现的update函数返回值格式可能不同需要根据你采用的代码进行调整。4.3 可视化渲染画框、ID与轨迹最后我们将检测框、ID和轨迹绘制到画面上。def draw_results(self, img, tracks): 在图像上绘制跟踪框、ID和轨迹 for (x1, y1, x2, y2, track_id) in tracks: # 1. 绘制跟踪框和ID color self.compute_color_for_id(track_id) # 根据ID生成固定颜色 cv2.rectangle(img, (x1, y1), (x2, y2), color, 2) label fID:{track_id} (label_width, label_height), baseline cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.6, 2) cv2.rectangle(img, (x1, y1-label_height-baseline), (x1label_width, y1), color, -1) cv2.putText(img, label, (x1, y1-baseline), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (255,255,255), 2) # 2. 绘制该ID的历史轨迹 if track_id in self.tracks_history: track_points self.tracks_history[track_id] for i in range(1, len(track_points)): cv2.line(img, track_points[i-1], track_points[i], color, 2) return img def compute_color_for_id(self, track_id): 一个简单的根据ID生成固定颜色的函数 # 使用一个固定的颜色列表或哈希算法确保同一ID颜色相同 color_palette [(0, 255, 0), (255, 0, 0), (0, 0, 255), (255, 255, 0), (0, 255, 255), (255, 0, 255)] return color_palette[track_id % len(color_palette)]可视化部分的关键在于清晰和美观。为每个Track ID分配一个固定颜色可以让用户一眼就区分不同目标。绘制轨迹线时使用cv2.line连接相邻的历史点线条的粗细和颜色与跟踪框保持一致形成视觉上的关联。4.4 主循环与性能优化将以上所有部分组合进一个视频处理的主循环。def run(self, video_source0): # video_source可以是摄像头索引或视频文件路径 cap cv2.VideoCapture(video_source) while cap.isOpened(): ret, frame cap.read() if not ret: break # 步骤1: 检测 detections self.detect(frame) # 步骤2: 跟踪更新 tracks self.update_tracks(frame, detections) # 步骤3: 绘制结果 result_frame self.draw_results(frame.copy(), tracks) # 建议在副本上绘制 # 显示 cv2.imshow(Drone Tracking, result_frame) if cv2.waitKey(1) 0xFF ord(q): break cap.release() cv2.destroyAllWindows()对于性能优化如果处理速度跟不上视频帧率可以考虑以下策略调整YOLOv5模型尺寸使用更小的模型如yolov5s.pt甚至yolov5n.pt。跳帧处理Frame Skipping不是每一帧都做检测比如每2帧或每3帧做一次检测中间帧只做跟踪预测。这能大幅提升速度但对快速运动目标可能不友好。降低推理分辨率YOLOv5默认输入是640x640可以尝试降低到416x416但会损失精度。使用TensorRT或ONNX Runtime加速将PyTorch模型转换为TensorRT或ONNX格式可以获得显著的推理速度提升尤其是在NVIDIA GPU上。5. 针对无人机场景的专项调优与问题排查将通用目标跟踪应用到无人机场景会遇到一些特有的挑战。这里分享我的调优经验和常见问题的解决方法。5.1 无人机视角下的目标检测挑战与应对无人机视角俯视、斜视与常规地面监控视角平视差异巨大这直接影响了检测效果。目标尺度变化剧烈无人机由远及近飞行目标在图像中可能从几个像素点迅速变大。YOLOv5的FPNPAN结构本身具备一定的多尺度检测能力但为了更好应对可以数据增强在训练数据中多使用随机缩放Random Scaling和马赛克增强Mosaic让模型熟悉各种尺度的目标。自适应锚框使用你自己的无人机数据集运行YOLOv5提供的utils/autoanchor.py脚本重新计算聚类生成更适合你数据分布的锚框Anchor Boxes这能直接提升检测框的初始匹配度。小目标检测高空拍摄时车辆、行人都是小目标。YOLOv5对小目标的检测能力相对中等。提高输入分辨率这是最直接有效的方法。将模型输入从640x640提高到1280x1280--img 1280可以显著改善小目标召回率但会成倍增加计算量。关注更浅的网络层小目标的特征在深层容易丢失。可以尝试修改模型将小目标检测更多地依赖FPN的浅层特征图如P3。使用专门的数据集如果条件允许收集或使用公开的无人机视角数据集如VisDrone, UAVDT进行微调Fine-tuning效果远好于直接用COCO预训练模型。目标遮挡与密集在人群或车流密集区域目标相互遮挡严重。调整NMS参数适当降低NMS的IOU阈值--iou-thres比如从0.45调到0.3可以让被部分遮挡的目标有更大机会被保留下来。但副作用是可能增加重复框。利用跟踪信息当检测器因遮挡漏检时DeepSORT的卡尔曼滤波可以根据目标之前的运动状态预测其可能的位置并在一段时间内维持该轨迹max_age参数等待目标再次出现。5.2 DeepSORT参数调优指南DeepSORT的性能很大程度上依赖于几个关键参数的设置它们共同决定了跟踪的“松紧度”。参数名含义调优方向与影响无人机场景建议初值max_cosine_distance外观特征匹配的最大余弦距离阈值。调低更严格ID切换少但可能无法关联外观变化大的同一目标如转身。调高更宽松关联能力强但容易发生ID混淆。0.2 - 0.3 无人机视角下目标外观变化相对平缓max_iou_distance运动IOU匹配的最大距离阈值。调低更依赖位置重叠对快速运动或相机抖动敏感。调高允许更大的位置预测偏差。0.7 - 0.9 无人机运动可能导致帧间目标位移较大max_age一个轨迹在丢失检测后最多保留的帧数。调高目标短暂遮挡后更容易找回但也会保留更多“幽灵”轨迹。调低及时清理丢失目标画面干净但容易因短暂遮挡产生新ID。30 约1-1.5秒平衡遮挡容忍与清理速度n_init一个检测需要连续关联多少帧才被初始化为一条确认的轨迹。调高减少误检产生的短轨迹轨迹更稳定。调低新目标出现后能更快被跟踪但可能引入噪声。3 无人机场景下目标进入视野较快调优流程建议先固定检测器确保YOLOv5在验证集上达到一个稳定的精度mAP避免检测器的波动干扰跟踪器评估。使用验证视频准备一段有代表性的无人机视频包含目标出现、消失、交错、遮挡等场景。逐个参数调整优先调整max_cosine_distance和max_iou_distance观察ID切换ID Switch次数和轨迹碎片化程度。目标是在尽可能少的ID切换下保持轨迹的连续性和完整性。主观评估与客观指标结合除了看ID切换数更要人眼观察视频结果。有时指标微降但视觉效果更流畅也是可接受的。5.3 轨迹可视化与数据分析进阶基础的轨迹绘制只是第一步我们可以从中挖掘更多信息。轨迹平滑直接连接检测点得到的轨迹可能是锯齿状的。可以使用简单的移动平均滤波或卡尔曼滤波对历史轨迹点进行平滑处理让线条更美观也能一定程度上反映更真实的运动趋势。# 简易移动平均平滑示例 def smooth_track(self, track_id, window_size5): points self.tracks_history[track_id] if len(points) window_size: return points smoothed [] for i in range(len(points)): start max(0, i - window_size // 2) end min(len(points), i window_size // 2 1) window points[start:end] avg_x int(np.mean([p[0] for p in window])) avg_y int(np.mean([p[1] for p in window])) smoothed.append((avg_x, avg_y)) return smoothed速度与方向计算有了时间序列的位置信息可以估算目标的速度和运动方向。例如计算相邻帧间位移结合视频的FPS和实际尺度如果已知可以估算真实速度。# 计算像素位移和方向弧度 dx current_x - previous_x dy current_y - previous_y displacement_pixels np.sqrt(dx**2 dy**2) direction_rad np.arctan2(dy, dx) # 角度方向热点区域分析将所有轨迹点叠加在一张底图上通过热力图的形式可以直观展示哪些区域是目标频繁活动的“热点”。这可以用matplotlib或seaborn的密度图功能轻松实现。5.4 常见问题排查实录在实际运行中你几乎一定会遇到下面这些问题。这是我的排查笔记问题一跟踪框抖动严重轨迹线像“毛线团”。可能原因1检测框本身就不稳定。YOLOv5的检测框在目标边界上可能会有几个像素的波动。这是正常现象尤其是对于非刚性物体。解决方案尝试对检测框进行平滑滤波如对同一目标连续几帧的框位置取平均或者调低DeepSORT的max_iou_distance让跟踪器更“相信”预测的位置减少对单帧检测抖动的敏感度。可能原因2卡尔曼滤波的过程噪声和测量噪声参数设置不当。这些参数控制了跟踪器对运动模型和观测值的信任程度。解决方案这需要深入DeepSORT代码内部调整。通常增加过程噪声协方差Q会让跟踪器更相信观测值检测框反应更快但可能更抖减小它则更相信预测更平滑但可能有滞后。除非必要不建议新手轻易修改。问题二ID切换频繁同一个人走过去身上换了好几个ID。可能原因1外观特征提取失效。这是最常见的原因。检查特征提取器输入图像的预处理颜色通道、归一化是否与训练时一致。确保你加载了正确的预训练权重。解决方案打印或可视化特征提取器的输入图像看是否正常。可以尝试在行人重识别数据集上重新训练或微调特征提取器以适应你的场景。可能原因2max_cosine_distance阈值设得太高或太低。太高容易混淆不同目标太低则无法关联同一目标的外观变化。解决方案系统性地调整该参数观察ID切换次数的变化曲线选择一个拐点值。可能原因3目标被长时间或严重遮挡。DeepSORT在目标丢失超过max_age帧后会删除轨迹。当目标从遮挡物后出来会被视为新目标。解决方案适当增加max_age给目标更长的“等待”时间。或者尝试引入更复杂的重识别策略。问题三帧率太低无法实时处理。可能原因YOLOv5模型太大或者没有使用GPU推理。解决方案链确认GPU已启用在代码中检查torch.cuda.is_available()是否为True。换用更小模型从yolov5m.pt换到yolov5s.pt或yolov5n.pt。降低推理尺寸在检测时传入imgsz416。启用半精度推理PyTorch中可以使用model.half()将模型转换为半精度FP16推理速度可提升近一倍精度损失很小。self.model attempt_load(yolo_weights, deviceself.device).half() img_tensor img_tensor.half() # 输入也需要是half终极优化使用TensorRT部署。将YOLOv5模型导出为ONNX再用TensorRT转换和推理这是工业级部署的标准做法能极大提升性能。问题四如何保存跟踪结果轨迹数据以供后续分析解决方案最简单的办法是将每一帧的跟踪结果ID, 框坐标 时间戳写入一个CSV文件或JSON文件。import csv def write_track_to_csv(frame_idx, tracks, csv_writer): for (x1, y1, x2, y2, track_id) in tracks: csv_writer.writerow([frame_idx, track_id, x1, y1, x2, y2])这样你就可以用Pandas、Excel或其他数据分析工具离线分析所有目标的运动轨迹、计算停留时间、绘制热力图等实现从“可视化”到“可量化分析”的飞跃。这个项目从技术选型到实现细节再到调优排错基本涵盖了构建一个实用无人机目标跟踪系统的全流程。最关键的体会是没有一劳永逸的参数最好的系统一定是根据你的具体场景无人机型号、飞行高度、目标类型、光照条件反复调试出来的。先从默认参数跑通流程然后带着问题去看日志、调参数、改代码这个过程本身就是对计算机视觉和跟踪理论最深刻的学习。本文还有配套的精品资源点击获取
RELATED — 相关阅读

相关资讯

LATEST — 最新资讯

最新发布

TODAY — 本日精选

新闻

WEEKLY — 本周精选

新闻

MONTHLY — 本月精选

新闻