
简介基于YOLOv5与大疆教育无人机Tello TT实现目标识别、检测、追踪与测距的完整项目资源面向毕业设计、课程设计及K12人工智能教育场景能够帮助开发者快速掌握无人机视觉感知与目标追踪的核心流程。资源共1672个文件压缩包约269MB涵盖758张JPG数据集图像、694个TXT标注文件、94个YAML配置、50个Python源码脚本、9个PT格式训练好的模型权重以及Markdown说明文档、Shell训练脚本、Docker部署配置等便于按模块查阅与二次开发。已有461人学习下载部署后即可调用完整的识别检测与追踪测距功能。配套数据集、训练完成的模型权重及分段说明文档代码附有详细注释新手也能顺利上手可直接作为毕业设计、期末大作业或课程设计的高分参考项目也可用于无人机AI教学实验、目标跟踪算法验证及日常学习研究。1. 基于YOLOv5与大疆Tello TT一套能跑通的目标识别与追踪测距项目做无人机视觉的人多少都踩过同一个坑机载算力不够、数据集要自己标、训练好的模型部署到单片机上又跑不动。这套基于YOLOv5加大疆教育无人机Tello TT的资源把目标识别检测、追踪测距、源码、数据集和训练好的模型打包在一起拿到手之后改改路径就能复现。它的价值不在于代码多花哨而在于模型真的训练过、权重真的能用、推理脚本和无人机通信代码是通的不是那种只给了半截demo的期货项目。适合做毕业设计、课程设计或者期末大作业的学生也适合想快速验证一下“YOLOv5四旋翼”这套组合能不能落地的从业者。下面按我实际拆解的流程从环境说到部署最后讲几个比较容易翻车的地方。2. 环境搭建与远程控制让Tello TT先飞起来2.1 环境依赖清单与实际安装这套资源里模型是基于YOLOv5训练的权重文件是PyTorch格式.pt所以环境核心是PyTorch而不是TensorFlow。我在Windows 11和Ubuntu 20.04上都跑过PyTorch版本建议1.10以上、Python 3.8以上。YOLOv5对PyTorch版本比较敏感太老的版本会触发OperatorNotSupported之类的报错。# 创建独立环境避免污染系统Python conda create -n tello_yolo python3.8 conda activate tello_yolo # 安装PyTorchCPU版和CUDA版选一个 # 有NVIDIA独立显卡的装CUDA版显存4G以上建议用以下方式 pip install torch1.12.1cu113 torchvision0.13.1cu113 -f https://download.pytorch.org/whl/torch_stable.html # 纯CPU环境或老电脑用这个速度慢但能跑 pip install torch1.12.1 torchvision0.13.1 # YOLOv5依赖 pip install -r requirements.txtrequirements.txt在YOLOv5源码根目录下里面是opencv-python、numpy、matplotlib、seaborn这些常规库。安装完成后用一个小脚本验证环境是否正常import torch print(PyTorch版本:, torch.__version__) print(CUDA可用:, torch.cuda.is_available()) import cv2 print(OpenCV版本:, cv2.__version__)CUDA可用输出True说明显卡能参与模型推理如果输出False也别急模型仍能在CPU上运行只是检测帧率会从30FPS掉到5-8FPS做实时追踪会明显卡顿。我一般建议优先解决显卡加速不然跑通之后体验差距很大。2.2 局域网连接与视频流抓取Tello TT和普通Tello不一样的点在于它带教育扩展接口可以外接传感器或者用SDK做二次开发。但默认通信方式是一样的Tello自己开一个Wi-Fi热点电脑连接这个热点之后通过UDP协议发指令、收视频流。Tello的固定IP是192.168.10.1指令端口8888视频流端口11111状态端口8890。记住这三个端口号后面的代码全依赖它们。import socket import threading import cv2 import numpy as np # 指令UDP socket cmd_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) cmd_addr (192.168.10.1, 8888) cmd_socket.settimeout(5) # 状态UDP socket state_socket socket.socket(socket.AF_INET, socket.SOCK_DGRAM) state_socket.bind((, 8890)) # 视频流地址 video_addr udp://0.0.0.0:11111 def send_command(cmd): cmd_socket.sendto(cmd.encode(utf-8), cmd_addr) try: resp, _ cmd_socket.recvfrom(128) return resp.decode(utf-8) except socket.timeout: return timeout # 测试SDK通信 print(send_command(command)) # 进入SDK模式 print(send_command(battery?)) # 查询电量正常返回50-100之间的数字这段代码是Tello通信的最小骨架。send_command里先发command指令进入SDK模式之后才能控制起飞降落battery?是查询电池余量。这里有个细节进入SDK模式后Tello会持续往8890端口推状态包包括IMU姿态、气压计高度、速度、电量等如果不bind这个端口Tello会一直重发影响后续指令响应速度。2.3 键盘控制脚本与遥感参数控制这块我用的是类似tello-python的方式监听键盘事件来发指令。WASD控制前后左右空格起飞Shift降落方向键控制高度和旋转。指令集是Tello SDK的标准命令takeoff、land、up/down x、left/right x、forward/back x、cw/ccw x旋转、flip x特技翻转。import pygame def keyboard_control(): pygame.init() screen pygame.display.set_mode((100, 100)) controls { pygame.K_SPACE: takeoff, pygame.K_LSHIFT: land, pygame.K_w: forward 30, pygame.K_s: back 30, pygame.K_a: left 30, pygame.K_d: right 30, pygame.K_UP: up 30, pygame.K_DOWN: down 30, } while True: for event in pygame.event.get(): if event.type pygame.KEYDOWN: if event.key in controls: resp send_command(controls[event.key]) print(controls[event.key], -, resp)方向键和WASD的指令走的是同一个send_command不存在单独的控制通道。30是距离参数厘米可以改成5-100之间的任意整数数值越大单次移动距离越远。飞行模式下手感完全不同建议先在地面测试响应再起飞测试。2.4 Tello TT的SDK模式注意事项Tello TT作为教育版SDK指令和普通Tello基本一致只有个别指令有差异比如TT支持LIGHT命令控制扩展LED灯板普通Tello没有。跑资源里的控制脚本时如果报“command not found”类错误先确认固件版本——TT的固件要刷成教育版SDK不是消费版固件。这一步没法在代码层面解决但资源里的说明文档会提到固件匹配问题。网上有个玄学刷完教育版固件后第一次连Wi-Fi大概率要重启飞行器才会生效我遇到过三台TT都是这样不确定是不是个例。3. 训练自己的数据集从标注到模型收敛3.1 数据集目录结构与标注工具选择这套资源带的数据集是目标识别检测用的目录结构完全对标YOLOv5的数据组织方式。人工标注的框是矩形框加类别标签每一行代表一个目标格式是类别编号、归一化的中心x、中心y、归一化的框宽、框高。我先放目录结构和一份标注样例。dataset/ ├── images/ │ ├── train/ # 训练图片 │ └── val/ # 验证图片 ├── labels/ │ ├── train/ # 训练标签 │ └── val/ # 验证标签 ├── data.yaml # 数据配置 └── README.mddata.yaml内容大概是这样的train: dataset/images/train val: dataset/images/val nc: 2 names: [person, cone]nc是类别数量names是类别名。如果你的场景不止两类直接改这个文件不用动代码。标注工具我用的是labelImg保存格式选YOLO它自动生成txt文件类别编号从0开始。读取一张图片和它对应的label看一眼确认坐标是归一化的[class, x_center, y_center, w, h]全在0到1之间。如果哪个坐标大于1说明标注工具选错了格式存成了VOC的XMLYOLOv5训练时会直接报错或者mAP结果异常。3.2 数据集划分与类别不均衡处理YOLOv5在train.py里支持--train和--val参数但更常见的是直接在data.yaml里指定路径。数据划分我习惯按8:2如果样本特别多按9:1。有一种常见翻车情况训练集里类别A有5000个框类别B只有50个框模型会把B当背景精度再高也只预测A。处理方式是在训练参数里调整类别权重或者对B做离线数据增强——复制B的图片做翻转、亮度变化、加噪声。3.3 训练命令与核心超参说明训练这一步是最容易出玄学的地方YOLOv5的默认参数可以跑通但效果好不好完全看你怎么调。我把命令和参数说明拆开写。python train.py \ --weights yolov5s.pt \ --data dataset/data.yaml \ --epochs 100 \ --batch-size 16 \ --imgsz 640 \ --device 0 \ --workers 4 \ --cache--weights用yolov5s.pt做预训练权重比从头训练收敛快得多。--imgsz是输入分辨率640是速度和精度的折中想要更快就改成320想要更准就改成1280但TT的算力跑1280会掉帧到个位数不推荐。--batch-size受显存限制16G显存可以开到328G显存开16可能爆。爆显存的表现是CUDA out of memory解决方式是减半batch-size或者降低imgsz。--cache是把图片预加载到内存里第一次训练会等几十秒之后每个epoch明显提速。训练过程中主要盯两个指标box_loss定位损失和cls_loss分类损失它们整体下降就说明模型在学。还有一个指标是mAP0.5训练完自动输出0.5是最常用的目标检测评价阈值一般能到0.85以上就算合格了。训练结束后在runs/train/exp目录下会有best.pt和last.pt两个权重best.pt是验证集上最优的那个last.pt是最后一轮的结果。3.4 训练结果的产出物和权重文件跑完训练YOLOv5会生成几个关键文件除了训练日志还有混淆矩阵confusion_matrix.png、PR曲线PR_curve.png、验证集标注结果val_batch0_pred.jpg。做毕业设计时这些图可以直接放进论文附录。落地部署时只用best.pt就够了它包含了模型全部参数后面所有检测和追踪代码都基于这个文件。4. 推理与追踪测距实战把模型接到无人机视频流上4.1 用训练好的模型做静态图片推理先用静态图片验证模型有没有问题再做实时视频。这一步排错最简单图片如果检测不出来视频流一定也不行。import torch import cv2 model torch.hub.load(ultralytics/yolov5, custom, pathbest.pt, force_reloadTrue) model.conf 0.5 # 置信度阈值 model.iou 0.45 # NMS的IoU阈值 model.max_det 50 # 单张图片最多检测目标数 img cv2.imread(test.jpg) img_rgb cv2.cvtColor(img, cv2.COLOR_BGR2RGB) results model(img_rgb) results.show() # 弹窗显示检测结果conf是置信度阈值低于这个值的检测框会被过滤掉。0.5是常用值想检得多一些就降到0.3想减少误检就升到0.7。iou是NMS的IoU阈值0.45的意思是两个重合度超过45%的框只保留置信度高的防止同一个目标被多个框框住。这两个参数调起来立竿见影是后面做实时检测时主要调的两个旋钮。4.2 接入Tello视频流做实时检测Tello的视频流是UDP包的H.264编码数据OpenCV的VideoCapture直接打开udp地址是可以的但帧率不稳定偶发绿屏。我实测下来更稳的方案是用FFmpeg推流给OpenCV解码具体做法是把ffmpeg作为管道把解码后的原始帧喂给OpenCV。资源里有一段实时检测代码核心逻辑是把帧缩放、走YOLOv5推理、画框、显示FPS。# 读取Tello视频流并实时检测 cap cv2.VideoCapture(udp://0.0.0.0:11111) while True: ret, frame cap.read() if not ret: continue # YOLOv5推理输入尺寸和训练时保持一致 results model(frame, size640) # 画检测框和标签 annotated results.render()[0] cv2.imshow(Tello Detection, annotated) if cv2.waitKey(1) 0xFF ord(q): break这里size和训练时的imgsz必须一致否则宽高比变化会导致检测框偏移。实测在CPU上640分辨率的推理耗时约0.15秒帧率只有6-7FPS但作为毕设演示和课程报告完全够用。如果觉得卡把关键一步做了——resize到416再推理帧率翻倍。4.3 目标跟踪与测距的实现思路跟踪和测距是这套资源加分最明显的地方。目标跟踪用的是IOU匹配或者简单的卡尔曼滤波测距的思路是“已知真实高度——已知焦距——目标像素高度反推距离”核心实现如下。def estimate_distance(known_height, pixel_height, focal_length): # 真实星高米 / 像素高px 距离米 / 焦距px distance (known_height * focal_length) / pixel_height return distance # 使用示例tracker返回目标的像素高度 distance estimate_distance(0.3, 120, 350) print(f目标距离约: {distance:.2f}米)known_height是目标的真实高度比如一个交通锥0.3米pixel_height是图像中检测框的高度focal_length是相机焦距的像素值Tello摄像头的等效焦距约340-360像素不同固件略有差异。这个方法是单目测距的简化版精度一般误差10%-20%都正常。它不需要额外硬件纯靠像素换算演示效果已经够用了。真要精确测距学下双目视觉那个就是另一个项目了。4.4 追踪逻辑与代码参数陷阱追踪部分核心是把相邻帧的检测框做关联保证同一个目标在不同帧里是同一个编号。资源里有追踪代码原理就是匈牙利算法加卡尔曼滤波器。跑追踪代码时务必注意两点一是检测框坐标必须归一化二是帧率要稳定不然卡尔曼预测的轨迹会乱飘。常见的做法是给每个目标一个ID连续几帧没匹配上的ID先保留、超过一定帧数才删除防止目标被遮挡后ID跳变有经验的工程师叫它追踪的对象切换问题。5. 避坑指南环境、网络与控制的十三个坑5.1 Wi-Fi抖动导致视频流频繁断开现象Tello连接后视频流显示几秒就黑屏或者指令超时。 原因Tello自己发射的Wi-Fi信号穿墙能力差2.4G频段受干扰严重加上UDP协议本身不保证可靠传输。 解决手机开热点或者Tello直连电脑时尽量贴近飞行器不要隔墙。把电脑的电源管理设置为高性能模式网卡省电模式关掉实测能明显减少掉帧。视频流断开后用cap.release()重新打开udp地址即可恢复不用重启飞行器。5.2 Tello自带的RTOS对SDK命令响应有上限现象连续快速发指令时部分指令返回timeout。 原因Tello内部是RTOS系统SDK指令处理用的是一个串行队列发太快会丢弃部分请求。 解决每条指令之间加0.1-0.3秒延时或者用一个发送线程加队列避免高频轮询。我写控制脚本时用的是time.sleep(0.1)实测最稳。5.3 PyTorch与YOLOv5版本不匹配现象模型加载报KeyError或者Incompatible keys。 原因资源里训练的权重是某个特定YOLOv5 commit下生成的你的源码版本如果比训练时版本新模型结构参数对不上。 解决去YOLOv5官方仓库按时间戳checkout到对应commit再加载权重。或者看权重里保存的YAML文件把模型定义改成对应版本。这个坑几乎每个做YOLOv5复现的人都会遇到权重的兼容性没有想象中那么好。5.4 目标检测框抖动的根源现象目标不动检测框却来回小幅跳动。 原因YOLOv5的预测框带有置信度扰动输入噪声、光照变化、图片压缩都会影响输出。 解决平滑处理检测框坐标常见做法是滑动平均或者卡尔曼滤波。资源里的追踪代码内置了平滑逻辑直接用带追踪的版本不要用裸检测框做测距否则距离读数会乱跳。5.5 室外飞行时对着强光目标测距不准现象逆光环境下目标检测漏检测距数据突然跳变。 原因目标与背景对比度降低YOLO模型输入特征不明显同时过曝导致像素噪点增加。 解决开启Tello的曝光锁定或手动降低曝光让目标轮廓更清晰测距模块里加一个置信度检查低于阈值的帧不参与测距计算。6. 项目延伸把整套方案从demo变成能答辩的工具做完检测和追踪之后这套项目离“完整的毕业设计”还差一步——把这些能力组合成应用级系统。我在这个基础上做了三件事第一件是自动返航逻辑第二件是自定义类别迁移第三件是离线评估量化。先看自动返航的代码实现——当检测到目标是“人”并且持续跟踪超过30秒飞行器自动返回起飞点。def auto_return_if_target_lost(last_seen_frames, threshold30): # last_seen_frames为连续丢帧数threshold为阈值 if last_seen_frames threshold * 30: resp send_command(land) return True return False这个逻辑不复杂但答辩时演示效果非常好。把数据集里新增一类“电路板”做迁移学习也是类似的做法在data.yaml里加一个类别标注几十张图片用已有的best.pt继续训练几轮就能让模型学到新类别。做性能评估我用的是YOLOv5内置的val.py跑验证集把precision准确率、recall召回率、mAP0.5这几个指标打印出来。如果想展示模型效率还可以用torchscript把best.pt转为JIT格式输出文件大小对比和推理耗时对比表格。转型命令在YOLOv5源码里自带export.py注意CPU上适合转TorchScript转成ONNX是为了跨平台部署但那会增加依赖没必要在毕设阶段搞。最后说一个实战技巧把Tello视频流传到手机上看不需要额外软件只需要在电脑上跑一个UDP转发脚本把11111端口的数据转发到手机热点——这个技巧在室外演示时非常有用。从那以后我每次做这类无人机项目都会先花10分钟把断流恢复和自动降落写进主程序再开始调模型因为比起模型精度飞行器掉下来才是最致命的问题。希望帮到你。本文还有配套的精品资源点击获取