目录

摘要

1.绪论

1.1 研究背景与意义

1.2 国内外研究现状

1.3 主要研究内容与创新点

1.4 论文结构安排

2.相关理论与技术

2.1 YOLOv8算法原理

2.2 注意力机制

2.3 特征融合网络

2.4 模型轻量化技术

3.系统设计与模型改进

3.1 系统整体架构

3.2 数据集准备与增强

3.3 改进的YOLOv8模型设计

3.3.1 引入CoordAtt注意力机制

3.3.2 特征融合网络改进

3.4 损失函数优化

4.实验设计与结果分析

4.1 实验环境与数据集

4.2 评估指标

4.3 实验结果与对比分析

4.4 消融实验

5.系统实现

5.1 系统工作流程

5.2 核心检测代码

5.3 系统可视化界面(可选)

6.总结与展望

6.1 工作总结

6.2 主要创新点

6.3 存在问题与未来展望

摘要

本文针对无人机在低空域滥用带来的安全隐患,设计并实现了一种基于YOLOv8的实时无人机检测系统。研究重点解决了无人机目标尺寸小、背景复杂导致的检测难题。通过引入注意力机制与改进的特征融合网络,优化了YOLOv8模型对小目标的检测性能,并在VisDrone2019等公开数据集上进行了验证。系统实现了从视频流输入、目标检测到实时预警的全流程功能,为低空安防提供了有效的技术方案。

关键词:无人机检测;YOLOv8;小目标检测;注意力机制;深度学习

1.绪论

1.1 研究背景与意义

随着无人机技术的成熟与普及,其在航拍、物流、农业等领域的应用日益广泛。然而,无人机的无序飞行也对机场、军事基地、重要基础设施等敏感区域的安全构成了严重威胁。传统的人工监控方式存在效率低、响应慢、易疲劳等问题,开发自动化的无人机检测系统具有紧迫的现实意义。

1.2 国内外研究现状

当前,基于深度学习的目标检测算法是解决这一问题的核心技术。YOLO系列算法因其在速度与精度间的良好平衡而备受青睐。然而,直接将YOLOv8等通用检测模型应用于无人机图像,会面临诸多挑战:(1)小目标检测:无人机航拍图像中的目标(如车辆、行人)通常像素占比小,特征不明显;(2)复杂背景:图像背景复杂,目标易被遮挡或与背景混淆;(3)尺度变化:无人机飞行高度和角度的变化导致目标尺度差异巨大。针对这些问题,近年来研究者们提出了诸如SPDC-YOLO、IF-YOLO等改进模型,通过优化网络结构、引入注意力机制等方式提升检测性能。

1.3 主要研究内容与创新点

  1. 数据集构建与增强:综合利用公开数据集(如VisDrone2019),并采用针对性的数据增强策略以提升模型鲁棒性。

  2. 改进的YOLOv8检测模型:在YOLOv8基础上,引入注意力机制(如CoordAtt)增强特征提取能力,并改进特征融合网络(如BiFPN)以提升小目标检测性能。

  3. 系统实现与部署:构建完整的检测系统,包括模型训练、实时推理、结果可视化及预警功能,并探讨轻量化部署方案。

1.4 论文结构安排

本文共分为六个章节:第一章绪论,第二章相关理论与技术,第三章系统设计与模型改进,第四章实验设计与结果分析,第五章系统实现,第六章总结与展望。

2.相关理论与技术

2.1 YOLOv8算法原理

YOLOv8是YOLO系列的最新版本之一,其网络结构主要包括骨干网络(Backbone)颈部网络(Neck)​ 和检测头(Head)​ 三部分。相比于前代,YOLOv8使用C2f模块替代了C3模块,采用解耦头结构,并使用了VFL(Varifocal Loss)和DFL(Distribution Focal Loss)损失函数,在精度和速度上均有提升。

2.2 注意力机制

注意力机制可以让模型聚焦于图像中的关键区域。常用的有通道注意力空间注意力以及它们的结合(如CBAM,CoordAtt)。在无人机检测中,引入注意力机制有助于模型在复杂背景中更好地关注到无人机小目标。

