基于PP-YOLOE-SOD实现遥感场景下的小目标检测

文章介绍了基于百度飞桨平台实现的PP-YOLOE-SOD模型,该模型针对小目标检测进行了优化,包括引入Transformer全局注意力机制和改进的回归分支。文章详细阐述了目标检测的背景、模型结构、数据预处理、模型训练和评估过程,展示了飞桨在国产深度学习框架中的技术领先地位。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本项目基于百度飞桨AI Studio平台进行实现,百度出品的深度学习平台飞桨(PaddlePaddle)是主流深度学习框架中一款完全国产化的产品,与Google TensorFlow、Facebook Pytorch齐名。2016 年飞桨正式开源,是国内首个全面开源开放、技术领先、功能完备的产业级深度学习平台。相比国内其他平台,飞桨是一个功能完整的深度学习平台,也是唯一成熟稳定、具备大规模推广条件的深度学习平台。

平台主界面如下:
在这里插入图片描述

在飞桨平台上,我们在使用paddle深度学习框架的基础上,可以免费使用平台的服务器,具体如下:
在这里插入图片描述
接下来我们进入正文~

一、项目背景

目标检测一直是遥感图像和计算机视觉领域的一个长期问题。它通常被定义为识别输入图像中目标对象的位置以及识别对象类别。自动目标检测已广泛应用于许多实际应用中,如危险检测、环境监测、变化检测、城市规划等。

在过去的几十年里,人们对目标检测进行了广泛的研究,并开发了大量方法来检测遥感图像中的人工目标(如车辆、建筑物、道路、桥梁等)和自然目标(如湖泊、海岸、森林等)。遥感图像数据集上现有的目标检测方法大致可分为四类:(1)基于模板匹配的方法,(2)基于知识的方法,(3)基于对象的图像分析方法,(4)基于机器学习的方法。其中,基于机器学习的方法在特征提取和目标分类方面具有强大的鲁棒性,并被许多最近的方法广泛研究,以实现这一问题的重大进展。

在过去的几年里,为了完成场景分类、图像分割和目标检测的任务,少样本学习在计算机视觉领域得到了广泛的研究。而在遥感图像中,物体的大小可能非常不同,遥感图像的空间分辨率也可能非常不同,这使得在只提供少量注释样本的情况下,这个问题更加具有挑战性。

小目标检测在视频监控、自动驾驶、无人机航拍、遥感图像检测等方面有着广泛的应用价值和重要的研究意义。针对小目标的定义,目前主要有两种方式:

1.1 基于相对尺度的定义

  • 目标边界框的宽高与图像的宽高比例小于一定值

  • 目标边界框面积与图像面积的比值开方小于一定值

1.2 基于绝对尺度的定义

  • 分辨率小于32*32像素的目标。如MS-COCO数据集

  • 像素值范围在[10,50]之间的目标。如DOTA/WIDER FACE数据集

paddle从数据集 整体层面提出了如下定义:
目标边界框的宽高与图像的宽高比例的中位数小于0.04时,判定该数据集为小目标数据集。

在这里插入图片描述
目前,小目标检测主要有以下几个难点:

  • 覆盖面积小,有效特征少

  • 小目标下采样后丢失问题,边界框难以回归,模型难以收敛

  • 同类小目标密集,NMS(非极大值抑制)操作将大量正确预测的边界框过滤

  • 小目标检测的数据集少

针对上述问题,飞桨团队基于PP-YOLOE+通用检测模型,从流程和算法上进行了改进,提出了一套小目标专属检测器PP-YOLOE-SOD(Small Object Detection)

二、模型介绍

2.1 模型优点

相比PP-YOLOE模型,PP-YOLOE-SOD改进点主要包括在neck中引入 Transformer全局注意力机制 以及在回归分支中使用 基于向量的DFL 。

  • 引入Transformer全局注意力机制

Transformer在CV中的应用是目前研究较为火热的一个方向。最早的ViT直接将图像分为多个Patch并加入位置Embedding送入Transformer Encoder中,加上相应的分类或者检测头即可实现较好的效果。

这里类似,主要加入了Position Embedding和Encoder两个模块,不同的是输入是最后一层特征图。

PP-YOLOE+结构图

PP-YOLOE+结构图

PP-YOLOE-SOD结构图

PP-YOLOE-SOD结构图

2.2 PP-YOLOE-SOD模型库(COCO模型)

