跳到主要内容基于 YOLOv12 的无人机航拍视角目标检测系统 | 极客日志PythonAI算法
基于 YOLOv12 的无人机航拍视角目标检测系统
基于 YOLOv12 的无人机航拍视角目标检测系统整合了环境配置、模型训练、测试评估及图形化界面封装全流程。项目采用 VisDrone 数据集,覆盖行人、车辆等常见目标类别。深入解析了 YOLOv12 的区域注意力机制与 YOLOv11 网络架构,提供 GhostConv 和 CBAM 等轻量化改进方案,旨在解决航拍场景中小目标检测难题,实现高精度实时推理。
abccba1 浏览 基于 YOLOv12 的无人机航拍视角目标检测系统
本项目旨在构建一个基于无人机(航拍)视角的目标检测与追踪系统,主要面向行人、车辆等常规目标的识别。教程涵盖了从环境配置、模型训练、测试评估到图形化界面封装的全流程,并包含标注好的数据集及训练好的 YOLOv5、YOLOv8、YOLOv11 及 YOLOv12 模型。
项目概览
本次数据集中的类别定义如下:
0: pedestrian 行人
1: people 人
2: bicycle 自行车
3: car 汽车
4: van 货车
5: truck 卡车
6: tricycle 三轮车
7: awning-tricycle 遮阳篷三轮车
8: bus 公交车
9: motor 摩托车
以下是部分数据示例:

系统支持视频和图像检测,部分实现效果如下:


环境配置
进行项目实战前,请确保本地已安装 PyTorch 和 Miniconda。若未配置,请先完成基础 Python 环境搭建。
下载项目资源包后,解压至本地目录。环境依赖通常包含在 requirements.txt 中,建议使用虚拟环境管理依赖。
本地模型训练
模型训练脚本为 step1_start_train.py。训练前需确认本地数据集路径配置正确。数据集配置文件位于 ultralytics\cfg\datasets\A_my_data.yaml,请根据实际路径修改根目录。

