背景
无人机市场快速增长,也带来了严峻的空域安全问题。传统雷达和无线电监测对于小型消费级无人机(尺寸<50cm,飞行高度低)效果有限,漏报率高、成本贵。视觉方案随着YOLO系列算法的进步,逐渐成为可行替代。
YOLOv11在目标检测任务上达到了180FPS和69.3% mAP,且模型轻量化后可以跑在边缘设备上。这个项目就是尝试用YOLOv11构建一个无人机检测系统,结合实时视频流、告警和统计图表,成本控制在传统方案的十分之一。
整体设计
系统由模型训练、视频处理、用户界面三大块组成。技术栈选型如下:
| 模块 | 技术实现 | 功能 |
|---|---|---|
| 模型训练 | Ultralytics YOLO | 使用自定义数据集训练无人机检测模型 |
| 视频处理 | OpenCV 4.5 | 实时视频流采集、预处理与后处理 |
| 用户界面 | PyQt5 | 主窗口、控制面板、实时画面和统计图表 |
| 数据可视化 | Matplotlib | 检测结果的柱状图/折线图 |
| 性能加速 | ONNX Runtime | 模型导出与推理加速,适配Jetson等边缘设备 |
训练流程是:数据采集 → 标注 → 增强 → 训练 → 评估 → 导出。关键训练参数如下:
model = YOLO('yolov11s.yaml') # 使用small版本减小计算量
model.train(
data='drone.yaml', # 自定义数据集配置
epochs=300,
batch=16,
imgsz=640,
optimizer='AdamW',
lr0=0.01,
device='0' # GPU加速
)
UI交互与多线程
用PyQt5搭了一个带视频显示、控制按钮和实时图表的主窗口。检测线程从摄像头拉流、跑推理,然后通过信号槽把结果传回主线程更新画面和统计。
class DetectionThread(QThread):
def run(self):
while running:
frame = camera.get_frame()
results = model.predict(frame)
emit signal_results_ready(results)
class MainWindow(QMainWindow):
def __init__():
.video_label = QLabel()
.start_btn = QPushButton()
.chart_view = QGraphicsView()
.detection_thread.signal_results_ready.connect(.update_ui)
():
frame = results.render()
pixmap = QPixmap.fromImage(frame)
.video_label.setPixmap(pixmap)
.update_chart(results)

