尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
YOLOv5+大疆Tello TT实战:从训练到实时检测追踪
简介这是一份面向目标检测与无人机视觉应用的完整项目资源包基于YOLOv5框架搭配大疆教育无人机Tello TT实现旗、圈两类目标的识别检测与追踪测距。资源集成源码、数据集、已调优的权重模型和详细操作说明可直接用于毕业设计、课程设计或期末大作业也适合深度学习CV方向学习者参考、改造并训练其他目标。包内涵盖1679个文件以775张jpg图像、694个txt标注、94个yaml配置、46个Python脚本及8个pt模型权重为主附带训练日志与部署辅助文件压缩包总大小约249.27MB结构清晰便于按步骤复现。目前已有2194人学习使用项目完整度较高不仅能跑通流程还能在此基础上调整参数、替换数据以扩展功能实用性强。1. 为什么是 YOLOv5 大疆教育无人机 Tello TT这套资源到底能解决什么问题路测的时候我发现很多刚入手 Tello TT 的老师最头疼的不是飞控而是“怎么让飞机自己认出东西来”。这套基于 YOLOv5 大疆教育无人机 Tello TT 的完整资源正好把这条链路打通了带标注的数据集、训练好的模型权重、以及能直接跑识别 追踪 测距的 Python 代码全在一个压缩包里。它解决的是课堂上“让学生看到算法落地”的问题——让 K12 阶段的孩子在真实飞行场景里直观地观察到目标检测的完整过程。适合在信息课、创客社团或者 RoboMaster TT 赛事训练营里当作项目素材直接使用也适合想从零训练自己检测模型的开发者作为起点。2. 源码包拆解与依赖搭建训练环境和飞控 SDK 的衔接方式把这套资源跑通之前先要弄明白压缩包里每一层是干什么的。很多人拿到手就急着跑detect.py结果环境没配对报错半小时其实都是没有先分清“训练环境”和“飞控环境”两套体系。2.1 压缩包里的文件清单与职责划分先把这个 .7z 包解开里面大致按功能分成了四块数据集、模型权重、Python 源码、操作文档。我一般拿到这类资源会先列一个目录树确认责任边界避免后面误改文件。路径类型职责datasets/文件夹训练集 验证集JPEG 图片和 YOLO 格式的 txt 标签runs/train/exp*/weights/权重文件best.pt和last.pt对应最优权重和最后一轮权重detect.py/track.pyPython 脚本实时检测、追踪、测距的调用入口tello_control.pyPython 脚本对接 Tello TT 的 SDK 指令README.pdf/ 操作文档文档环境变量、按键控制、安全说明这个结构是挺标准的 YOLOv5 工程组织方式把数据、权重、代码分开runs/train里的best.pt就是你训练到最优的那一次保存下来的模型。我建议拿到后先把best.pt单独复制到根目录或者weights/下不要改动原目录这样后面做对比实验时不会把基准弄丢。操作文档建议先读一遍尤其是其中关于“遥控器失效保护”的说明那部分直接关系到飞行安全。这里有个容易忽略的点训练集图片里如果有命名重复的文件比如不同文件夹下都有0001.jpgYOLOv5 在划分训练集时会出问题后面第三部分会专门说检查标签时的处理方式。2.2 搭建训练环境CUDA、PyTorch 和 YOLOv5 依赖版本训练模型这步环境比代码本身更容易翻车。YOLOv5 官方仓库对 PyTorch 版本比较敏感太新的 PyTorch 可能造成个别算子输出不一致太老又跟不上 CPU 指令集。我在这套资源上按下面这个组合来装稳定性和速度都比较均衡# 创建独立的虚拟环境避免污染系统 Python conda create -n yolov5 python3.8 -y conda activate yolov5 # 安装依赖用 PyTorch 1.12cu113 这套比较成熟 pip install torch1.12.1 torchvision0.13.1 pip install -r requirements.txt # 验证 GPU 是否识别 python -c import torch; print(torch.cuda.is_available()); print(torch.__version__)依赖不一定要全用最新版本。requirements.txt里 YOLOv5 官方锁定了 numpy、opencv、matplotlib 等包的下限但没有锁上限。如果机器上已经有了 numpy 2.x建议在安装依赖后强制降回 1.24 或者 1.26 系列pip install numpy2.0原因很简单numpy 2.x 的 ABI 变化可能让预编译的 opencv 直接段错误而 PyTorch 1.12 的某些扩展模块并不兼容新的 numpy API。跑test.py或者detect.py的时候报“undefined symbol”基本都是这个原因。判断 GPU 算力是否够用看nvidia-smi的 CUDA 版本然后让 PyTorch 的 CUDA 运行时小于等于它就行。比如驱动支持 CUDA 12.x你用 cu118 的轮子没问题反过来驱动只支持 11.4你硬装 cu121 就会在torch.cuda.is_available()这里返回 False。2.3 连接 Tello TTSDK 端口、视频流和网络拓扑Tello TT 和普通电脑之间是 WiFi 直连不需要路由器。TT 自己开一个 2.4G 热点电脑无线网卡连上去之后SDK 默认走 UDP 端口 8889 发送控制指令端口 11111 接收状态数据视频流则由streamon指令启动后通过 UDP 传到本机。用 djitellopy 库可以不用手搓 UDP 协议它对 SDK 指令做了封装处理视频流也更稳from djitellopy import Tello import cv2 # 初始化并连接 tello Tello() tello.connect() print(电量: , tello.get_battery()) # 打开视频流 tello.streamon() frame_read tello.get_frame_read() # 持续读帧验证画面是否正常 for i in range(30): img frame_read.frame if img is not None: cv2.imshow(TT Preview, img) if cv2.waitKey(1) 0xFF ord(q): break tello.streamoff() tello.end()connect()内部会定时发送command指令进入 SDK 模式如果返回ok说明链路通了。get_frame_read()拿到的是FrameRead对象它用一个后台线程不断从 UDP 端口拉视频帧缓存到内存主线程直接frame属性取值即可避免因为网络抖动导致cv2.VideoCapture阻塞。这里有一个网络层面的细节Tello 用的是 2.4G WiFi开发时电脑最好用 5G 频段的无线网卡反向兼容否则同一台电脑同时连公司 WiFi 和 Tello 热点会产生路由表冲突。我习惯在连接 Tello 前先route printWindows或者ip addrLinux看一眼默认路由确保只有一个默认路由指向 Tello 的 192.168.10.1 网段。否则会出现控制指令发出去了但视频流始终黑屏的现象。3. 数据集准备与 YOLOv5 训练从标注格式到超参数调整很多人拿到别人整理好的数据集就直接开训这没问题但数据集的目录结构和标注格式决定了训练时会不会报Assertion错误。YOLOv5 对数据集的格式要求非常死板必须先理顺。3.1 数据目录结构和标签格式YOLOv5 官方要求数据集按如下方式组织图片和标签分开放标签文件的文件名必须和图片完全同名只是后缀不同datasets/tt_data/ ├── images/ │ ├── train/ │ │ ├── cone_001.jpg │ │ └── cone_002.jpg │ └── val/ │ └── cone_val_001.jpg ├── labels/ │ ├── train/ │ │ ├── cone_001.txt │ │ └── cone_002.txt │ └── val/ │ └── cone_val_001.txt └── tt_data.yamltt_data.yaml是告诉 YOLOv5 去哪里找数据的配置文件格式如下path: ../datasets/tt_data train: images/train val: images/val nc: 2 names: [cone, person]nc表示类别数names的索引顺序必须和标注文件里 class id 一一对应。比如cone_001.txt中一行数据是0 0.42 0.33 0.15 0.08含义是类别索引0对应 names 里的cone归一化后的中心 x、中心 y、宽度、高度。所有坐标值都是相对图片宽高的比例取值范围 0 到 1。标注这一步常见做法是使用 LabelImg 或者 X-AnyLabeling 画框保存。如果是从其他标注工具比如 labelme 的 json转换建议用脚本统一转一遍并检查是否有越界值import os # 检查所有标注文件是否有越界或空标签 label_dir datasets/tt_data/labels/train for f in os.listdir(label_dir): if not f.endswith(.txt): continue with open(os.path.join(label_dir, f), r) as fh: lines fh.readlines() # 空标签文件会导致训练时 warning但不会崩稳定性上建议清掉对应图片 if len(lines) 0: print(空标签: , f) continue for line in lines: parts line.split() if len(parts) ! 5: print(格式异常: , f) cls, x, y, w, h parts if not (0 float(x) 1 and 0 float(w) 1): print(越界: , f, line)这段检查脚本是每次训练前必跑的。标注文件里出现1.05这种超过 1.0 的坐标YOLOv5 在计算损失时不会直接报错但会静默地让边界框中心点偏移最终结果就是训练时 mAP 上不去或者推理时框的位置整体偏向画面一角。越界坐标的来源绝大多数是标注工具导出的归一化结果四舍五入误差或者是裁剪图片后没有重新生成标签。3.2 训练命令与超参数调整怎么配才是合理的训练这套数据的常规命令如下以 YOLOv5 官方仓库的train.py为例python train.py \ --data tt_data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 100 \ --cache \ --device 0参数含义分别为--data指定数据配置--weights指定预训练权重用yolov5s.pt做迁移学习比从头训练收敛快得多--img 640是把输入图片缩放和填充到 640×640--batch-size 16在显存允许的前提下尽量大它直接影响 BN 层的统计量估算--cache是把训练图片提前加载到内存省去每个 epoch 都重新读硬盘的时间--device 0指定用第一张 GPU。从 YOLOv5 6.0 之后默认开启--multi-scale的话每个 batch 会在 0.5 到 1.5 倍尺寸之间抖动。Tello 拍摄的画面里目标通常偏小所以--img 640够用如果检测的是足够大的目标比如近距识别二维码可以尝试--img 416换取更快的推理速度。对于超参数一般不建议第一次训练就大改。YOLOv5 自带一组默认的hyp.scratch-low.yaml它的学习率、动量、Warmup 轮数等设置已经针对 COCO 调过一轮。真正影响这套资源效果的其实是三类参数--epochs、--batch-size、和 anchor 尺寸。锚框是 YOLO 系列最“黑匣子”的部分。YOLOv5 默认 anchor 是基于 COCO 物体系列统计的如果你的目标在画面里占比很小比如 Tello 悬停 2 米高看一个锥桶默认 anchor 可能偏大。解决方法有两个一是训练时加--noautoanchor选项强制跳过自动适配二是先不加这个参数跑一小轮等训练结束看runs/train/exp/目录下anchors.png的 k-means 可视化再决定是否手动改模型配置文件里的anchors。实操建议# 先跑 30 个 epoch 看收敛趋势再决定是否续训 python train.py \ --data tt_data.yaml \ --weights yolov5s.pt \ --img 640 \ --batch-size 16 \ --epochs 30 \ --cache如果 30 轮后results.png里val/box_loss还在明显下降那就继续把last.pt作为预训练权重拉到 100 轮甚至 150 轮。注意这里用--weights runs/train/exp/weights/last.pt续训而不是重新用yolov5s.pt从头开始。3.3 模型验证与导出怎么判断模型真的训好了训练结束后不要急着上飞机先跑一遍验证python val.py \ --data tt_data.yaml \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --task val \ --conf-thres 0.25重点看mAP0.5和mAP0.5:0.95两项同时打开confusion_matrix.png看一眼有没有类别混淆。如果 mAP 值看起来还不错但用手机拍一张现场照片测出来效果很差多半是过拟合于训练集的光照条件这个后面避坑章节再展开。导出模型做嵌入式部署时我一般会顺手导一份 ONNXpython export.py \ --weights runs/train/exp/weights/best.pt \ --img 640 \ --include onnx \ --simplify导出的best.onnx可以扔给 OpenCV DNN 模块或者 ONNX Runtime如果后面想跑在树莓派 4B 或者 RK3568 这类边缘设备上这个 ONNX 还可以继续转成 rknn 格式。注意--simplify参数会调用 onnx-simplifier 重构图某些自定义算子可能被合并掉导出后最好先用onnxruntime加载推理一张图验证输出张量的维度与.pt文件结果一致。4. 在 Tello TT 上做实时检测与测距追踪测距的代码解析模型训好后真正的实战是把推理代码接到无人机视频流上。Tello TT 自带的摄像头是 960p 分辨率、FOV 比较广直接把原始帧塞给 YOLOv5 会影响帧率所以这一层的设计原则是低分辨率推理高分辨率显示。4.1 获取 Tello 视频流与帧预处理用 djitellopy 的get_frame_read()拿到的是 BGR 格式的 numpy 数组尺寸默认是 960×720。推理前需要做两件事缩放到 640×640 输入尺寸以及做归一化。YOLOv5 官方推理代码里已经内置了 letterbox 处理但如果只是最简单场景可以直接用 OpenCV 缩放import cv2 import numpy as np import torch from djitellopy import Tello # 加载训练好的模型 model torch.hub.load(ultralytics/yolov5, custom, pathweights/best.pt, force_reloadTrue) model.conf 0.45 model.iou 0.45 tello Tello() tello.connect() tello.streamon() frame_read tello.get_frame_read() while True: frame frame_read.frame # 原始 960p BGR 帧 if frame is None: continue # 推理缩放把长边压到 640保持宽高比 h, w frame.shape[:2] scale 640 / max(h, w) nw, nh int(w * scale), int(h * scale) resized cv2.resize(frame, (nw, nh)) # 转为 RGB 并转成 PyTorch 张量 results model(resized, size640) dets results.xyxy[0].cpu().numpy() # 把检测框坐标映射回原始 960p 坐标系 for x1, y1, x2, y2, conf, cls in dets: x1_, y1_, x2_, y2_ (int(x1 / scale), int(y1 / scale), int(x2 / scale), int(y2 / scale)) cv2.rectangle(frame, (x1_, y1_), (x2_, y2_), (0, 255, 0), 2) cv2.putText(frame, f{int(cls)} {conf:.2f}, (x1_, y1_ - 8), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2) cv2.imshow(Tello Detection, frame) if cv2.waitKey(1) 0xFF ord(q): break tello.streamoff() tello.end() cv2.destroyAllWindows()这段代码里的关键逻辑在于坐标还原。YOLOv5 推理是在 640×640 的图上做的而显示帧是 960×720如果不做坐标映射检测框会画在错误位置。scale是长边的缩放比例具体到 960×720 这帧640 / 960 0.6667推理后把框坐标除以这个比例就能回到原始分辨率。另一个值得注意的点是model.conf和model.iou两个阈值。默认conf0.25在室内 Tello 画面里会出现大量误检我一般拉到 0.4 到 0.5。iou0.45控制 NMS 的框去重程度如果两个目标靠得近被合并成一个框就调低到 0.3如果框有抖动就调高到 0.5。这两参数是典型的“血泪经验”调好它比你换模型效果好得多。4.2 追踪逻辑与测距计算像素怎么换算成物理距离“追踪测距”这四个字看起来高大上实际上在这套场景里常用的是基于几何关系的单目测距不需要双目标定也不需要深度相机。原理是已知目标物体的实际尺寸通过检测框的像素宽高比值换算距离。锥桶是一个很适合做测距的参照物因为它的物理高度基本固定。比如某款训练用的交通锥桶高度是 20cm那么距离计算公式如下# 已知参数 KNOWN_HEIGHT 0.20 # 锥桶实际高度单位米 FOCAL_LENGTH 620.0 # 像素焦距需要标定 def calc_distance(pixel_height): if pixel_height 0: return float(inf) return (KNOWN_HEIGHT * FOCAL_LENGTH) / pixel_heightFOCAL_LENGTH这个值怎么得到最简单的方式是标定法把锥桶放在离相机 1 米的位置量出它在画面里的像素高度然后代入FOCAL_LENGTH distance * pixel_height / KNOWN_HEIGHT反算出焦距。拿 Tello 的广角镜头来说不同分辨率下标定值会不一样所以重新跑这个脚本之前必须重新标定一次。把测距和上一小节的检测结合# 在检测循环内维护一个目标列表按左上角坐标排序 targets [] for x1, y1, x2, y2, conf, cls in dets: x1_, y1_, x2_, y2_ (int(x1 / scale), int(y1 / scale), int(x2 / scale), int(y2 / scale)) pixel_h y2_ - y1_ distance calc_distance(pixel_h) # 简单质心追踪判断当前目标与上一帧目标的最小中心距 cx, cy (x1_ x2_) // 2, (y1_ y2_) // 2 targets.append({ box: (x1_, y1_, x2_, y2_), center: (cx, cy), distance: distance }) cv2.putText(frame, f{distance:.2f}m, (x1_, y1_ - 28), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2)这里的追踪被我刻意简化成“最小中心距离匹配”没有引入卡尔曼滤波原因是 Tello 的云台和机身抖动会给运动模型带来很大噪声卡尔曼滤波参数调不好反而会让框跟不上。如果你之后想把算法迁移到无人小车平台上再考虑引入更完整的跟踪模块也不迟。追踪和测距的边界条件要提前想好当目标贴近画面边缘时检测框被裁断像素高度偏小算出的距离会偏大目标被部分遮挡时同理。所以一般只对中心点位于画面中间 80% 区域内的目标做测距超出区域则输出“INVALID”提示而不是给一个错的数字。4.3 安全控制与自动停止逻辑自动追踪加无人机安全控制是重中之重。这部分代码不长但逻辑必须严密否则飞行中模型误判会让飞机产生意料之外的动作。我在这个资源里倾向于只在检测到目标时做悬停跟随不做大幅度位移import time # 期望距离单位米 TARGET_DISTANCE 1.0 # 每次移动的最小距离和速度限制 tello.enable_mission_pads() tello.takeoff() SAFE_ZONE 0.15 # 距离误差安全区 try: while True: frame frame_read.frame # ... 上一小节的检测代码 ... if len(targets) 0: # 没检测到目标保持悬停并原地旋转找目标 tello.send_rc_control(0, 0, 0, 0) time.sleep(0.5) continue # 取距离最近的目标进行跟随 nearest min(targets, keylambda t: t[distance]) err nearest[distance] - TARGET_DISTANCE fwd_speed 0 if abs(err) SAFE_ZONE: # 线性映射到速度限制最大 0.2 m/s fwd_speed max(-0.2, min(0.2, err * 0.5)) # 只在前进/后退轴发送控制不控制方向 tello.send_rc_control(0, fwd_speed, 0, 0) time.sleep(0.1) finally: tello.send_rc_control(0, 0, 0, 0) tello.land()控制逻辑的核心是send_rc_control(left_right, forward_backward, up_down, yaw)这个四维速度指令。前后速度用误差的比例控制映射限制最大 0.2 m/s 避免飞机猛地冲出去。SAFE_ZONE 0.15米的意思是距离在期望值上下 15cm 认为已经到位不做调整避免在目标距离附近来回震荡。finally块保证无论程序正常退出还是异常中断都会先停止运动再降落。这条我建议每个飞手都养成习惯开发阶段可以手动断线触发保护机制测试一下land()是否能被正确调用而不是等到真飞起来才依赖这一层。5. 避坑指南Tello TT YOLOv5 调试中我踩过的六个具体坑这一章不写泛泛的经验只记录我实际调这套系统时遇到的、有明确“现象 - 原因 - 解决”路径的问题。每一条都对应真实飞行或训练场景。5.1 现象视频流画面有周期性卡顿检测框位置跳动原因Tello 的 2.4G WiFi 链路在室内干扰大的环境下UDP 视频流会发生丢包。由于frame_read.frame只是缓存最新一帧丢包后缓存里仍然是旧帧视觉上表现为画面跳回几帧前检测框也跟着瞬移。解决不要从 UDP 原始流上做太多计算先加一个简单的环形缓冲区只保留最近 5 帧检测时总是取最新完整帧。另一个有效办法是把视频码率调低。Tello SDK 支持set_video_bitrate命令我一般设置为 1Mbpstello.set_video_bitrate(1) # 1 表示 1Mbps减少无线链路负担在环境固定后可以把bitrate和fps的几种组合都录一段视频离线跑一遍检测对比每帧的归一化框偏移量而不是凭感觉调。5.2 现象训练时 loss 曲线一开始就出现大量震荡甚至到第 20 轮还降不下去原因标注文件里面出现了裁剪后的图片和原始图片混用图片尺寸不一致导致缩放后的标注坐标值整体偏移。另一个常见原因是数据集中同一种目标的标注框大小差异过大比如锥桶大图标注高度占 60%小图占 5%模型很难学习到一个统一的锚框尺度。解决先跑一遍前面那个检查脚本把所有越界和空标签文件列出来逐个确认。然后统计所有标注框的宽高分布看是不是集中在某个区间。如果同一个类别的标注框高度跨度超过 10 倍建议按图像尺寸分桶——把近景和远景图放到不同训练子集里或者用多尺度训练来缓解。5.3 现象训练好的模型在 Tello 实拍画面上检测不到目标但在电脑的测试图片上效果很好原因这是光照适配问题。训练集里都是白天自然光照的图片Tello 的镜头自动曝光在室内偏暗环境下会让锥桶和地板的对比度降低。模型学的颜色特征失效输出置信度全部低于阈值。解决最直接的办法是补充训练数据——用 Tello 本身在要飞的环境中拍 100 到 200 帧标注后加进训练集。如果不想重新标注至少有两条骗过模型的临时方案在推理前做 CLAHE 限制对比度自适应直方图均衡化增强或者把model.conf从 0.45 降到 0.25 配合model.iou从 0.45 提到 0.6允许更多候选框输出再靠 NMS 去重。第一种增强是治标第二种降低阈值是应急我实际操作中两种都常用。5.4 现象测距数值随飞机轻微悬停漂移误差超过 30%原因单目测距对目标像素高度的敏感性很高。假设锥桶像素高度是 80px焦距 620px距离算出来是 1.55 米如果因为飞机抖动像素高度变成 84px距离变成 1.48 米误差约 4.5%。看起来不大但 Tello 悬停时室内定位依靠视觉和气压计本身就有 20cm 级别的前后晃动距离误差累积后很容易超过 30%。解决测距数值加一个指数滑动平均滤波器把每帧距离的低通结果作为当前输出同时做高度限制只在 Tello 自身飞行高度处于 0.5 米到 2 米范围内时才启用测距功能。低于 0.5 米时锥桶可能在画面外高于 2 米时像素高度太小量化误差占主导。ema_dist 0.0 alpha 0.4 def smoothed_distance(raw): global ema_dist ema_dist alpha * raw (1 - alpha) * ema_dist return ema_distalpha越大滤波效果越弱、响应越快alpha越小越平滑、但延迟越大。我一般保持在 0.3 到 0.5 之间不要在实时控制回路里用小于 0.2 的值否则飞机已经冲到目标跟前了距离读数还在慢慢爬。5.5 现象模型在真机上推理速度太慢帧率只有 3 到 5 FPS原因在没有独立 GPU 的笔记本上跑 YOLOv5sCPU 推理一张 640×640 的图大约耗时 200ms 到 400ms加上 Tello 视频流的解码耗时会更高。如果开着 OpenCV 的imshow窗口还会因为渲染阻塞而进一步拉低帧率。解决第一选择是换用 ONNX Runtime 替代 PyTorch 推理通常可以把单帧耗时压到原来的一半以下。如果还想再快就把torch.hub.load换成直接加载 ONNX用 CPU session 或 OpenVINO 的 execution provider。实测下来Intel CPU 上用 OpenVINO provider 推理 yolov5s 的 640×640 输入单帧约 50ms 上下基本能达到 15 到 20 FPS足够课堂演示跟踪效果。import onnxruntime as ort import numpy as np # ONNX 推理替代 torch.hub 加载 sess ort.InferenceSession(best.onnx, providers[OpenVINOExecutionProvider, CPUExecutionProvider])注意 ONNX 输出的格式和 PyTorch 原生输出不一样best.onnx输出张量形状是(1, 25200, 5nc)需要手动做解码和 NMS。这也是为什么我在第三节推荐加--simplify后再做部署验证可以减少算子层面的不确定性。5.6 现象streamon()之后一直没有视频画面但控制指令正常原因Tello 的 UDP 视频流是从飞控独立发送到电脑的端口是 11111它的目标地址取决于 SDK 模式建立时的电脑 IP。如果电脑有多个网卡比如同时开着虚拟机网卡和无线网卡SDK 可能绑定到了错误的 IP导致视频流发到了一个不存在的接口。解决连上 Tello 热点后手动指定无线网卡 IP# Windows 下查看无线网卡 IP然后手工重设 ipconfig netsh interface ip set address nameWLAN static 192.168.10.2 255.255.255.0 192.168.10.1如果用的是 Ubuntu 或者树莓派确认ip addr中wlan0的地址是192.168.10.x网段最好是固定 IP 而不用 DHCP因为 Tello 内置的 DHCP 池只有很小的地址范围。这一步做完视频流一般就正常了。6. 进阶验证把这套系统从课堂演示推进到赛场实战的几个技巧如果之前的步骤都跑通了你已经有一套能飞的检测系统。但要让它真正稳定地服务于赛场或者公开课演示还需要做三件额外的事。第一件是标定距离的校准。不要相信算出来的焦距值一次标定就永远有效。Tello 镜头是定焦广角但不同型号之间有公差我习惯每次飞行前放一个已知尺寸的标定板或者锥桶在 1 米和 2 米两个位置各拍一张图更新FOCAL_LENGTH再起飞。这个步骤只需要一分钟但可以避免全场测距系统性偏大或偏小。第二件是验证 NMS 阈值在目标密集时的行为。真实的课堂场景里可能有多个锥桶互相紧挨着检测框之间会发生重叠。把model.iou从 0.45 调到 0.3 后重叠目标的独立检出率会明显提升但同时也会让单个目标出现重复框。我的习惯是在地面上先录制一段 20 秒的“双锥桶并排、前后错位”视频离线调好阈值后再上真机绝不在起飞状态下改参数。第三件是 ROS 平台复用。如果你后续想把检测模型接到无人小车或者别的机器人上这套权重可以直接通过torch.hub在 ROS 节点里调用不依赖 Tello SDK。我实际在 ROS 的camera话题里接过同样的best.pt只做话题订阅和检测结果发布改动量很小。也就是说这份资源的价值不在于一次无人机演示而在于把“训练 - 部署 - 嵌入式设备迁移”这条链路走通。从那以后我每次拿到新的数据集或者新场景的图片都会强制自己走一遍同样的标准化流程先跑标签检查脚本再用默认超参数跑 30 轮看收敛基线最后用 Tello 实拍画面做一次光照适配测试。这三步做完再决定要不要调超参数。这套流程帮我避开了很多所谓“玄学调参”的弯路也保证了课堂演示时不会当众翻车。希望这份拆解能帮你把系统更快跑起来也省掉我踩过的那些坑。本文还有配套的精品资源点击获取
RELATED