模型 m A P v a l mAP^{val} mAPval A P 0.5 AP^{0.5} AP0.5 A P 0.75 AP^{0.75} AP0.75 A P s m a l l AP^{small} APsmall A P m e d i u m AP^{medium} APmedium A P l a r g e AP^{large} APlarge A R s m a l l AR^{small} ARsmall A R m e d i u m AR^{medium} ARmedium A R l a r g e AR^{large} ARlarge下载链接配置文件
PP-YOLOE+_SOD-l53.070.457.737.157.569.056.577.586.7下载链接配置文件

注意:

  • 上表中的模型均为使用原图训练,也原图评估预测,网络输入尺度为640x640,训练集为COCO的train2017,验证集为val2017,均为8卡总batch_size为64训练80 epoch。
  • SOD表示使用基于向量的DFL算法和针对小目标的中心先验优化策略,并在模型的Neck结构中加入transformer,可在 APsmall 上提升1.9。

三、数据预处理

3.1 数据集介绍

NWPU VHR-10数据集包含800个高分辨率的卫星图像,这些图像是从Google Earth和Vaihingen数据集裁剪而来的,然后由专家手动注释。数据集分成10类(飞机,轮船,储罐,棒球场,网球场,篮球场,地面跑道,港口,桥梁和车辆)。

它由715幅RGB图像和85幅锐化彩色红外图像组成。其中715幅RGB图像采集自谷歌地球,空间分辨率从0.5m到2m不等。85幅经过pan‐锐化的红外图像,空间分辨率为0.08m,来自Vaihingen数据。

该数据集共包含3775个对象实例,其中包括757架飞机、390个棒球方块、159个篮球场、124座桥梁、224个港口、163个田径场、302艘船、655个储罐、524个网球场和477辆汽车,这些对象实例都是用水平边框手工标注的。

原始数据集包含以下文件:

  • negative image set:包含150个不包含给定对象类别的任何目标的图像
  • positive image set:650个图像,每个图像至少包含一个要检测的目标
  • ground truth:包含650个单独的文本文件,每个对应于“正图像集”文件夹中的图像。这些文本文件的每一行都以以下格式定义了ground truth边界框:

(x1,y1),(x2,y2),a
其中(x1,y1)表示边界框的左上角坐标,(x2,y2)表示边界框的右下角坐标,
a是对象类别(1-飞机,2-轮船,3-储罐,4-棒球场,5-网球场,6-篮球场,7-田径场,8-港口,9-桥梁,10-车辆)。


该数据集已经转化为COCO格式,原有数据集为VOC格式。

3.2 数据集解压

# 压缩数据集
%cd work
!mkdir dataset
!unzip /home/aistudio/data/data198756/dataset_coco.zip -d /home/aistudio/work/dataset

四、模型训练

# 克隆paddledetection仓库
# gitee 国内下载比较快
%cd /home/aistudio
!git clone https://gitee.com/paddlepaddle/PaddleDetection.git

# github 
# !git clone https://github.com/PaddlePaddle/PaddleDetection.git
# 如果git clone的速度非常的慢,可以使用下面的命令直接压缩我上传的PaddleDetection套件压缩包
!unzip /home/aistudio/data/data199313/PaddleDetection.zip -d /home/aistudio

在进行训练之前,我们需要先到/home/aistudio/PaddleDetection/configs/datasets/coco_detection.yml文件中,修改数据集路径,具体修改如下:

metric: COCO
num_classes: 10     # 该数据集类别为10

TrainDataset:
  name: COCODataSet
  image_dir: /home/aistudio/work/dataset/image
  anno_path: dataset/instances_train2017.json
  dataset_dir: /home/aistudio/work
  data_fields: ['image', 'gt_bbox', 'gt_class', 'is_crowd']

EvalDataset:
  name: COCODataSet
  image_dir: /home/aistudio/work/dataset/image
  anno_path: dataset/instances_val2017.json
  dataset_dir: /home/aistudio/work
  allow_empty: true

TestDataset:
  name: ImageFolder
  anno_path: dataset/instances_val2017.json # also support txt (like VOC's label_list.txt)
  dataset_dir: /home/aistudio/work # if set, anno_path will be 'dataset_dir/anno_path'

同时,我们还需要到/home/aistudio/PaddleDetection/configs/smalldet/ppyoloe_plus_sod_crn_l_80e_coco.yml文件中,修改一下参数:

_BASE_: [
  '../datasets/coco_detection.yml',
  '../runtime.yml',
  '../ppyoloe/_base_/optimizer_80e.yml',
  '../ppyoloe/_base_/ppyoloe_plus_crn.yml',
  '../ppyoloe/_base_/ppyoloe_plus_reader.yml',
]
log_iter: 10        # 打印日志log的间隔
snapshot_epoch: 5     # 每过多少轮评估一次
weights: output/ppyoloe_plus_sod_crn_l_80e_coco/model_final

