首页 > 其他分享 >RT-DETR融合针对小目标FFCA-YOPLO中的FEM模块及相关改进思路

RT-DETR融合针对小目标FFCA-YOPLO中的FEM模块及相关改进思路

时间:2024-11-18 20:48:35浏览次数:3  
标签:RT YOPLO self FEM stride planes FFCA inter out


RT-DETR使用教程: RT-DETR使用教程

RT-DETR改进汇总贴:RT-DETR更新汇总贴


《FFCA-YOLO for Small Object Detection in Remote Sensing Images》

一、 模块介绍

        论文链接:https://ieeexplore.ieee.org/document/10423050

        代码链接:yemu1138178251/FFCA-YOLO (github.com)

论文速览:    

        特征表示不足、背景混淆等问题使得遥感中小目标的探测任务变得艰巨。特别是当算法将部署在机上进行实时处理时,这需要在有限的计算资源下对准确性和速度进行广泛的优化。为了解决这些问题,本文提出了一种称为特征增强、融合和上下文感知 YOLO (FFCA-YOLO) 的高效检测器。FFCA-YOLO 包括三个创新的轻量级和即插即用模块:功能增强模块 (FEM)、功能融合模块 (FFM) 和空间上下文感知模块 (SCAM)。这三个模块分别提高了局域网感知、多尺度特征融合和全局关联跨信道和空间的网络能力,同时尽可能避免增加复杂性。因此,小物体的弱特征表示得到了增强,并且抑制了可能混淆的背景。此外,为了在保证效率的同时进一步减少计算资源消耗,通过基于部分卷积 (PConv) 重建 FFCA-YOLO 的主干和颈部,优化了 FFCA-YOLO (L-FFCA-YOLO) 的精简版。

总结:文章提出几个针对小目标的特征提取模块,有一定效果。


二、 加入到RT-DETR中

2.1 创建脚本文件

        首先在ultralytics->nn路径下创建blocks.py脚本,用于存放模块代码。

2.2 复制代码        

        复制代码粘到刚刚创建的blocks.py脚本中,如下图所示:

import torch
import torch.nn as nn
from ultralytics.nn.modules.conv import Conv


class BasicConv_FFCA(nn.Module):
    def __init__(self, in_planes, out_planes, kernel_size, stride=1, padding=0, dilation=1, groups=1, relu=True,
                 bn=True, bias=False):
        super(BasicConv_FFCA, self).__init__()
        self.out_channels = out_planes
        self.conv = nn.Conv2d(in_planes, out_planes, kernel_size=kernel_size, stride=stride, padding=padding,
                              dilation=dilation, groups=groups, bias=bias)
        self.bn = nn.BatchNorm2d(out_planes, eps=1e-5, momentum=0.01, affine=True) if bn else None
        self.relu = nn.ReLU(inplace=True) if relu else None

    def forward(self, x):
        x = self.conv(x)
        if self.bn is not None:
            x = self.bn(x)
        if self.relu is not None:
            x = self.relu(x)
        return x


