1.简介
为了解决遥感小目标检测任务中特征表示不足、背景混淆等问题,本文基于YOLO框架进行改进,通过增加三个即插即用的模块:特征增强模块(FEM)、特征融合模块(FFM)和空间上下文感知模块(SCAM),显著增强了网络的局部感知能力、多尺度特征融合能力和跨通道、跨空间的全局关联能力,同时尽量避免增加复杂度。利用VEDAI和AI-TOD两个公共遥感小目标检测数据集和USOD一个自建数据集验证了FFCA-YOLO的有效性。
本文重点在于讲述如何对该文章所提出的网络模型进行环境配置以及复现,需要复现代码的小伙伴之间看第四章即可。
2.论文地址
代码地址:https://github.com/yemu1138178251/FFCA-YOLO
3.论文解读
3.1方法
为了解决遥感小目标检测任务中特征表示不足、背景混淆等问题,本文基于YOLO框架进行改进,本文主要通过增加三个即插即用的模块:特征增强模块(FEM)、特征融合模块(FFM)和空间上下文感知模块(SCAM)来提高模型的检测精度。模型整体框架如下:
可以看到,模型主要是根据yolov5框架进行改进,同时在其中加入了FEM(特征增强模块)、FFM(特征融合模块)以及SCAM(空间上下文感知模块)增强对于小目标的检测能力,接下来主要从设计灵感,创新点,结构以及优点等方面分别对着三个模块进行介绍。
3.2 特征增强模块(FEM)
FEM旨在增强小目标的特征表达能力,从而解决遥感图像中小牧白哦特征表示不足的问题。FEM通过多分支卷积以及空洞卷积来增加特征的丰富度以及感受野。FEM的设计灵感主要来自于RFB-s:
- 从增加特征丰富度的角度出发,采用多分支卷积结构提取多个判别性语义信息。
- 从扩大感受野的角度出发,应用扩张卷积获得更丰富的局部上下文信息。
每个分支对输入特征映射进行1 × 1的卷积运算,初步调整后续处理的通道数。第一个分支是残差结构,残差结构形成等效映射,保留小目标的关键特征信息。其他三个分支执行级联标准卷积操作,其核大小分别为1 × 3、3 × 1和3 × 3。在中间两个分支上增加了额外的空洞卷积层,使提取的特征图能够保留更多的上下文信息,FEM结构如图所示:
3.3 特征融合模块(FFM)
高尺度特征图与低级特征映射包含不同的语义信息,FFM的设计灵感主要来自于BiFPN,与BiFPN不同,FFM改进了名为CRC的重权策略,并调整了原始的BiFPN以适应三个检测头。其中,,
输出的特征图大小分别为为160×160,80×80,40×40。
BiFPN[29]的融合策略是特征映射之间的融合,导致不同的通道具有相同的权值。为了加强多尺度特征对小目标的表征,并充分利用不同通道的特征,本文提出的CRC对特征映射的通道进行了重新加权。
通道重新加权策略首先将特征图进行连接,然后将与通道总数参数数相同的归一化可训练权相乘。公式如下:
3.4 空间上下文感知模块(SCAM)
空间上下文感知模块利用全局上下文信息来表示像素之间的跨空间关系,抑制无用背景,增强目标和背景的区分能力,SCAM受到GCNet与SCP的启发。
SCAM由三个分支组成,第一个分支使用GAP(全局平均池化)与GMP(全局最大池化)来整合全局信息,第二个分支使用1×1的卷积来生成特征映射的线性变换结果,第三个分支使用1×1卷积来简化键值对的倍数。最后将第一分支与第三分支分别于第二分支进行矩阵想成。得到的两个分支分别表示跨通道以及空间上的上下文信息,随后利用Hadamard乘积在这两个分支上得到了SCAM的输出。
除此之外,该文章还提出轻量化FFCA-YOLO
4. 环境配置
由于该论文代码是基于yolov5网络结构,所以论文代码结构与yolov5大概相似,源码结构如下图所示:
4.1 安装依赖包
该项目所需要的依赖包文件requirements.txt文件在:wandb->run-20230728_202726-f6uagpq5->files文件下。
1.首先需要切换至在anaconda环境中(anaconda我使用的python版本是3.8)。
2.打开命令行终端,输入以下命令切换至requirements.txt的上级目录
cd wandb/run-20230728_202726-f6uagpq5/files
3.运行以下代码安装代码所需要的依赖包
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -r requirements.txt
等待软件依赖包全部安装完成,可能需要费点时间...
4.2 下载文章所需要的数据集
该文章最后使用文章作者自建数据集USOD进行模型训练。USOD数据集基于UNICORN2008数据集构建,总共包含3000张图像,其中包含43 378个车辆实例。训练集与测试集的比例为7:3。其中,小于16 × 16的物体所占比例为96.3%,小于32 × 32的物体所占比例为99.9%。
USOD数据集的优点:
- USOD中小目标的比例(99.9%)高于其他小目标数据集,如AI-TOD(97.9%)。
- USOD中有许多车辆实例处于低照度和阴影遮挡条件下,可以更有效地验证模型检测小目标的性能。
- USOD包括一系列测试集,用于验证模型的鲁棒性,考虑图像退化因素,包括模糊,高斯噪声,条纹噪声和雾。
-
USOD在未来有可能成为一个多模态数据集。USOD的数据源是UNICORN2008,它在可见光数据和SAR数据之间进行了配准。
USOD数据集结构如下:
USOD数据集下载地址: https://pan.baidu.com/s/1R5bGR8XHrzOZHDxHybHJkw
提取码:64q4
4.3 配置USOD.yaml文件
修改USOD.yaml配置文件中训练集与测试集的值。
4.3 开始进行模型训练
官方给出的模型训练代码如下所示(与yolov5相同),总结下其中每个参数的作用,大家可以根据自己的需要进行修改训练自己的模型。
- --weights:用于指定模型所需要的预训练权重文件的位置,可以设置为'yolov5n.pt','yolov5m.pt'等,若为空,则表示模型不需要预训练权重,从头开始训练
- --cfg:指定模型配置文件的路径
- --data:用于指定数据集配置文件的路径,这里指定data/AITOD.yaml为数据集配置文件
- --hyp:指定超参数配置文件的路径,治理指定data/hyps/hyp-scratch-low.yaml为超参数配置文件
- --name:给此次训练命名,方便后续管理训练结果
- --batch-size:指定每个训练批次包含的数据量,这里指定为32
- --workers:指定数据加载线程的数量,一般设置为0
- --cache:参数表示是否缓存整个数据集到磁盘上,以加快读取速度
- --epochs:表示模型所需要迭代的次数,这里模型需要300次迭代完成模型训练
- --save-epoch:定义保存检查点的频率,这里设置为1,则表示每训练完一个epoch就保存一次权重模型
在了解到上述参数的作用后,即可根据自己的需要开始模型训练。我所使用的训练代码如下:
python train.py --weights 'yolov5m.pt' --cfg models/FFCA-YOLO.yaml --data data/USOD.yaml --hyp data/hyps/hyp.scratch-low.yaml --name train
--batch-size 8 --workers 0 --cache --epochs 300 --save-period 10
在输入运行代码后,模型就开始训练啦!
如果在模型配置过程中遇到各种问题,欢迎大家进行讨论,也希望大佬们能够指出该文章的不足之处,大家调通代码之后不要忘记一键三连哦,万分感谢~~~