• 正文
  • 相关推荐
申请入驻 产业图谱

AI安防新方案:基于视觉的无人机检测和跟踪系统

09/09 09:36
2343
加入交流群
扫码加入
获取工程师必备礼包
参与热点资讯讨论

无人机正变得越来越普遍,无论是出于娱乐目的还是商业目的,但在飞越禁区时也存在潜在的安全风险。自动化无人机检测和跟踪可帮助组织实时监控其空域、快速识别潜在威胁并主动做出响应。通过将计算机视觉与 YOLOv8 等人工智能模型相结合,安全团队可以获得一个智能、可扩展的解决方案,不仅可以检测无人机,还可以可视化无人机的移动并及时触发警报。

在本教程中,我们将在 Roboflow 的自定义无人机数据集上重新训练 YOLOv8 模型,以实时检测和跟踪无人机。最终输出将是一个显示实时检测和跟踪的视频网格,可以集成到安全系统中,以可视化无人机活动并自动触发警报。

创建用于无人机检测的安全代理

以下代码设置环境,以训练和测试 YOLOv8 模型,以进行实时无人机检测和跟踪。此项目的所有代码,包括数据集准备、模型训练和可视化,都可以在 GitHub 存储库中找到。

https://github.com/yauheniya-ai/security-agent.git

安装依赖

除了 Python 的标准库(如 os 和 random )之外,该项目还需要几个外部库:cv2(OpenCV) 和numpy,pandas,matplotlib,imageio,ultralytics(Ultralytics YOLOv8 用于对象检测的库)。您可以通过以下方式安装它们:

pip install opencv-python numpy pandas matplotlib imageio ultralytics

此外,根据您的系统,您可能需要 GPU 支持来加速训练和推理:

NVIDIA GPU (CUDA) — 常见于台式机和某些笔记本电脑;通过torch.cuda.is_available()检测到 。

Apple Silicon (M1/M2) GPU — 通过 macOS 上的金属性能着色器 (MPS) 支持;通过torch.backends.mps.is_available()检测到 。

数据集采集:来自 Roboflow 的带有边界框的无人机图像

安装好依赖后,下一步就是获取无人机的数据集进行训练和评估。对于这个项目,我们使用 Roboflow 上免费提供的数据集(需要免费帐户和简单的注册)。

https://universe.roboflow.com/uav-i6z6x/uav-detection-zlcin

该数据集包含 4,950 张无人机的标记图像,其中每个注释都包含相对百分比值(在 0 和 1 之间归一化)的边界框坐标。由于这种规范化格式,当我们在预处理或训练期间调整图像大小时,边界框会自动缩放,这意味着不需要手动调整标签。

从 Roboflow 下载数据集时,选择 YOLOv8 作为导出格式。在下载过程中,系统会询问您是否要应用预处理步骤,例如调整大小或数据增强(翻转、旋转、亮度变化等)。此步骤是可选的,因为您也可以稍后在训练期间在 Python 中应用这些转换。

数据集已经拆分为训练集和有效集,每个文件夹都包含图像及其相应的边界框标签。无需创建额外的测试拆分,因为我们将使用单独的无人机视频来评估检测和跟踪性能。

训练数据集的标记多种多样:并非每张图像都只包含一架无人机。有些图像根本不包含无人机,而另一些图像则包含多架无人机,这使得数据集更加逼真,对于训练稳健的检测模型更有用。

Total train images: 3958Images with no drones: 506Images with one drone: 3180Images with multiple drones: 272Average number of drones per image: 1.04

设置数据集的最后一步是将下载 Roboflow 数据集时自动提供的data.yaml文件放入项目根文件夹中。

train: ./data/train/imagesval: ./data/valid/imagesnc: 1names: ['uav']roboflow:  workspace: dronedetection-jkeyg  project: uav-detection-zlcin-1wcbm  version: 1  license: CC BY 4.0  url: https://universe.roboflow.com/dronedetection-jkeyg/uav-detection-zlcin-1wcbm/dataset/1

训练模型

为了有效地检测无人机,我们不会从头开始训练。相反,我们使用重新训练的 YOLOv8 模型,这意味着我们采用现有的预训练模型,并在我们的自定义无人机数据集上对其进行微调。这种方法加快了训练速度,减少了所需数据量,并利用了 YOLO 已经学到的一般对象识别知识。

YOLOv8 提供多种预训练变体,每种变体都能平衡速度、大小和准确性:

yolov8n.pt — Nano:最快、最小,最适合实时/边缘设备。

yolov8s.pt — 小:仍然轻巧但更准确。

yolov8m.pt — 中:平衡的尺寸和精度。

yolov8l.pt — 大:速度较慢,但更准确。

yolov8x.pt — 超大:最准确,需要强大的硬件。

以下是我们如何加载预训练模型并在数据集上对其进行微调:

model = YOLO("yolov8n.pt") # download the model from the internet#model = YOLO("./yolov8n.pt") # use local modelresults = model.train(    data="data.yaml",    epochs=80,    imgsz=120,              # resize to speed up the training    batch=16,    device="mps",           # GPU: 0, CPU: 'cpu', MPS: 'mps'    workers=4               # num_workers = max(1, os.cpu_count() - 1))