class FEM(nn.Module):
    def __init__(self, in_planes, out_planes, stride=1, scale=0.1, map_reduce=8):
        super(FEM, self).__init__()
        self.scale = scale
        self.out_channels = out_planes
        inter_planes = in_planes // map_reduce
        self.branch0 = nn.Sequential(
            BasicConv_FFCA(in_planes, 2 * inter_planes, kernel_size=1, stride=stride),
            BasicConv_FFCA(2 * inter_planes, 2 * inter_planes, kernel_size=3, stride=1, padding=1, relu=False)
        )
        self.branch1 = nn.Sequential(
            BasicConv_FFCA(in_planes, inter_planes, kernel_size=1, stride=1),
            BasicConv_FFCA(inter_planes, (inter_planes // 2) * 3, kernel_size=(1, 3), stride=stride, padding=(0, 1)),
            BasicConv_FFCA((inter_planes // 2) * 3, 2 * inter_planes, kernel_size=(3, 1), stride=stride, padding=(1, 0)),
            BasicConv_FFCA(2 * inter_planes, 2 * inter_planes, kernel_size=3, stride=1, padding=5, dilation=5, relu=False)
        )
        self.branch2 = nn.Sequential(
            BasicConv_FFCA(in_planes, inter_planes, kernel_size=1, stride=1),
            BasicConv_FFCA(inter_planes, (inter_planes // 2) * 3, kernel_size=(3, 1), stride=stride, padding=(1, 0)),
            BasicConv_FFCA((inter_planes // 2) * 3, 2 * inter_planes, kernel_size=(1, 3), stride=stride, padding=(0, 1)),
            BasicConv_FFCA(2 * inter_planes, 2 * inter_planes, kernel_size=3, stride=1, padding=5, dilation=5, relu=False)
        )

        self.ConvLinear = BasicConv_FFCA(6 * inter_planes, out_planes, kernel_size=1, stride=1, relu=False)
        self.shortcut = BasicConv_FFCA(in_planes, out_planes, kernel_size=1, stride=stride, relu=False)
        self.relu = nn.ReLU(inplace=False)

    def forward(self, x):
        x0 = self.branch0(x)
        x1 = self.branch1(x)
        x2 = self.branch2(x)

        out = torch.cat((x0, x1, x2), 1)
        out = self.ConvLinear(out)
        short = self.shortcut(x)
        out = out * self.scale + short
        out = self.relu(out)

        return out

2.3 更改task.py文件 

       打开ultralytics->nn->modules->task.py,在脚本空白处导入函数。

from ultralytics.nn.blocks import *

        之后找到模型解析函数parse_model(约在tasks.py脚本中940行左右位置,可能因代码版本不同变动),在该函数的最后一个else分支上面增加相关解析代码。

        elif m is FEM:
            c2 = args[0]
            args = [ch[f], *args]

2.4 更改yaml文件 

yam文件解读:YOLO系列 “.yaml“文件解读_yolo yaml文件-CSDN博客

       打开更改ultralytics/cfg/models/rt-detr路径下的rtdetr-l.yaml文件,替换原有模块。(放在该位置仅能插入该模块,具体效果未知。博主精力有限,仅完成与其他模块二次创新融合的测试,结构图见文末,代码见群文件更新。)

# Ultralytics YOLO 

标签:RT,YOPLO,self,FEM,stride,planes,FFCA,inter,out
From: https://blog.csdn.net/StopAndGoyyy/article/details/143866462

相关文章

  • YOLOv11融合针对小目标FFCA-YOPLO中的FEM模块及相关改进思路
    YOLOv11v10v8使用教程:  YOLOv11入门到入土使用教程YOLOv11改进汇总贴:YOLOv11及自研模型更新汇总 《FFCA-YOLOforSmallObjectDetectioninRemoteSensingImages》一、模块介绍    论文链接:https://ieeexplore.ieee.org/document/10423050   ......
  • CSS(8)高级技巧:精灵图,css三角,用户界面,vertical-align属性应用
    一.精灵图通过css中的background-position属性,将多张图合成为一张图二.css三角在网页中,我们可以添加css属性获得三角图标solid:实心,边框的实心transparent:透明,图中代码表示只有左边粉色,其余地方为透明三:用户界面1.鼠标样式2.取消表单轮廓与防止拖拽文本三.vert......
  • Datasets is not supported in Complete output mode, only in Append output mode
    我们在使用pyspark,使用structureStreaming实时流的时候,创建出来的dataframe是流式的,不同于静态的df,流式的df使用的时候,不能用show()直接打印,而且使用sparkSQL的时候不可以在sql中使用开窗函数,并且还不可以使用join进行表关联举个栗子:执行以下代码会报错,因为在sql中使用了join......
  • Gemini 发布 iOS app,Live 语音聊天免费用;微信公众号上线 AI 音色克隆功能丨 RTE 开发
       开发者朋友们大家好: 这里是「RTE开发者日报」,每天和大家一起看新闻、聊八卦。我们的社区编辑团队会整理分享RTE(Real-TimeEngagement)领域内「有话题的新闻」、「有态度的观点」、「有意思的数据」、「有思考的文章」、「有看点的会议」,但内容仅代表编......
  • 网页直播/点播播放器EasyPlayer.js RTSP播放器关于硬解码或者video标签渲染自动播放
    EasyPlayer.jsRTSP播放器是一个基于WebRTC(网页实时通信技术)的开源JavaScript库,主要用于在网页上实现视频播放功能,特别是针对RTSP(RealTimeStreamingProtocol,实时流协议)流的播放。它允许开发者在不需要安装额外插件或软件的情况下,直接在网页中嵌入和播放来自监控摄像头或其他R......
  • MFC CChartCtrl 滚轮缩放
    原文来自:MFC그래프라이브러리,ChartCtrl마우스휠기능추가BOOLCChartCtrl::OnMouseWheel(UINTnFlags,shortzDelta,CPointpt){ScreenToClient(&pt);doubleMinVal=0;doubleMaxVal=0;doublerate=0.1;if(m_bZoomEnabled){......
  • startswith()函数
    startswith()函数概述startswith()是Python字符串方法,用于检查字符串是否以指定的前缀开头。常用于字符串匹配或验证操作。语法str.startswith(prefix[,start[,end]])参数:prefix(必需):要匹配的前缀,可以是字符串或元组(包含多个前缀)。start(可选):检查的起始索引(默认......
  • DolphinScheduler心脏:Quartz的定时任务调度框架深度解析
    Quartz是一个开源的Java作业调度框架,它提供了强大的定时任务调度功能。在DolphinScheduler中,Quartz用于实现定时任务的调度和管理。DolphinScheduler通过QuartzExecutorImpl类与Quartz集成,将工作流及其定时管理操作与Quartz调度框架相结合,实现任务的调度执行。本文将详细剖析Quar......
  • 使用 PowerShell 的 Get-LocalUser 命令可以获取本地用户账户的详细信息。要将输出转
    使用PowerShell的Get-LocalUser命令可以获取本地用户账户的详细信息。要将输出转换为JSON格式,使用ConvertTo-Json命令,这样可以方便地查看和分析这些信息,尤其是在处理多个用户账户时。步骤说明1.使用 Get-LocalUser 获取本地用户信息Get-LocalUser命令用于列出本地......
  • from bson import ObjectId
    ObjectId是MongoDB中用于标识文档的唯一标识符(ID),由BSON库(bson)提供的一个类。以下是ObjectId的作用及其常用操作。ObjectId的作用唯一标识文档:每个存储在MongoDB中的文档都有一个_id字段,默认类型是ObjectId。它是12字节的值,由MongoDB自动生成,用来唯一标识......