pretrain_weights: https://bj.bcebos.com/v1/paddledet/models/pretrained/ppyoloe_crn_l_obj365_pretrained.pdparams
depth_mult: 1.0
width_mult: 1.0

CustomCSPPAN:
  num_layers: 4
  use_trans: True

PPYOLOEHead:
  reg_range: [-2, 17]
  static_assigner_epoch: -1
  assigner:
    name: TaskAlignedAssigner_CR
    center_radius: 1
  nms:
    name: MultiClassNMS
    nms_top_k: 1000
    keep_top_k: 300
    score_threshold: 0.01
    nms_threshold: 0.7

同时,由于我们是单卡训练,YOLOE中默认是8卡训练,所以我们需要调整下/home/aistudio/PaddleDetection/configs/ppyoloe/_base_/optimizer_80e.yml中的学习率,具体如下:

epoch: 80

LearningRate:
  base_lr: 0.000125   # 这里在原先0.001的基础上除了8
  schedulers:
    - name: CosineDecay
      max_epochs: 96
    - name: LinearWarmup
      start_factor: 0.
      epochs: 5

OptimizerBuilder:
  optimizer:
    momentum: 0.9
    type: Momentum
  regularizer:
    factor: 0.0005
    type: L2

# 安装所需依赖
!pip install pycocotools
# 导入package
!pip install -r ~/PaddleDetection/requirements.txt
# 训练
%cd /home/aistudio/PaddleDetection
!python tools/train.py -c configs/smalldet/ppyoloe_plus_sod_crn_l_80e_coco.yml --amp --eval --use_vdl True --vdl_log_dir vdl_log_dir/scalar

我们可以通过VisualDL服务,进行训练的可视化,具体如下:

点击进入VisualDL以后,我们就可以看到可视化的结果如下:

五、模型评估

# 评估
%cd /home/aistudio/PaddleDetection
!python tools/eval.py -c configs/smalldet/ppyoloe_plus_sod_crn_l_80e_coco.yml -o weights=output/ppyoloe_plus_sod_crn_l_80e_coco/best_model.pdparams

根据instances_val2017.json文件提取除image文件夹中的验证集图片

import json
import shutil
import os
if not os.path.exists('test'):
    os.chdir('/home/aistudio/work/dataset')
    os.mkdir('test')
datasets_path = '/home/aistudio/work/dataset/'
img_dir = '/home/aistudio/work/dataset/image'
annotion_dir = '/home/aistudio/work/dataset/test'
f = open('{}instances_val2017.json'.format(datasets_path), encoding='utf-8')
gt = json.load(f)

lst = []
for img_info in gt['images']:
    lst.append(img_info['file_name'])

for fileNum in lst:
    if not os.path.isdir(fileNum):
        imgName = os.path.join(img_dir, fileNum)
        print(imgName)
        shutil.copy(imgName, annotion_dir)

六、模型预测

# 预测
%cd /home/aistudio/PaddleDetection
!python tools/infer.py -c configs/smalldet/ppyoloe_plus_sod_crn_l_80e_coco.yml -o weights=output/ppyoloe_plus_sod_crn_l_80e_coco/best_model.pdparams --infer_dir=/home/aistudio/work/dataset/test --output_dir infer_output/

推理结果如下:

七、模型导出

PP-YOLO-SOD在GPU上部署或者速度测试需要通过tools/export_model.py导出模型。

%cd /home/aistudio/PaddleDetection
!python tools/export_model.py -c configs/smalldet/ppyoloe_plus_sod_crn_l_80e_coco.yml -o weights=output/ppyoloe_plus_sod_crn_l_80e_coco/best_model.pdparams

八、模型部署

# 选一张验证集图片测试部署效果
%cd /home/aistudio/PaddleDetection
!python deploy/python/infer.py --model_dir=/home/aistudio/PaddleDetection/output_inference/ppyoloe_plus_sod_crn_l_80e_coco --image_file=/home/aistudio/work/dataset/test/421.jpg --device=GPU --save_images=True --threshold=0.25  --slice_infer --slice_size 500 500 --overlap_ratio 0.25 0.25 --combine_method=nms --match_threshold=0.6 --match_metric=ios

推理结果如下:

总结

  • PP-YOLOE-SOD 是PaddleDetection团队自研的小目标检测特色模型,使用数据集分布相关的基于向量的DFL算法 和 针对小目标优化的中心先验优化策略,并且在模型的Neck(FPN)结构中加入Transformer模块,以及结合增加P2层、使用large size等策略,最终在多个小目标数据集上达到极高的精度。

  • 不通过切图拼图而直接使用原图或子图去训练评估预测,推荐使用 PP-YOLOE-SOD 模型,更多细节和消融实验可参照COCO模型VisDrone模型

  • 通过此次项目实践,我学到了很多以往没有掌握的知识技能,比如以往没有使用过COCO格式的数据集,在此次项目实践中,使用到了它,并将其掌握。