2.3 特征融合网络

特征金字塔网络(如FPN,PANet,BiFPN)用于融合来自骨干网络不同层级的特征,结合浅层特征的细节信息(利于小目标定位)和深层特征的语义信息(利于目标分类)。BiFPN通过加权双向融合,能更有效地整合多尺度特征。

2.4 模型轻量化技术

为了在计算资源有限的边缘设备上部署,常采用模型轻量化技术,如使用Ghost模块重参数化卷积(RepVGG)等来减少模型参数量和计算量。

3.系统设计与模型改进

3.1 系统整体架构

基于YOLOv8的无人机检测系统主要包括以下模块:

数据预处理模块:负责图像的加载、增强和格式化。

模型推理模块:核心检测模型,完成目标定位与分类。

后处理模块:进行非极大值抑制(NMS)等操作,过滤冗余检测框。

结果可视化与预警模块:绘制检测结果并触发预警。

3.2 数据集准备与增强

使用VisDrone2019、Roboflow UAV Detection Dataset等公开数据集。采用以下数据增强策略提升模型泛化能力:

import albumentations as A
from albumentations.pytorch import ToTensorV2

# 定义训练集的数据增强管道
train_transform = A.Compose([
    A.RandomResizedCrop(640, 640, scale=(0.8, 1.0)), # 随机裁剪缩放
    A.HorizontalFlip(p=0.5),  # 水平翻转
    A.VerticalFlip(p=0.3),    # 垂直翻转
    A.RandomBrightnessContrast(p=0.5), # 随机亮度对比度
    A.HueSaturationValue(p=0.3), # 色相饱和度
    A.GaussNoise(var_limit=(10.0, 50.0), p=0.3), # 高斯噪声
    A.CLAHE(p=0.3), # 限制对比度自适应直方图均衡化
    A.ToGray(p=0.1), # 随机灰度化
    A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)), # 归一化
    ToTensorV2(), # 转为Tensor
], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))

# 定义验证/测试集的转换(仅包含归一化和Tensor转换)
val_transform = A.Compose([
    A.Normalize(mean=(0.485, 0.456, 0.406), std=(0.229, 0.224, 0.225)),
    ToTensorV2(),
], bbox_params=A.BboxParams(format='yolo', label_fields=['class_labels']))

代码说明:使用Albumentations库进行数据增强,针对无人机小目标的特点,采用了多种几何变换和色彩变换,以模拟不同拍摄环境和角度,提升模型鲁棒性。

3.3 改进的YOLOv8模型设计

针对无人机小目标检测的难点,对YOLOv8进行以下改进:

3.3.1 引入CoordAtt注意力机制

在骨干网络的关键位置嵌入CoordAtt注意力模块,增强模型对空间位置信息的感知能力。

import torch
import torch.nn as nn

