在计算机视觉领域,卷积神经网络(ConvNets)的有效感受野(ERF)问题一直是研究热点。随着Transformer在视觉任务中的成功,构建长距离依赖关系成为ConvNets设计的关键原则。传统ConvNets通过堆叠多个小空间卷积(如3×3)来扩大感受野,而近期研究则尝试通过扩大卷积核尺寸来捕获大感受野内的关系。
当前大型卷积核方法主要面临两大挑战:一是高参数和FLOPs成本,二是破坏了感受野的渐近高斯分布(AGD)。传统小核ConvNets(如ResNet-101)虽然感受野小,但通过堆叠3×3卷积模块保持了AGD;而大型卷积核方法(如SLaK-T和UniRepLKNet-T)虽然获得了大感受野,却破坏了AGD,导致在奇怪位置获得判别性影响或不同尺度获得相似影响。
1.RFA原理
RFA提出了一种创新解决方案:不是单纯使用极大的感受野,而是通过适当组合较小的卷积核(如7×7、9×9、11×11)来扩展感受野,同时保持感受野的AGD。这一设计基于一个关键发现:输入图像中较小尺度的像素(围绕输出像素位置)应对输出像素有更大影响。
RFA的核心是三层感受野聚合器,从感受野角度设计了基本操作单元Layer Operator(LO)。LO由两个组件构成:放大器(Amp)和鉴别器(Dis)。Amp通过元素级乘法扩大感受野尺度并放大像素对感受野的影响,使感受野中的显著像素具有更明显的区分性影响。Dis则为Amp产生的大感受野提供来自小尺度新像素的影响,最终形成具有两层AGD的大感受野。

RFA采用三层结构作为基本构建模块,其核心是Layer Operator(LO)。LO由两个关键组件构成:放大器(Amp)和鉴别器(Dis)。Amp通过元素级乘法扩大感受野尺度并放大像素对感受野的影响,而Dis则为Amp产生的大感受野提供来自小尺度新像素的影响。这种设计使得最终感受野形成遵循AGD的四层感受野结构。
2.RFA习作思路
CSA-ConvBlock在目标检测中的优点
在目标检测任务中,RFA通过维持感受野的渐近高斯分布特性,能够更精确地区分不同尺度的目标特征。其多层次感受野聚合机制使网络能够同时捕获局部细节和全局上下文信息,这对于处理不同尺寸的目标至关重要。相比传统大型卷积核方法,RFA在保持检测精度的同时显著降低了计算开销,特别适合处理密集目标场景。
CSA-ConvBlock在图像分割中的优点
对于语义分割任务,RFA的多层感受野设计提供了更丰富的多尺度上下文信息,同时保持了像素级预测所需的精确位置感知。其渐近高斯分布特性确保了分割边界区域的平滑过渡,避免了大型卷积核可能带来的边缘模糊问题。这种平衡全局和局部信息的能力使RFA在需要精细分割边界的场景中表现优异。
3. YOLO与RFA的结合
将RFA集成到YOLO架构中可以显著提升其对不同尺度目标的检测能力,同时保持YOLO原有的实时性能优势。RFA的多层次感受野设计特别适合YOLO的多尺度预测机制,能够在不增加过多计算负担的情况下提升小目标检测精度。此外,RFA的参数效率使其成为轻量化YOLO变体的理想选择。
4.RFA代码部分
YOLO11|YOLO12|改进| RFA(Receptive Field Aggregator)通过分层聚合多尺度感受野,提高多尺度目标检测能力_哔哩哔哩_bilibili
YOLO12模型改进方法,快速发论文,总有适合你的改进,还不改进上车_哔哩哔哩_bilibili
代码获取:YOLOv8_improve/YOLOV12.md at master · tgf123/YOLOv8_improve · GitHub
5. RFA引入到YOLOv12中
第一: 先新建一个v12_changemodel,将下面的核心代码复制到下面这个路径当中,如下图如所示。E:\Part_time_job_orders\YOLO_NEW\YOLOv12\ultralytics\v12_changemodel。
第二:在task.py中导入包
第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第五:运行代码
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorld
import torch
if __name__=="__main__":
# 使用自己的YOLOv8.yamy文件搭建模型并加载预训练权重训练模型
model = YOLO("/home/tgf/tgf/yolo/model/YOLO12_All/ultralytics/cfg/models/12/yolo12_RFA.yaml")\
# .load(r'E:\Part_time_job_orders\YOLO\YOLOv11\yolo11n.pt') # build from YAML and transfer weights
results = model.train(data="/home/shengtuo/tangfan/YOLO11/ultralytics/cfg/datasets/VOC_my.yaml",
epochs=300,
imgsz=640,
batch=4,
# cache = False,
# single_cls = False, # 是否是单类别检测
# workers = 0,
# resume=r'D:/model/yolov8/runs/detect/train/weights/last.pt',
amp = True
)
3050

被折叠的 条评论
为什么被折叠?