相关推荐

Sonora播放数据Scrobble指南:3分钟打通LastFM与ListenBrainz,听歌历史一键同步

Sonora播放数据Scrobble指南:3分钟打通LastFM与ListenBrainz,听歌历史一键同步

【免费下载链接】sonora A native music streaming client, built with Rust and GPUI 项目地址: https://gitcode.com/gh_mirrors/sonor/sonora 点击查看 免费下载 Sonora 是一款用 Rust 和 GPUI 构建的原生音乐串流客户端,内置 Scrobble(听…

📅 2026/10/11 22:32:17
中国象棋检测数据集VOC转YOLO训练实战:300张图也能训出可用模型

中国象棋检测数据集VOC转YOLO训练实战:300张图也能训出可用模型

简介:中国象棋检测数据集面向目标检测与棋类识别等应用场景,提供三百张棋盘图像的完整标注,标签体系覆盖黑红双方的十二种棋子类别,适用于模型训练、格式转换练习与算法验证。压缩包共包含九百零二个文件,其中有三百张…

📅 2026/10/11 22:32:17
Agent-Skills:智能体技能化架构设计与工程实践

Agent-Skills:智能体技能化架构设计与工程实践

1. 项目概述:一个被严重低估的“技能容器”概念“agent-skills”这个词组乍看像技术黑话,但拆开来看——agent 是智能体,skills 是技能。它不指代某个具体工具、框架或开源库,而是一种架构范式上的根本性转向:把传统上…