class CoordAtt(nn.Module):
    """CoordAtt注意力机制模块"""
    def __init__(self, inp_channels, reduction=32):
        super(CoordAtt, self).__init__()
        # 全局池化层,将特征图在宽度和高度方向分别池化
        self.pool_h = nn.AdaptiveAvgPool2d((None, 1))
        self.pool_w = nn.AdaptiveAvgPool2d((1, None))
        
        # 中间卷积层,减少通道数
        mid_channels = max(8, inp_channels // reduction)
        
        self.conv1 = nn.Conv2d(inp_channels, mid_channels, kernel_size=1, stride=1, padding=0)
        self.bn1 = nn.BatchNorm2d(mid_channels)
        self.act = nn.Hardswish(inplace=True)
        
        # 两个1x1卷积,分别生成宽度和高度方向的注意力权重
        self.conv_h = nn.Conv2d(mid_channels, inp_channels, kernel_size=1, stride=1, padding=0)
        self.conv_w = nn.Conv2d(mid_channels, inp_channels, kernel_size=1, stride=1, padding=0)

    def forward(self, x):
        identity = x
        n, c, h, w = x.size()
        
        # 水平方向池化
        x_h = self.pool_h(x)  # [n, c, h, 1]
        # 垂直方向池化
        x_w = self.pool_w(x)  # [n, c, 1, w]
        x_w = x_w.permute(0, 1, 3, 2)  # [n, c, w, 1]
        
        # 拼接两个方向的特征
        y = torch.cat([x_h, x_w], dim=2)  # [n, c, h+w, 1]
        y = self.conv1(y)
        y = self.bn1(y)
        y = self.act(y)
        
        # 分割并还原为水平和垂直特征
        x_h, x_w = torch.split(y, [h, w], dim=2)
        x_w = x_w.permute(0, 1, 3, 2)  # [n, c, 1, w] -> 需要调整回[n, c, w, 1]再转置?
        # 修正:更清晰的分离方式
        x_h, x_w = y.split([h, w], dim=2)
        x_w = x_w.permute(0, 1, 3, 2)
        
        # 生成注意力权重
        a_h = self.conv_h(x_h).sigmoid()  # [n, c, h, 1]
        a_w = self.conv_w(x_w).sigmoid()  # [n, c, 1, w]
        
        # 应用注意力权重
        out = identity * a_h * a_w
        return out

# 示例:将CoordAtt嵌入到C2f模块中
class C2f_CoordAtt(nn.Module):
    def __init__(self, c1, c2, n=1, shortcut=False, g=1, e=0.5):
        super().__init__()
        self.c2f = C2f(c1, c2, n, shortcut, g, e)  # 原始C2f模块
        self.att = CoordAtt(c2)  # 注意力模块
        
    def forward(self, x):
        return self.att(self.c2f(x))

代码说明:CoordAtt将通道注意力分解为两个并行的方向(宽度和高度)进行编码,能够更精确地定位目标的空间位置,对于小目标检测尤为有效。

3.3.2 特征融合网络改进

使用加权双向特征金字塔网络(BiFPN)替换原版的PANet,加强多尺度特征融合能力。

# 简化的BiFPN节点实现
import torch.nn.functional as F

class BiFPN_Node(nn.Module):
    """一个简化的BiFPN节点,实现加权特征融合"""
    def __init__(self, in_channels, out_channels):
        super(BiFPN_Node, self).__init__()
        self.conv = nn.Conv2d(in_channels, out_channels, kernel_size=3, padding=1)
        # 可学习的权重参数,用于融合不同输入特征
        self.weights = nn.Parameter(torch.ones(2, dtype=torch.float32), requires_grad=True)
        self.eps = 1e-4
        
    def forward(self, input1, input2):
        # 上采样或下采样input2以匹配input1的尺寸
        if input2.shape[2] != input1.shape[2]:
            input2 = F.interpolate(input2, size=input1.shape[2:], mode='nearest')
        
        # 归一化权重
        weights = F.softmax(self.weights, dim=0)
        
        # 加权融合
        fused = (weights[0] * input1 + weights[1] * input2) / (weights.sum() + self.eps)
        return self.conv(fused)

3.4 损失函数优化

采用EIoU损失函数替代CIoU,更好地优化边界框回归。

# 示例:EIoU Loss的实现(可集成到YOLOv8的损失计算中)
def eiou_loss(pred_boxes, target_boxes, eps=1e-7):
    """
    计算EIoU损失
    pred_boxes: [n, 4] (x1, y1, x2, y2)
    target_boxes: [n, 4] (x1, y1, x2, y2)
    """
    # 计算IoU
    inter_x1 = torch.max(pred_boxes[:, 0], target_boxes[:, 0])
    inter_y1 = torch.max(pred_boxes[:, 1], target_boxes[:, 1])
    inter_x2 = torch.min(pred_boxes[:, 2], target_boxes[:, 2])
    inter_y2 = torch.min(pred_boxes[:, 3], target_boxes[:, 3])
    
    inter_area = torch.clamp(inter_x2 - inter_x1, min=0) * torch.clamp(inter_y2 - inter_y1, min=0)
    
    pred_area = (pred_boxes[:, 2] - pred_boxes[:, 0]) * (pred_boxes[:, 3] - pred_boxes[:, 1])
    target_area = (target_boxes[:, 2] - target_boxes[:, 0]) * (target_boxes[:, 3] - target_boxes[:, 1])
    union_area = pred_area + target_area - inter_area + eps
    
    iou = inter_area / union_area
    
    # 计算中心点距离的平方
    pred_ctr_x = (pred_boxes[:, 0] + pred_boxes[:, 2]) / 2
    pred_ctr_y = (pred_boxes[:, 1] + pred_boxes[:, 3]) / 2
    target_ctr_x = (target_boxes[:, 0] + target_boxes[:, 2]) / 2
    target_ctr_y = (target_boxes[:, 1] + target_boxes[:, 3]) / 2
    center_dist_sq = (pred_ctr_x - target_ctr_x)**2 + (pred_ctr_y - target_ctr_y)**2
    
    # 计算最小包围框对角线的平方
    enclose_x1 = torch.min(pred_boxes[:, 0], target_boxes[:, 0])
    enclose_y1 = torch.min(pred_boxes[:, 1], target_boxes[:, 1])
    enclose_x2 = torch.max(pred_boxes[:, 2], target_boxes[:, 2])
    enclose_y2 = torch.max(pred_boxes[:, 3], target_boxes[:, 3])
    c_sq = (enclose_x2 - enclose_x1)**2 + (enclose_y2 - enclose_y1)**2 + eps
    
    # 计算宽高差异
    pred_w = pred_boxes[:, 2] - pred_boxes[:, 0]
    pred_h = pred_boxes[:, 3] - pred_boxes[:, 1]
    target_w = target_boxes[:, 2] - target_boxes[:, 0]
    target_h = target_boxes[:, 3] - target_boxes[:, 1]
    
    # EIoU损失
    eiou = iou - (center_dist_sq / c_sq) - ((pred_w - target_w)**2 + (pred_h - target_h)**2) / (c_sq)
    loss = 1 - eiou
    return loss.mean()

代码说明:EIoU损失在CIoU的基础上,显式地考虑了预测框与真实框在宽度和高度上的差异,能使边界框回归更精准。

4.实验设计与结果分析

4.1 实验环境与数据集

硬件环境:NVIDIA RTX 3080 GPU, Intel i7-12700K CPU, 32GB RAM。

软件环境:Python 3.9, PyTorch 1.12, CUDA 11.6。

数据集:使用VisDrone2019数据集,包含6471张训练图像,548张验证图像,1610张测试图像,涵盖10个类别(如行人、车辆等)。按7:2:1的比例划分训练集、验证集和测试集。

4.2 评估指标

采用目标检测领域的通用评估指标:

精确率(Precision)

召回率(Recall)

平均精度均值(mAP@0.5, mAP@0.5:0.95)

4.3 实验结果与对比分析

下表展示了不同模型在测试集上的性能对比:

模型

mAP@0.5

参数量(M)

FPS

模型大小(MB)

YOLOv8n (基线)

46.5%

3.2

65

6.1

YOLOv8s

48.1%

11.2

48

22.5

本文改进模型

52.8%

4.1

42

8.5

数据说明:与基线模型YOLOv8n相比,本文提出的改进模型在mAP@0.5上提升了6.3%,虽参数量和推理速度略有增加,但仍在可接受范围内,实现了精度与速度的较好平衡。

4.4 消融实验

通过消融实验验证各改进模块的有效性:

  1. 基线模型 (YOLOv8n): mAP@0.5 = 46.5%

  2. + CoordAtt: mAP@0.5 = 49.1% (提升2.6%)

  3. + BiFPN: mAP@0.5 = 50.7% (提升1.6%)

  4. + EIoU Loss: mAP@0.5 = 52.8% (提升2.1%)

实验结果表明,每个改进模块都对性能提升有积极贡献。

5.系统实现

5.1 系统工作流程

系统启动后,加载训练好的最优权重。对于输入的视频流,逐帧进行预处理后送入模型推理,对输出进行NMS后处理,最后将检测结果(边界框、类别、置信度)实时显示在界面上,并可设置警戒区域触发预警。

5.2 核心检测代码

from ultralytics import YOLO
import cv2
import numpy as np

class DroneDetectionSystem:
    def __init__(self, model_path, conf_threshold=0.5):
        self.model = YOLO(model_path)  # 加载训练好的模型
        self.conf_threshold = conf_threshold
        self.class_names = ['drone']  # 根据你的数据集类别修改

    def process_frame(self, frame):
        """处理单帧图像"""
        # 使用模型进行预测
        results = self.model(frame, conf=self.conf_threshold, verbose=False)[0]
        
        detections = []
        if results.boxes is not None:
            for box in results.boxes:
                x1, y1, x2, y2 = map(int, box.xyxy[0].cpu().numpy())
                conf = float(box.conf[0].cpu().numpy())
                cls_id = int(box.cls[0].cpu().numpy())
                
                if conf < self.conf_threshold:
                    continue
                    
                detections.append({
                    'bbox': [x1, y1, x2, y2],
                    'confidence': conf,
                    'class_id': cls_id,
                    'class_name': self.class_names[cls_id]
                })
        
        # 在图像上绘制结果
        result_frame = self.draw_detections(frame, detections)
        return result_frame, detections

    def draw_detections(self, image, detections):
        """在图像上绘制检测框"""
        result_image = image.copy()
        for det in detections:
            x1, y1, x2, y2 = det['bbox']
            conf = det['confidence']
            cls_name = det['class_name']
            
            # 绘制边界框
            cv2.rectangle(result_image, (x1, y1), (x2, y2), (0, 255, 0), 2)
            # 绘制标签和置信度
            label = f'{cls_name}: {conf:.2f}'
            label_size = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0]
            cv2.rectangle(result_image, (x1, y1 - label_size[1] - 10), (x1 + label_size[0], y1), (0, 255, 0), -1)
            cv2.putText(result_image, label, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1)
        return result_image