修改配置文件中的路径后,直接运行脚本即可开始训练。若启动时报错,请优先检查数据集路径是否指向正确的文件夹。训练结果将保存在 目录下。
runs
GPU 服务器训练(可选)
若本地算力不足,可考虑使用云端 GPU 服务进行训练。注册云服务商账号后,按指南挂载数据集并启动训练任务即可。
模型测试
模型测试主要用于计算 mAP、Precision、Recall 等指标,脚本为 step2_start_val.py。通常在训练最后一轮会自动执行验证,如需单独测试,只需将脚本中的权重路径替换为你训练生成的最佳权重文件(如 best.pt)。
图形化界面封装
本次 GUI 开发采用 PySide6,它是 Qt 6 框架的 Python 绑定,适合跨平台桌面应用开发。主程序入口为 step3_start_window_track.py。
此外,Web 端封装使用 Gradio 实现,核心代码逻辑如下:
import gradio as gr
import PIL.Image as Image
from ultralytics import YOLO, ASSETS
model = YOLO("runs/yolo11s/weights/best.pt")
TITLE = "欢迎使用基于 YOLOv12 的无人机视角目标检测"
def predict_image(img, conf_threshold, iou_threshold):
results = model.predict(
source=img,
conf=conf_threshold,
iou=iou_threshold,
show_labels=True,
show_conf=True,
imgsz=640,
)
for r in results:
im_array = r.plot()
im = Image.fromarray(im_array[...,::-1])
return im
iface = gr.Interface(
fn=predict_image,
inputs=[
gr.Image(type="pil", label="Upload Image"),
gr.Slider(minimum=0, maximum=1, value=0.25, label="Confidence threshold"),
gr.Slider(minimum=0, maximum=1, value=0.45, label="IoU threshold"),
],
outputs=gr.Image(type="pil", label="Result"),
title=TITLE,
description="Upload images for inference.",
)
if __name__ == "__main__":
iface.launch()
算法原理与架构
YOLOv12 算法介绍
YOLOv12 在 YOLOv11 基础上进行了微调,引入了以注意力为中心的架构。不同于传统 CNN 方法,它在保持实时推理速度的同时,通过创新机制提升了检测精度。
- 区域注意机制 (Area Attention):将特征图横向或纵向划分为 $l$ 个区域(默认为 4),避免复杂操作并保持大感受野,显著降低计算成本。
- 剩余效率层聚合网络 (R-ELAN):改进的特征聚合模块,引入块级残差连接和类似瓶颈的结构设计。
- 优化注意力架构:简化标准关注机制,使用 FlashAttention 减少内存开销,去除位置编码,调整 MLP 比例,并在注意力机制中加入 7x7 可分离卷积以隐式编码位置信息。
配置文件上与 YOLOv11 区别较小,主要体现在红框所示区域:
其中 A2C2F 是 YOLOv12 提出的核心模块,A 代表 Area Attention。该模块通过简单的重塑操作消除显式窗口划分,将注意力机制计算成本大幅降低。
下面是 Area Attention 的实现代码:
class A2C2f(nn.Module):
""" Area-Attention C2f module for enhanced feature extraction."""
def __init__(self, c1, c2, n=1, a2=True, area=1, residual=False, mlp_ratio=2.0, e=0.5, g=1, shortcut=True):
super().__init__()
c_ = int(c2 * e)
assert c_ % 32 == 0
self.cv1 = Conv(c1, c_, 1, 1)
self.cv2 = Conv((1 + n) * c_, c2, 1)
self.gamma = nn.Parameter(0.01 * torch.ones(c2), requires_grad=True) if a2 and residual else None
self.m = nn.ModuleList(
nn.Sequential(*(ABlock(c_, c_ // 32, mlp_ratio, area) for _ in range(2))) if a2 else C3k(c_, c_, 2, shortcut, g)
for _ in range(n)
)
def forward(self, x):
y = [self.cv1(x)]
y.extend(m(y[-1]) for m in self.m)
y = self.cv2(torch.cat(y, 1))
if self.gamma is not None:
return x + self.gamma.view(-1, len(self.gamma), 1, 1) * y
return y
YOLOv11 算法介绍
YOLOv11 延续了系列的高效性,在同样速度下表现出更高的精度。其核心由主干(Backbone)、颈部(Neck)和头部(Head)组成。
- 颈部网络 (Neck):负责多尺度特征融合。常用上采样操作配合插值方式(如 nearest, bilinear)调整特征图尺寸。
- 头部 (Head):生成最终预测,输出边界框坐标、置信度及类别标签。
YOLOv11 支持多种任务,包括目标检测、实例分割、姿态估计等。以下是关键组件的实现细节:
Concat 操作:用于拼接不同尺度的特征图,沿通道维度增加通道数,随后接卷积调整。
class Concat(nn.Module):
def __init__(self, dimension=1):
super().__init__()
self.d = dimension
def forward(self, x):
return torch.cat(x, self.d)
C3k2 模块:CSP 瓶颈的紧凑版本,提供更快处理和更好参数效率。当 n=2 时即为 C3K2 结构。
class C3k2(C2f):
def __init__(self, c1, c2, n=1, c3k=False, e=0.5, g=1, shortcut=True):
super().__init__(c1, c2, n, shortcut, g, e)
self.m = nn.ModuleList(
C3k(self.c, self.c, 2, shortcut, g) if c3k else Bottleneck(self.c, self.c, shortcut, g)
for _ in range(n)
)
Conv 卷积模块:标准卷积加批归一化和激活函数。
class Conv(nn.Module):
default_act = nn.SiLU()
def __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):
super().__init__()
self.conv = nn.Conv2d(c1, c2, k, s, autopad(k, p, d), groups=g, dilation=d, bias=False)
self.bn = nn.BatchNorm2d(c2)
self.act = self.default_act if act is True else act
def forward(self, x):
return self.act(self.bn(self.conv(x)))
C2PSA 模块:在 C2 模块上添加 PSA 旁路,增强特征提取能力。
class C2PSA(nn.Module):
def __init__(self, c1, c2, n=1, e=0.5):
super().__init__()
assert c1 == c2
self.c = int(c1 * e)
self.cv1 = Conv(c1, 2 * self.c, 1, 1)
self.cv2 = Conv(2 * self.c, c1, 1)
self.m = nn.Sequential(*(PSABlock(self.c, attn_ratio=0.5, num_heads=self.c // 64) for _ in range(n)))
def forward(self, x):
a, b = self.cv1(x).split((self.c, self.c), dim=1)
b = self.m(b)
return self.cv2(torch.cat((a, b), 1))
实验结果分析
数据集介绍
本次实验使用 VisDrone 数据集,已按 YOLO 格式处理。配置文件示例如下:
path: H:/raspi/0000-38-visdrone-detect-yolo12/visdrone
train: VisDrone2019-DET-train/images
val: VisDrone2019-DET-val/images
test: VisDrone2019-DET-test-dev/images
names:
0: pedestrian
1: people
2: bicycle
3: car
4: van
5: truck
6: tricycle
7: awning-tricycle
8: bus
9: motor
指标结果分析
实验结果保存在 runs 目录下。重点关注以下指标:
train/box_loss:边界框损失随训练轮次下降,表明定位能力提升。
metrics/precision(B):精确度提高,误报减少。
metrics/recall(B):召回率上升,真实目标检出增多。
metrics/mAP50(B):整体检测性能提升。
当 IoU 阈值为 0.5 时,模型在测试集上的 mAP 达到预期数值。预测图像显示模型能有效应对尺度多变的目标。
结论
基于 YOLOv12 和 YOLOv11 的无人机航拍目标检测系统在 VisDrone 数据集上表现优异。YOLOv12 在小目标检测方面优势明显,YOLOv11 则在复杂场景下稳健性强。两者均实现了高精度与实时性的平衡,适用于智慧城市、农业监测及安防等领域。
未来研究可进一步优化极端光照下的鲁棒性,或结合多模态数据提升性能。
模型改进方案(选看)
若需对基础模型进行改进,可从轻量化和精度两个方向入手。
速度改进:GhostConv
GhostConv 利用廉价操作生成冗余特征图,减少计算量。
class GhostConv(nn.Module):
def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, padding=1, ratio=2, dw_kernel_size=3):
super(GhostConv, self).__init__()
self.out_channels = out_channels
self.primary_channels = out_channels // ratio
self.ghost_channels = out_channels - self.primary_channels
self.primary_conv = nn.Conv2d(in_channels, self.primary_channels, kernel_size, stride, padding, bias=False)
self.bn1 = nn.BatchNorm2d(self.primary_channels)
self.ghost_conv = nn.Conv2d(self.primary_channels, self.ghost_channels, dw_kernel_size, stride=1, padding=dw_kernel_size // 2, groups=self.primary_channels, bias=False)
self.bn2 = nn.BatchNorm2d(self.ghost_channels)
self.relu = nn.ReLU(inplace=True)
def forward(self, x):
primary_features = self.relu(self.bn1(self.primary_conv(x)))
ghost_features = self.relu(self.bn2(self.ghost_conv(primary_features)))
output = torch.cat([primary_features, ghost_features], dim=1)
return output
准确率改进:CBAM
CBAM 引入通道注意力和空间注意力模块,增强特征表达能力。
class ChannelAttention(nn.Module):
def __init__(self, in_channels, reduction=16):
super(ChannelAttention, self).__init__()
self.avg_pool = nn.AdaptiveAvgPool2d(1)
self.max_pool = nn.AdaptiveMaxPool2d(1)
self.fc = nn.Sequential(
nn.Linear(in_channels, in_channels // reduction, bias=False),
nn.ReLU(inplace=True),
nn.Linear(in_channels // reduction, in_channels, bias=False)
)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = self.fc(self.avg_pool(x).view(x.size(0), -1))
max_out = self.fc(self.max_pool(x).view(x.size(0), -1))
out = self.sigmoid(avg_out + max_out).view(x.size(0), -1, 1, 1)
return x * out
class SpatialAttention(nn.Module):
def __init__(self, kernel_size=7):
super(SpatialAttention, self).__init__()
self.conv = nn.Conv2d(2, 1, kernel_size=kernel_size, padding=kernel_size // 2, bias=False)
self.sigmoid = nn.Sigmoid()
def forward(self, x):
avg_out = torch.mean(x, dim=1, keepdim=True)
max_out, _ = torch.max(x, dim=1, keepdim=True)
combined = torch.cat([avg_out, max_out], dim=1)
out = self.sigmoid(self.conv(combined))
return x * out
class CBAM(nn.Module):
def __init__(self, in_channels, reduction=16, kernel_size=7):
super(CBAM, self).__init__()
self.channel_attention = ChannelAttention(in_channels, reduction)
self.spatial_attention = SpatialAttention(kernel_size)
def forward(self, x):
x = self.channel_attention(x)
x = self.spatial_attention(x)
return x
相关免费在线工具
- 加密/解密文本
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
- RSA密钥对生成器
生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online
- Mermaid 预览与可视化编辑
基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online
- 随机西班牙地址生成器
随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online
- Gemini 图片去水印
基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online
- curl 转代码
解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online