我在AI Studio上获得钻石等级,点亮7个徽章,来互关呀~ https://aistudio.baidu.com/aistudio/personalcenter/thirdview/2699972

### 智能驾驶中小目标检测 (SOD) 技术的实现 #### 背景概述 小目标检测(Small Object Detection, SOD)在智能驾驶领域具有重要意义,尤其是在复杂环境中的障碍物识别、行人检测以及交通标志识别等方面。由于小目标通常占据图像的比例较小,特征表达能力较弱,因此其检测难度较高。 YOLOv8-QSD 是一种专门为自动驾驶场景设计的小目标检测算法[^1]。该方法通过优化网络结构和引入增强模块来提升对小目标的感知能力。另一方面,PP-YOLOE-SOD 利用了飞桨框架的优势,在遥感数据处理方面表现出色,并同样适用于智能驾驶场景下的小目标检测任务[^3]。 以下是基于这些技术的具体实现思路: --- #### 数据预处理 为了提高模型对小目标的敏感度,可以采用以下策略: - **高分辨率输入**:增加输入图片的分辨率有助于保留更多细节信息。 - **多尺度训练**:通过对同一张图片进行缩放变换生成多个尺寸的数据样本,使模型能够学习到从小到大的多种目标特征。 - **数据增广**:利用随机裁剪、旋转和平移等方式扩充数据集,模拟真实世界中可能出现的各种情况。 ```python import cv2 import numpy as np def augment_image(image): """ 对图像进行简单的数据增广 """ augmented = [] # 随机水平翻转 flipped = cv2.flip(image, 1) augmented.append(flipped) # 随机裁剪 height, width = image.shape[:2] cropped = image[int(height*0.1):int(height*0.9), int(width*0.1):int(width*0.9)] resized_cropped = cv2.resize(cropped, (width, height)) augmented.append(resized_cropped) return augmented ``` --- #### 网络架构改进 对于小目标检测而言,深层神经网络容易丢失细粒度的空间信息。为此,可以通过以下方式改善模型性能: - **FPN 结构**:Feature Pyramid Network 可以有效融合高低层特征图,从而强化小目标的表示能力。 - **ASFF 模块**:Adaptive Spatial Feature Fusion 动态调整不同层次特征的重要性权重,进一步提升检测精度。 - **注意力机制**:例如 CBAM 或 SENet,用于突出关注区域并抑制背景干扰项。 具体来说,YOLOv8-QSD 提出了新的骨干网设计,并结合了上述部分组件以适应复杂的道路条件[^1];而 PP-YOLOE-SOD 则着重于轻量化部署与高效推理之间的平衡[^3]。 --- #### 训练技巧 除了合理的网络结构调整外,还需要注意以下几个方面的调优工作: - **损失函数定制化**:针对小目标分布不均的情况重新定义分类/回归分支上的加权因子。 - **锚框设置合理化**:依据实际应用场景统计得到的目标大小范围设定初始 anchor box 参数值。 - **正负样本比例控制**:防止因大量简单背景像素而导致梯度过大现象发生。 下面是一个自定义损失计算的例子: ```python import torch.nn.functional as F class CustomLoss(torch.nn.Module): def __init__(self): super(CustomLoss, self).__init__() def forward(self, pred_confidence, true_confidence, pred_boxes, true_boxes): confidence_loss = F.binary_cross_entropy(pred_confidence, true_confidence) mask_positive = true_confidence > 0 positive_pred_boxes = pred_boxes[mask_positive] positive_true_boxes = true_boxes[mask_positive] localization_loss = F.smooth_l1_loss(positive_pred_boxes, positive_true_boxes) total_loss = confidence_loss + 5 * localization_loss # 加强位置误差惩罚力度 return total_loss ``` --- #### 后处理阶段 完成预测之后还需执行必要的后处理操作才能获得最终结果: - NMS(Non-Maximum Suppression)去除冗余边界框; - 根据置信度阈值筛选出可靠的候选对象列表。 --- ### 总结 综上所述,无论是 YOLOv8-QSD 还是 PP-YOLOE-SOD 均提供了强大的工具链支持解决智能驾驶环境下存在的挑战性问题——即如何精准捕捉那些体积微小却至关重要的实体个体。开发者可以根据项目需求灵活选用合适的解决方案,并不断尝试创新性的组合方案达到最佳效果。
评论 13
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

心无旁骛~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值