我们设置了数据集 (data.yam)、epochs(80 个训练周期)、调整大小的图像大小(120×120 以加快训练速度)和批量大小(每步 16 张图像)。device告诉 YOLO 是使用 CPU、CUDA GPU 还是 Apple MPS,同时workers=4定义了并行加载数据的 CPU 进程数。

您可以通过os.cpu_count()检查系统有多少个 CPU 内核并将其设置为该数字减去 1 来确定最佳内核num_workers,以便系统始终保留一个内核空闲用于其他任务。

在训练过程中,YOLOv8 模型在多个时期迭代更新其权重,最大限度地减少损失函数(box_loss,cls_loss,dfl_loss),以提高其对无人机的检测和分类能力。在每个纪元之后,都会根据验证集对模型进行评估,报告精度、召回率和衡量其检测准确性的 mAP(平均平均精度)分数。在我的 MacBook M1 上,80 个 epoch 的训练在大约 5.2 小时内完成。

训练日志保存训练损失 (box_loss, cls_loss, dfl_loss) 和评估指标,例如精度、召回率、mAP@0.5 和 mAP@0.5:0.95,以及验证损失和学习率。在图中,我们可视化了损失曲线(模型在训练过程中如何改进)和准确性曲线(验证集上的 mAP 分数)(图 3)。在最后的第80个纪元,该模型的精度为0.87,召回率为0.81,mAP@0.5为0.86,表明检测性能强,在误报和漏检之间取得了合理的平衡。

根据绘制的曲线,训练尚未完全趋于稳定,因此运行额外的 epoch 可能会提高准确性。由于我们训练了最小的模型 yolov8n.pt,因此尝试较大的变体(如 yolov8s、m、l 或 x)可能会进一步提高精度和鲁棒性

在无人机视频上测试模型

模型训练完成后,下一步是在真实的无人机镜头上对其进行测试。您可以使用任何可用的无人机视频,也可以从 GitHub 存储库下载示例视频(已调整大小并裁剪为每个 8 秒)以进行作。这个想法是看看经过训练的YOLOv8 模型对运动中的无人机的检测和跟踪能力如何。

TRAINING = "train7" # specify, which model run to use# Load your trained modelmodel = YOLO(f"runs/detect/{TRAINING}/weights/best.pt")  # or last.ptinput_folder = "./videos_resized_cropped"output_folder = "./videos_pred"os.makedirs(output_folder, exist_ok=True)for filename in os.listdir(input_folder):    if filename.endswith(".mov"):        input_path = os.path.join(input_folder, filename)        output_path = os.path.join(output_folder, filename)        # Run prediction on the video        results = model.predict(            source=input_path,            save=True,       # saves video with bboxes drawn            save_txt=True,   # saves YOLO-format labels            project=output_folder,            name=filename.split(".")[0],  # separate folder per video            exist_ok=True        )

为了进行预测,我们首先加载最佳训练权重,然后对每个测试视频运行推理。YOLOv8 会自动保存处理后的视频,并在检测到的无人机周围绘制边界框,以及包含预测详细信息的 YOLO 格式文本文件。这允许对结果进行目视检查,并在需要时进行定量分析。

input_folder = "./videos_pred"output_file = "videos_grid_5s.gif"# Recursively get all .mp4 filesvideo_files = []for root, dirs, files in os.walk(input_folder):    for file in files:        if file.endswith(".mp4"):            video_files.append(os.path.join(root, file))video_files = sorted(video_files)[:9]num_videos = len(video_files)caps = [cv2.VideoCapture(v) for v in video_files]frame_width, frame_height = 300, 225grid_width = frame_width * 3grid_height = frame_height * 3fps = 10 # target GIF frames per second (FPS)duration = 1 / fps  # duration per frame in secondsmax_frames = fps * 5  # 5 secondsfinished = [False] * num_videosframes_list = []while not all(finished) and len(frames_list) < max_frames:    frames = []    for i, cap in enumerate(caps):        if finished[i]:            frames.append(np.zeros((frame_height, frame_width, 3), dtype=np.uint8))            continue        ret, frame = cap.read()        if not ret:            finished[i] = True            frames.append(np.zeros((frame_height, frame_width, 3), dtype=np.uint8))        else:            frame = cv2.resize(frame, (frame_width, frame_height))            frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)            frames.append(frame)    # 3x3 grid    grid_rows = [np.hstack(frames[i:i+3]) for i in range(0, 9, 3)]    grid_frame = np.vstack(grid_rows)    frames_list.append(grid_frame)for cap in caps:    cap.release()# Save GIFimageio.mimsave(output_file, frames_list, duration=duration, loop=0)print(f"Grid GIF saved as {output_file}")

为了在单个视图中总结所有预测,我们可以将多个输出视频编译成一个 3×3 网格并将其保存为 GIF。GIF 的每一帧组合了多达 9 个已处理视频的同步帧,调整大小并排列成网格。通过将播放时间限制在 5 秒并降低分辨率,我们得到了一个轻量级的预览动画,展示了无人机检测结果的实际效果。

从原型到安全代理

该项目展示了如何使用YOLOv8 进行对象检测和跟踪,从研究扩展到现实世界的安全作。通过将训练好的模型连接到实时安全摄像头馈送,系统可以自动检测和跟踪无人机,实时可视化警报,甚至触发自动响应。这种方法增加了一个智能监控层,可以加强周界防御并减少人工监控的需要。

相关推荐