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

资讯详情

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

无人机视频目标跟踪实战:YOLOv5+DeepSORT端到端调优与边缘部署

无人机视频目标跟踪实战:YOLOv5+DeepSORT端到端调优与边缘部署 简介本资源是一套基于Python与YOLOv5实现无人机视觉目标检测与DeepSORT多目标跟踪的完整项目方案面向计算机视觉方向的本科生毕业设计、课程设计及初级开发者项目实践。项目整合了目标检测与轨迹跟踪两大核心模块支持实时视频流与MP4文件输入具备良好的可扩展性与工程落地参考价值。压缩包共79个文件包含50个Python源码如main.py、tracker.py、detector.py等核心逻辑、6个YOLOv5配置yaml、2个说明文档README.md与使用指南、3个Shell脚本含push.sh部署支持、2张示例图像及1个预训练模型.pt整体大小为83.76MB结构清晰、模块解耦。目前已有161人学习下载配套MD文档详述环境配置、数据准备、参数调优与常见问题排查源码经严格测试可直接运行并支持二次开发与算法微调。1. 为什么无人机跟踪项目总在“检测到目标却跟丢”——用 Python YOLOv5 DeepSORT 搭建可复现、可调参、能落地的端到端跟踪流水线你手头有一段无人机航拍视频想自动识别并持续追踪画面中的车辆、行人或特定飞行器但试过几个开源方案后发现YOLOv5 能框出目标DeepSORT 却频繁 ID 切换、轨迹跳变甚至同一目标被赋予多个 ID训练自己的数据集时模型在白天效果尚可一到黄昏或逆光就漏检部署到 Jetson Nano 或树莓派 5 上帧率直接掉到 3 fps根本没法实时响应。这不是玄学——而是检测与跟踪两个模块之间存在三重断层检测置信度阈值与跟踪器卡尔曼滤波初始化不匹配、ReID 特征提取器未适配小目标形变、以及多目标关联时的 IOU/GIOU/DeepSORT 代价矩阵未按无人机视角重加权。本文不讲论文推导只带你用纯 Python 实现一个从环境配置、模型微调、跟踪参数调优到嵌入式部署验证的完整闭环。适合计算机视觉方向的毕业设计、课程设计或中小型安防/巡检类项目开发——所有代码基于ultralytics8.2.0和deep-sort-realtime主流稳定分支不依赖任何非公开模型或闭源库全程可本地复现。2. 环境搭建与最小可运行验证用 5 行命令跑通 YOLOv5 DeepSORT 的端到端推理2.1 为什么必须用 conda 而不是 pip 管理依赖——CUDA、OpenCV 与 PyTorch 的隐性冲突YOLOv5 推理依赖torch的 CUDA 加速DeepSORT 的cv2.dnn模块对 OpenCV 版本敏感而pip install opencv-python默认安装无 CUDA 支持的 CPU 版本会导致cv2.dnn.readNetFromONNX()加载模型失败同时torch2.0.1cu118与torchvision0.15.2必须严格匹配 CUDA 版本否则model(img)报CUDNN_STATUS_NOT_SUPPORTED。conda 自动解析二进制兼容性避免手动编译。提示不要用pip install torch安装带 CUDA 的 PyTorch务必从 PyTorch 官网 复制对应 CUDA 版本的 conda 命令。例如 CUDA 11.8 环境执行conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia2.2 创建隔离环境并安装核心包含版本锁定# 创建新环境Python 3.9 兼容性最佳 conda create -n drone_track python3.9 conda activate drone_track # 安装 PyTorch以 CUDA 11.8 为例 conda install pytorch torchvision torchaudio pytorch-cuda11.8 -c pytorch -c nvidia # 安装 YOLOv5 官方库注意不是 ultralytics 的 YOLOv8本项目基于 YOLOv5s/v5m pip install githttps://github.com/ultralytics/yolov5.gitv7.0 # v7.0 是最后一个稳定 v5 分支 # 安装 DeepSORT 实现选用轻量、文档清晰、支持自定义 ReID 的 deep-sort-realtime pip install deep-sort-realtime2.4.0 # 额外依赖YOLOv5 数据加载和 cv2 视频处理必需 pip install opencv-python4.8.1.78 numpy1.23.5 tqdm4.66.2验证是否成功# test_env.py import torch, cv2, numpy as np from yolov5.models.experimental import attempt_load from deep_sort_realtime.deepsort import DeepSort print(PyTorch version:, torch.__version__) print(CUDA available:, torch.cuda.is_available()) print(OpenCV version:, cv2.__version__) print(YOLOv5 load success:, callable(attempt_load)) print(DeepSORT init success:, callable(DeepSort))运行python test_env.py应全部输出True或具体版本号。若报ModuleNotFoundError: No module named yolov5说明pip install未将 yolov5 添加到 PYTHONPATH —— 进入yolov5仓库根目录执行pip install -e .注意-e开发模式。2.3 最小可运行脚本读取视频、YOLOv5 检测、DeepSORT 跟踪、可视化轨迹# minimal_track.py import cv2 import numpy as np from yolov5.models.common import DetectMultiBackend from yolov5.utils.general import non_max_suppression, scale_boxes from yolov5.utils.plots import Annotator from deep_sort_realtime.deepsort import DeepSort # 1. 加载 YOLOv5 模型使用官方预训练权重 model DetectMultiBackend(yolov5s.pt, devicecuda:0) # 若无 GPU设为 cpu stride, names, pt model.stride, model.names, model.pt model.warmup(imgsz(1, 3, 640, 640)) # 预热 # 2. 初始化 DeepSORT关键参数说明见下文 tracker DeepSort( max_age30, # 目标丢失后保留轨迹的最大帧数无人机视角需设高因目标易短暂遮挡 n_init3, # 连续 3 帧检测到同一目标才创建轨迹防误检 nn_budget100, # ReID 特征库最大容量默认足够 embeddermobilenet, # 轻量级 ReID 模型适合边缘设备比 resnet50 内存低 60% ) # 3. 打开视频替换为你的无人机视频路径 cap cv2.VideoCapture(drone_test.mp4) fps cap.get(cv2.CAP_PROP_FPS) out cv2.VideoWriter(output_tracked.avi, cv2.VideoWriter_fourcc(*XVID), fps, (int(cap.get(3)), int(cap.get(4)))) while cap.isOpened(): ret, frame cap.read() if not ret: break # YOLOv5 推理 img cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) img np.expand_dims(img, 0) # 添加 batch 维度 pred model(img, augmentFalse, visualizeFalse) pred non_max_suppression(pred, conf_thres0.4, iou_thres0.45)[0] # NMS 后处理 # 调整坐标到原图尺寸 pred[:, :4] scale_boxes((640, 640), pred[:, :4], frame.shape).round() # 提取检测框和置信度仅保留 person/car 类别索引参考 names detections [] for *xyxy, conf, cls in pred: if int(cls) in [0, 2]: # 0: person, 2: carYOLOv5 COCO 类别 x1, y1, x2, y2 map(int, xyxy) detections.append([[x1, y1, x2-x1, y2-y1], conf.item(), int(cls)]) # DeepSORT 跟踪 tracks tracker.update_tracks(detections, frameframe) # 可视化 annotator Annotator(frame, line_width2, font_size12) for track in tracks: if not track.is_confirmed() or track.time_since_update 1: continue bbox track.to_ltrb() # [x1, y1, x2, y2] tid track.track_id label fID-{tid} annotator.box_label(bbox, label, color(0, 255, 0)) result_frame annotator.result() out.write(result_frame) cap.release() out.release() print(Tracking completed. Output saved to output_tracked.avi)逻辑说明与参数说明conf_thres0.4YOLOv5 检测置信度过滤阈值。无人机视频中目标小、模糊设太低如 0.2会引入大量误检导致 DeepSORT 关联混乱设太高如 0.6则漏检。0.4 是平衡点后续可按场景微调。max_age30无人机飞行中目标常被云层、建筑短暂遮挡若设为默认30即 1 秒内丢失即删除轨迹会频繁中断。实测max_age602 秒更鲁棒但内存占用略增。embeddermobilenetDeepSORT 默认用resnet50提取 ReID 特征但在无人机小目标30×30 像素上泛化差。mobilenet参数量少、对形变鲁棒且deep-sort-realtime已内置其预训练权重无需额外下载。detections格式必须为[[x,y,w,h], confidence, class_id]这是deep-sort-realtime的硬性输入格式x,y,w,h是左上角坐标宽高非中心点顺序错会导致跟踪完全失效。3. 检测模型微调用自定义无人机数据集训练 YOLOv5解决小目标漏检与逆光失效3.1 无人机数据集标注规范与格式转换VOC → YOLO 格式YOLOv5 要求数据集为.txt标注文件每行class_id center_x center_y width height归一化到 0~1。但无人机拍摄图像分辨率高如 3840×2160、目标小车辆仅 50×30 像素直接标注易出错。推荐流程用labelImg支持矩形框自动保存为 YOLO 格式标注原始图像将大图缩放到1280×720后再标注提高小目标可见性但需同步缩放标注坐标使用以下脚本批量转换并划分 train/val# convert_voc_to_yolo.py import os import xml.etree.ElementTree as ET from pathlib import Path def convert_voc_to_yolo(voc_dir, yolo_dir, classes[person, car, drone]): 将 VOC XML 标注转为 YOLO txt 格式 image_dir Path(voc_dir) / JPEGImages ann_dir Path(voc_dir) / Annotations yolo_labels Path(yolo_dir) / labels yolo_images Path(yolo_dir) / images yolo_labels.mkdir(exist_okTrue) yolo_images.mkdir(exist_okTrue) for xml_file in ann_dir.glob(*.xml): tree ET.parse(xml_file) root tree.getroot() size root.find(size) w int(size.find(width).text) h int(size.find(height).text) # 生成 YOLO 标签文件 yolo_txt yolo_labels / f{xml_file.stem}.txt with open(yolo_txt, w) as f: for obj in root.findall(object): cls_name obj.find(name).text if cls_name not in classes: continue cls_id classes.index(cls_name) bbox obj.find(bndbox) x1 float(bbox.find(xmin).text) y1 float(bbox.find(ymin).text) x2 float(bbox.find(xmax).text) y2 float(bbox.find(ymax).text) # 归一化 x_center ((x1 x2) / 2) / w y_center ((y1 y2) / 2) / h width (x2 - x1) / w height (y2 - y1) / h f.write(f{cls_id} {x_center:.6f} {y_center:.6f} {width:.6f} {height:.6f}\n) # 复制图像 img_path image_dir / f{xml_file.stem}.jpg if img_path.exists(): (yolo_images / img_path.name).write_bytes(img_path.read_bytes()) print(fConverted {len(list(ann_dir.glob(*.xml)))} annotations.) # 调用 convert_voc_to_yolo(./voc_dataset, ./yolo_dataset)3.2 修改 YOLOv5 配置针对无人机小目标优化 anchor 与输入尺寸YOLOv5 默认 anchor 是基于 COCO 大目标平均 200×200 像素设计的无人机小目标平均 40×30需重新聚类。使用k-means计算新 anchor# generate_anchors.py import numpy as np from tqdm import tqdm from yolov5.utils.general import xywh2xyxy def kmeans_anchors(dataset_path, n_clusters9, iters100): 为无人机小目标生成定制 anchor from glob import glob from pathlib import Path labels list(Path(dataset_path).rglob(*.txt)) boxes [] for label in tqdm(labels): with open(label) as f: for line in f: parts line.strip().split() if len(parts) 5: continue _, x, y, w, h map(float, parts) # 还原为像素宽高假设图像尺寸为 1280x720 w_px, h_px w * 1280, h * 720 boxes.append([w_px, h_px]) boxes np.array(boxes) # K-means 聚类使用 IOU 距离 anchors np.random.rand(n_clusters, 2) * 100 # 初始 anchor宽高 for _ in range(iters): distances np.zeros((len(boxes), n_clusters)) for i, box in enumerate(boxes): for j, anchor in enumerate(anchors): # IOU 距离 1 - IOU inter min(box[0], anchor[0]) * min(box[1], anchor[1]) union box[0]*box[1] anchor[0]*anchor[1] - inter iou inter / (union 1e-10) distances[i, j] 1 - iou labels np.argmin(distances, axis1) new_anchors np.array([np.median(boxes[labels i], axis0) for i in range(n_clusters)]) if np.allclose(anchors, new_anchors): break anchors new_anchors return np.round(anchors).astype(int) # 运行输出类似 [[12,15], [18,22], ...] anchors kmeans_anchors(./yolo_dataset/labels) print(New anchors:, anchors.tolist())将输出结果填入yolov5/models/yolov5s.yaml的anchors:字段共 3 层每层 3 个 anchor并修改imgsz: 1280无人机高清图需大输入尺寸提升小目标召回。3.3 训练命令与关键超参数设置避坑重点# train_drone.sh python train.py \ --img 1280 \ # 输入尺寸必须与标注时一致 --batch 16 \ # 根据 GPU 显存调整RTX 3090 可设 32 --epochs 100 \ # 无人机数据量少100 足够收敛 --data ./data/drone.yaml \ # 自定义数据配置文件含 train/val 路径、nc、names --weights yolov5s.pt \ # 从 COCO 预训练权重迁移学习 --cfg models/yolov5s.yaml \ # 使用修改 anchor 后的配置 --name drone_yolov5s \ # 输出目录名 --cache \ # 启用缓存加速数据加载首次慢后续快 --exist-ok \ # 允许覆盖同名输出目录 --hyp data/hyps/hyp.drone.yaml # 自定义超参数文件见下文hyp.drone.yaml关键修改解决逆光失效# data/hyps/hyp.drone.yaml lr0: 0.01 # 学习率无人机数据少不宜过大 lrf: 0.1 # 余弦退火终值避免过拟合 momentum: 0.937 # 动量保持梯度稳定性 weight_decay: 0.0005 warmup_epochs: 3.0 warmup_momentum: 0.8 warmup_bias_lr: 0.1 box: 0.05 # 边界框损失权重小目标需略增 cls: 0.5 # 分类损失权重逆光下类别易混淆提高权重 cls_pw: 1.0 # 分类正样本权重增强难样本学习 obj: 1.0 # 置信度损失权重 obj_pw: 1.0 iou_t: 0.20 # NMS IOU 阈值小目标重叠少降低阈值防合并 anchor_t: 4.0 # anchor 匹配阈值小目标 shape 变化大放宽匹配 fl_gamma: 0.0 # Focal Loss gamma无人机场景背景简单关闭 focal loss 防抑制 hsv_h: 0.015 # 色调扰动逆光时色调失真小幅增强鲁棒性 hsv_s: 0.7 # 饱和度扰动逆光区域饱和度低增大扰动范围 hsv_v: 0.4 # 明度扰动关键逆光下明度差异大加大扰动注意hsv_v: 0.4是血泪经验——无人机逆光场景中目标与背景明度对比度极低增大明度扰动能迫使模型学习纹理而非亮度特征。实测将hsv_v从默认0.1提升至0.4逆光检测 AP 提升 12.3%。4. DeepSORT 跟踪深度调优解决 ID 切换、轨迹抖动与多目标混淆4.1 代价矩阵重构用 GIOU 替代 IOU 距离加权适配无人机俯视视角DeepSORT 默认使用IOU计算检测框与轨迹预测框的相似度但无人机俯视视角下目标尺度变化剧烈近处车占 200×100 像素远处仅 30×15IOU 对尺度敏感导致小目标匹配失败。解决方案改用GIOUGeneralized IOU并加入中心点欧氏距离加权# custom_tracker.py import numpy as np from scipy.spatial.distance import cdist from deep_sort_realtime.deepsort import DeepSort from deep_sort_realtime.embedder.mobilenet_embedder import MobileNetEmbedder from deep_sort_realtime.tracker import Tracker class DroneDeepSort(DeepSort): def __init__(self, **kwargs): super().__init__(**kwargs) # 替换默认 embedder 为 mobilenet已在 2.2 节说明 self.embedder MobileNetEmbedder() def _match(self, detections, tracks, frame): 重写匹配逻辑GIOU 距离加权 if len(tracks) 0 or len(detections) 0: return [], [], [] # 获取轨迹预测框ltrb 格式 track_boxes np.array([track.to_ltrb() for track in tracks]) det_boxes np.array([det[0] for det in detections]) # 计算 GIOU 矩阵自定义函数 giou_matrix self._giou_batch(track_boxes, det_boxes) # 计算中心点距离矩阵归一化到 0~1 track_centers np.array([(b[0]b[2])/2, (b[1]b[3])/2] for b in track_boxes) det_centers np.array([(b[0]b[2])/2, (b[1]b[3])/2] for b in det_boxes) dist_matrix cdist(track_centers, det_centers, metriceuclidean) # 归一化除以图像对角线长度 diag np.sqrt(frame.shape[0]**2 frame.shape[1]**2) dist_matrix dist_matrix / diag # 融合GIOU 主导距离辅助无人机视角下距离信息强 cost_matrix 1.0 - giou_matrix 0.3 * dist_matrix # 权重 0.3 经实测最优 # Hungarian 匹配 from scipy.optimize import linear_sum_assignment row_ind, col_ind linear_sum_assignment(cost_matrix) matches [] unmatched_tracks list(range(len(tracks))) unmatched_dets list(range(len(detections))) for r, c in zip(row_ind, col_ind): if cost_matrix[r, c] 0.7: # 匹配阈值GIOU0.3 且距离合理 matches.append((r, c)) if r in unmatched_tracks: unmatched_tracks.remove(r) if c in unmatched_dets: unmatched_dets.remove(c) return matches, unmatched_tracks, unmatched_dets def _giou_batch(self, bboxes1, bboxes2): 批量计算 GIOU # bboxes: [N, 4] ltrb area1 (bboxes1[:, 2] - bboxes1[:, 0]) * (bboxes1[:, 3] - bboxes1[:, 1]) area2 (bboxes2[:, 2] - bboxes2[:, 0]) * (bboxes2[:, 3] - bboxes2[:, 1]) lt np.maximum(bboxes1[:, None, :2], bboxes2[:, :2]) rb np.minimum(bboxes1[:, None, 2:], bboxes2[:, 2:]) wh (rb - lt).clip(min0) inter wh[:, :, 0] * wh[:, :, 1] union area1[:, None] area2 - inter iou inter / (union 1e-10) # 最小包围矩形 lt_outer np.minimum(bboxes1[:, None, :2], bboxes2[:, :2]) rb_outer np.maximum(bboxes1[:, None, 2:], bboxes2[:, 2:]) wh_outer (rb_outer - lt_outer).clip(min0) area_outer wh_outer[:, :, 0] * wh_outer[:, :, 1] giou iou - (area_outer - union) / (area_outer 1e-10) return giou4.2 卡尔曼滤波参数重调适配无人机高速运动与镜头抖动DeepSORT 的卡尔曼滤波默认参数dt1/30,accel_noise_mag0.01针对地面固定摄像头设计。无人机飞行中目标速度可达 10 m/s镜头存在高频抖动需调整参数默认值无人机推荐值说明dt1/301/fps动态获取时间步长必须与视频帧率一致否则预测漂移accel_noise_mag0.010.5加速噪声幅度无人机目标加速度大需提高以容忍抖动std_weight_position1/201/5位置观测噪声标准差无人机图像抖动大放宽观测信任度std_weight_velocity1/1601/40速度观测噪声标准差同上在DroneDeepSort.__init__()中注入from filterpy.kalman import KalmanFilter # ... 在初始化 tracker 后 for track in self.tracks: # 重置每个 track 的 kf track.kf KalmanFilter(dim_x7, dim_z4) track.kf.F np.array([ [1,0,0,0,1,0,0], [0,1,0,0,0,1,0], [0,0,1,0,0,0,1], [0,0,0,1,0,0,0], [0,0,0,0,1,0,0], [0,0,0,0,0,1,0], [0,0,0,0,0,0,1] ]) track.kf.H np.array([ [1,0,0,0,0,0,0], [0,1,0,0,0,0,0], [0,0,1,0,0,0,0], [0,0,0,1,0,0,0] ]) track.kf.R * 10 # R 是观测噪声协方差放大 10 倍容忍抖动 track.kf.P * 10 # P 是估计误差协方差初始不确定性加大4.3 避坑DeepSORT 的 4 个致命陷阱与修复方案现象 1同一目标在画面中移动时 ID 频繁切换如 ID-5 → ID-12 → ID-3原因YOLOv5 检测框抖动 DeepSORT 默认n_init2仅需 2 帧确认导致新轨迹创建过快旧轨迹未及时删除。解决将n_init提高到5并增加max_age60确保轨迹稳定后再关联。同时在update_tracks前对检测框做cv2.GaussianBlur核大小 3平滑减少框抖动。现象 2目标静止时轨迹缓慢漂移如车辆停在路边框逐渐右移原因卡尔曼滤波预测状态包含速度项静止目标速度观测噪声累积导致漂移。解决添加静止目标检测逻辑——若连续 10 帧abs(dx)abs(dy)2像素则冻结速度更新if abs(dx) abs(dy) 2: track.kf.F[4,4] track.kf.F[5,5] 1.0 # 冻结 vx,vy 预测 track.kf.Q[4,4] track.kf.Q[5,5] 1e-6 # 极小过程噪声现象 3多目标近距离时 ID 交换两辆车并行ID 互换原因纯 GIOU 匹配无法区分外观相似目标。解决启用 ReID 特征融合。deep-sort-realtime默认开启但需确保embedder输入是裁剪后的目标图像# 在 detections 循环中 for *xyxy, conf, cls in pred: x1,y1,x2,y2 map(int, xyxy) crop frame[y1:y2, x1:x2] # 严格按检测框裁剪 # crop 传入 embedder特征向量参与匹配现象 4无人机快速旋转时所有轨迹丢失原因max_age设置过短且旋转导致目标形变超出卡尔曼预测范围。解决动态max_age——根据帧间运动幅度调整motion_mag np.sqrt(dx**2 dy**2) if motion_mag 50: # 快速运动 track.max_age 120 else: track.max_age 605. 部署验证与性能压测Jetson Nano / 树莓派 5 上的实时性保障策略5.1 模型量化与 TensorRT 加速Jetson Nano 必做YOLOv5s 在 Jetson Nano4GB RAM上 FP16 推理约 12 FPS但需进一步优化ONNX 导出YOLOv5 官方支持python export.py --weights yolov5s.pt --include onnx --img 1280 --batch 1TensorRT 引擎构建需安装tensorrt8.5.2trtexec --onnxyolov5s.onnx \ --saveEngineyolov5s.engine \ --fp16 \ --workspace2048 \ --timingCacheFiletiming.cache \ --shapesinput:1x3x1280x1280Python 加载 TensorRT 引擎替换原DetectMultiBackendimport tensorrt as trt import pycuda.driver as cuda import pycuda.autoinit class TRTYOLOv5: def __init__(self, engine_path): self.engine self._load_engine(engine_path) self.context self.engine.create_execution_context() self.inputs, self.outputs, self.bindings, self.stream self._allocate_buffers() def _load_engine(self, engine_path): with open(engine_path, rb) as f: runtime trt.Runtime(trt.Logger(trt.Logger.WARNING)) return runtime.deserialize_cuda_engine(f.read()) def __call__(self, img): # img: np.ndarray (H,W,3) - preprocess - copy to device - execute - postprocess # 具体实现略核心是 cudaMemcpyAsync pass5.2 树莓派 5 部署用 OpenVINO 代替 PyTorchCPU 推理提速 3.2 倍树莓派 58GB RAM Cortex-A76无 GPU 加速PyTorch CPU 推理仅 1.8 FPS。改用 Intel OpenVINO将 ONNX 模型转换为 OpenVINO IR 格式mo --input_model yolov5s.onnx --input_shape [1,3,1280,1280] --data_type FP16Python 推理from openvino.runtime import Core core Core() model core.read_model(yolov5s.xml) compiled_model core.compile_model(model, CPU) infer_request compiled_model.create_infer_request() # 预处理BGR→RGB→归一化→NHWC→NCHW input_tensor np.expand_dims(img_rgb.astype(np.float32) / 255.0, 0).transpose(0,3,1,2) result infer_request.infer({0: input_tensor})实测树莓派 5 上 OpenVINO 推理达 5.7 FPS满足基础跟踪需求。5.3 端到端延迟分解与瓶颈定位必做用time.perf_counter()测量各环节耗时100 帧平均环节Jetson Nano (FPS)树莓派 5 (FPS)瓶颈分析优化手段视频读取 (cap.read)0.8 ms3.2 msUSB 3.0 带宽限制改用cv2.CAP_GSTREAMER后端YOLOv5 推理68 ms (14.7 FPS)176 ms (5.7 FPS)模型计算TensorRT / OpenVINODeepSORT 关联12 ms28 ms距离矩阵计算用numba.jit加速 GIOU轨迹预测KF0.5 ms1.2 ms可忽略—绘制与写入4.2 ms15.3 msOpenCV 绘图关闭Annotator用cv2.rectangle关键技巧在update_tracks前添加cv2.resize(frame, (640,360))缩小输入尺寸——DeepSORT 的 ReID 特征提取对分辨率不敏感但大幅降低cv2.dnn.blobFromImage耗时。实测 Jetson Nano 上此项优化使总 FPS 从 14.7 提升至 21.3。6. 毕业设计/课程设计交付 checklist从代码到答辩材料的完整清单6.1 代码结构标准化评审老师一眼看懂drone_tracking_project/ ├── README.md # 含环境配置、运行命令、效果 GIF、性能数据 ├── requirements.txt # conda/pip 依赖带版本号 ├── data/ │ ├── drone.yaml # 数据集配置 p a hrefhttps://download.csdn.net/download/cs1395293598/90760965 stylecolor:#ec7500;font-size:14px; 本文还有配套的精品资源点击获取 /a img altmenu-r.4af5f7ec.gif srchttps://csdnimg.cn/release/wenkucmsfe/public/img/menu-r.4af5f7ec.gif stylewidth:16px;margin-left:4px;vertical-align:text-bottom;cursor:text; /p
返回列表