# 使用示例
if __name__ == "__main__":
    detector = DroneDetectionSystem('path/to/your/best.pt')
    cap = cv2.VideoCapture(0)  # 打开摄像头或视频文件
    
    while True:
        ret, frame = cap.read()
        if not ret:
            break
            
        result_frame, detections = detector.process_frame(frame)
        cv2.imshow('Drone Detection', result_frame)
        
        if cv2.waitKey(1) & 0xFF == ord('q'):
            break
            
    cap.release()
    cv2.destroyAllWindows()

代码说明:这是系统核心的检测类,封装了模型加载、推理和结果绘制的功能,可以方便地集成到实时视频流处理中。

5.3 系统可视化界面(可选)

可以使用PyQt5等库构建简单的图形界面,方便用户加载视频、调整参数和查看结果。

6.总结与展望

6.1 工作总结

本文成功设计并实现了一个基于改进YOLOv8的无人机检测系统。通过引入CoordAtt注意力机制和BiFPN特征融合网络,有效提升了模型对小目标的检测能力。在VisDrone2019数据集上的实验证明,改进模型相比原版YOLOv8有更高的检测精度。

6.2 主要创新点

  1. 将CoordAtt注意力机制与YOLOv8结合,增强了模型对无人机小目标的空间信息感知。

  2. 利用BiFPN改进特征融合过程,提升了多尺度目标的检测性能。

  3. 构建了完整的、可实时运行的无人机检测系统原型。

6.3 存在问题与未来展望

  1. 模型轻量化:当前模型在边缘设备上的实时性仍有优化空间,未来可引入更高效的轻量化技术。

  2. 复杂场景适应性:在极端天气(如浓雾、大雨)下的检测性能有待进一步提升,可通过更丰富的数据增强或域自适应方法解决。

  3. 功能扩展:未来可集成目标跟踪(如DeepSORT)模块,实现无人机的连续轨迹追踪与行为分析。

开源代码

链接: https://pan.baidu.com/s/1OilMZdgRlxsLdH2Ul5IGvA?pwd=anxk 提取码: anxk

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