📅 2026/10/11 22:32:17
MORE NEWS

更多资讯

📰

DBSCAN聚类在MATLAB仿真中的原理、实现与调参避坑指南

简介:这是一套面向高校本硕博学生及算法初学者的DBSCAN数据聚类MATLAB仿真资源,围绕密度聚类原理,提供可运行的完整工程与配套操作录像,既可用于课堂教学演示,也适合算法竞赛和毕业设计中的聚类任务参考。整个RAR压缩包…

📰

药品包装盒数据集1032张VOC+YOLO双格式:训练、踩坑与迁移实战

简介:药品包装盒数据集包含1032张真实药品包装盒图片,已按Pascal VOC与YOLO两种主流格式完成标注,可直接用于目标检测模型的训练、验证和算法教学。包内共2000个文件,涵盖1032张jpg图像、1032个xml标注文件及1032个txt标注文件&am…

📰

课程设计管理系统与企业HR系统设计说明书撰写指南

简介:这份企业人力资源管理系统设计说明书面向计算机相关专业的课程设计、毕业设计学生及需要撰写开题报告与概要设计文档的开发者,围绕人事信息管理这一典型场景,提供从需求分析到模块实现的完整设计思路。压缩包内仅含1个doc文档&#xff0…

📰

华为IPD流程管理详解:以投资决策为核心的研发治理体系

简介:这套《华为IPD流程管理详细版》PPT课件共96页,围绕华为集成产品开发(IPD)方法展开,适合产品研发管理者、项目经理、流程管理人员及有意引入IPD体系的企业团队学习。资源包含1个PPT文件,体积2.32MB&…

📰

多智能体协作系统架构设计与工程实践:从角色划分到生产部署

1. 从"agency-agents"这个名字说起:它到底在解决什么问题第一次看到"agency-agents"这个组合词,很多人会愣一下——agency(代理/机构)加上agents(智能体/代理者),两个词义上…

📰

覆盖索引实战指南:从回表代价到联合索引设计

我第一反应是:这题我会的人不少,但真正用对覆盖索引的人真不多。大部分开发者对覆盖索引的理解停留在“不用回表、查询快”这个结论上。可真到线上排查慢查询,面对一个Extra列里写着的Using index,很多人又说不清它到底代表什么&a…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