YOLO11改进-模块-引入多尺度差异融合模块MDFM
遥感变化检测(RSCD)专注于识别在不同时间获取的两幅遥感图像之间发生变化的区域。近年来,卷积神经网络(CNN)在具有挑战性的 RSCD 任务中展现出了良好的效果。然而,这些方法未能有效地融合双时相特征,也未提取出对后续 RSCD 任务有益的有用信息。此外,它们在特征聚合中没有考虑多层次特征交互,并且忽略了差异特征与双时相特征之间的关系,从而影响了 RSCD 的结果。为解决上述问题,本文通过孪生卷积网络提取不同层次的双时相特征,然后创建多尺度差异融合模块(MDFM)来融合双时相特征,并以多尺度方式提取包含丰富上下文信息的差异特征。本文考录到YOLO目标检测的neck对特征拼接的时候,没有考虑到不同层之间特征的差异性,以及neck层的多尺度信息的缺少,本文将MDFM模块替换neck层的contact。


1. 多尺度差异融合模块MDFM结构介绍
MDFM主要用于融合双时相图像特征并生成带有丰富上下文信息的差异特征,其过程包含以下步骤:
1. 特征提取与差异特征生成
首先从双时相图像中提取特征f1和f2,然后将f1和f2进行像素级别的相减,再对相减结果取绝对值,最后通过一个3x3的卷积操作得到Di。
2. 多尺度特征融合(MSFF)
接着利用多尺度特征学习机制来增强特征融合效果。该机制通过不同核大小的卷积构建多尺度融合过程,具体是通过一个名为 MSFF 单元来实现的。MSFF 单元包含四个分支的卷积操作,其中三个分支分别进行特定的卷积融合操作,即[1x1,3x3,1x1][1x1,5x5,1x1]、[1x1,7x7,1x1]、[1x1]。最后将这四个分支的结果进行拼接操作,得到融合后的特征。
3. 元素级通道权重与最终融合差异特征生成
引入元素级通道权重wi,其计算方式与Fi和Di有关。然后将Wi和前面得到的Mi相加,得到同时融合了多尺度信息的Si。最后通过通道卷积块(CWCB)进行双时相特征融合操作,即将S1和S2逐通道拼接后,先经过3x3深度卷积操作,再乘以wi,从而得到最终融合的差异特征Ci。

2. YOLOv11与MDFM的结合
1. 本文将MDFM模块替换neck层的contact。
3. MDFM代码部分
import torch
import torch.nn as nn
from torch.nn.functional import relu6# https://ieeexplore.ieee.org/abstract/document/10504297class MSFF(nn.Module):def __init__(self, inchannel, mid_channel):super(MSFF, self).__init__()self.conv1 = nn.Sequential(nn.Conv2d(inchannel, inchannel, 1, stride=1, bias=False),nn.BatchNorm2d(inchannel),nn.ReLU(inplace=True))self.conv2 = nn.Sequential(nn.Conv2d(inchannel, mid_channel, 1, stride=1, bias=False),nn.BatchNorm2d(mid_channel),nn.ReLU(inplace=True),nn.Conv2d(mid_channel, mid_channel, 3, stride=1, padding=1, bias=False),nn.BatchNorm2d(mid_channel),nn.ReLU(inplace=True),nn.Conv2d(mid_channel, inchannel, 1, stride=1, bias=False),nn.BatchNorm2d(inchannel),nn.ReLU(inplace=True))self.conv3 = nn.Sequential(nn.Conv2d(inchannel, mid_channel, 1, stride=1, bias=False),nn.BatchNorm2d(mid_channel),nn.ReLU(inplace=True),nn.Conv2d(mid_channel, mid_channel, 5, stride=1, padding=2, bias=False),nn.BatchNorm2d(mid_channel),nn.ReLU(inplace=True),nn.Conv2d(mid_channel, inchannel, 1, stride=1, bias=False),nn.BatchNorm2d(inchannel),nn.ReLU(inplace=True))self.conv4 = nn.Sequential(nn.Conv2d(inchannel, mid_channel, 1, stride=1, bias=False),nn.BatchNorm2d(mid_channel),nn.ReLU(inplace=True),nn.Conv2d(mid_channel, mid_channel, 7, stride=1, padding=3, bias=False),nn.BatchNorm2d(mid_channel),nn.ReLU(inplace=True),nn.Conv2d(mid_channel, inchannel, 1, stride=1, bias=False),nn.BatchNorm2d(inchannel),nn.ReLU(inplace=True))self.convmix = nn.Sequential(nn.Conv2d(4 * inchannel, inchannel, 1, stride=1, bias=False),nn.BatchNorm2d(inchannel),nn.ReLU(inplace=True),nn.Conv2d(inchannel, inchannel, 3, stride=1, padding=1, bias=False),nn.BatchNorm2d(inchannel),nn.ReLU(inplace=True))def forward(self, x):x1 = self.conv1(x)x2 = self.conv2(x)x3 = self.conv3(x)x4 = self.conv4(x)x_f = torch.cat([x1, x2, x3, x4], dim=1)out = self.convmix(x_f)return outdef autopad(k, p=None, d=1): # kernel, padding, dilation"""Pad to 'same' shape outputs."""if d > 1:k = d * (k - 1) + 1 if isinstance(k, int) else [d * (x - 1) + 1 for x in k] # actual kernel-sizeif p is None:p = k // 2 if isinstance(k, int) else [x // 2 for x in k] # auto-padreturn pclass Conv(nn.Module):"""Standard convolution with args(ch_in, ch_out, kernel, stride, padding, groups, dilation, activation)."""default_act = nn.SiLU() # default activationdef __init__(self, c1, c2, k=1, s=1, p=None, g=1, d=1, act=True):"""Initialize Conv layer with given arguments including activation."""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 if isinstance(act, nn.Module) else nn.Identity()def forward(self, x):"""Apply convolution, batch normalization and activation to input tensor."""return self.act(self.bn(self.conv(x)))def forward_fuse(self, x):"""Perform transposed convolution of 2D data."""return self.act(self.conv(x))class MDFM(nn.Module):def __init__(self, in_d, out_d):super(MDFM, self).__init__()self.in_d = in_dself.out_d = out_dself.MPFL = MSFF(inchannel=in_d, mid_channel=64) ##64self.conv_diff_enh = nn.Sequential(nn.Conv2d(self.in_d, self.in_d, kernel_size=3, stride=1, padding=1, bias=False),nn.BatchNorm2d(self.in_d),nn.ReLU(inplace=True))self.conv_dr = nn.Sequential(nn.Conv2d(self.in_d, self.out_d, kernel_size=3, stride=1, padding=1, bias=False),nn.BatchNorm2d(self.out_d),nn.ReLU(inplace=True))self.conv_sub = nn.Sequential(nn.Conv2d(self.in_d, self.in_d, 3, padding=1, bias=False),nn.BatchNorm2d(self.in_d),nn.ReLU(inplace=True),)self.convmix = nn.Sequential(nn.Conv2d(2 * self.in_d, self.in_d, 3, groups=self.in_d, padding=1, bias=False),nn.BatchNorm2d(self.in_d),nn.ReLU(inplace=True),)self.conv_up = Conv(int(in_d*0.5), in_d, 1, act=nn.ReLU())def forward(self, x):# difference enhancex1,x2=x[0],x[1]b, c, h, w = x1.shape[0], x1.shape[1], x1.shape[2], x1.shape[3]x2=self.conv_up(x2)x_sub = torch.abs(x1 - x2)x_att = torch.sigmoid(self.conv_sub(x_sub))x1 = (x1 * x_att) + self.MPFL(self.conv_diff_enh(x1))x2 = (x2 * x_att) + self.MPFL(self.conv_diff_enh(x2))# fusionx_f = torch.stack((x1, x2), dim=2)x_f = torch.reshape(x_f, (b, -1, h, w))x_f = self.convmix(x_f)# after cax_f = x_f * x_attout = self.conv_dr(x_f)return outif __name__ == '__main__':x1 = torch.randn((32, 512, 8, 8))x2 = torch.randn((32, 256, 8, 8))model = MDFM(512, 64)out = model(x1, x2)print(out.shape)
4. 将FDFM Block引入到YOLOv11中
第一: 将下面的核心代码复制到D:\model\yolov11\ultralytics\change_model路径下,如下图所示。

第二:在task.py中导入FDFM包

第三:在task.py中的模型配置部分下面代码
第四:将模型配置文件复制到YOLOV11.YAMY文件中
第一个改进的配置文件
# Ultralytics YOLO 🚀, AGPL-3.0 license
# YOLO11 object detection model with P3-P5 outputs. For Usage examples see https://docs.ultralytics.com/tasks/detect# Parameters
nc: 80 # number of classes
scales: # model compound scaling constants, i.e. 'model=yolo11n.yaml' will call yolo11.yaml with scale 'n'# [depth, width, max_channels]n: [0.50, 0.25, 1024] # summary: 319 layers, 2624080 parameters, 2624064 gradients, 6.6 GFLOPss: [0.50, 0.50, 1024] # summary: 319 layers, 9458752 parameters, 9458736 gradients, 21.7 GFLOPsm: [0.50, 1.00, 512] # summary: 409 layers, 20114688 parameters, 20114672 gradients, 68.5 GFLOPsl: [1.00, 1.00, 512] # summary: 631 layers, 25372160 parameters, 25372144 gradients, 87.6 GFLOPsx: [1.00, 1.50, 512] # summary: 631 layers, 56966176 parameters, 56966160 gradients, 196.0 GFLOPs# YOLO11n backbone
backbone:# [from, repeats, module, args]- [-1, 1, Conv, [64, 3, 2]] # 0-P1/2- [-1, 1, Conv, [128, 3, 2]] # 1-P2/4- [-1, 2, C3k2, [256, False, 0.25]]- [-1, 1, Conv, [256, 3, 2]] # 3-P3/8- [-1, 2, C3k2, [512, False, 0.25]]- [-1, 1, Conv, [512, 3, 2]] # 5-P4/16- [-1, 2, C3k2, [512, True]]- [-1, 1, Conv, [1024, 3, 2]] # 7-P5/32- [-1, 2, C3k2, [1024, True]]- [-1, 1, SPPF, [1024, 5]] # 9- [-1, 2, C2PSA, [1024]] # 10# YOLO11n head
head:- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 6], 1,MDFM, [256,384]]# cat backbone P4- [-1, 2, C3k2, [512, False]] # 13- [-1, 1, nn.Upsample, [None, 2, "nearest"]]- [[-1, 4], 1, Concat, [1]] # cat backbone P3- [-1, 2, C3k2, [256, False]] # 16 (P3/8-small)- [-1, 1, Conv, [256, 3, 2]]- [[-1, 13], 1, Concat, [1]] # cat head P4- [-1, 2, C3k2, [512, False]] # 19 (P4/16-medium)- [-1, 1, Conv, [512, 3, 2]]- [[-1, 10], 1, Concat, [1]] # cat head P5- [-1, 2, C3k2, [1024, True]] # 22 (P5/32-large)- [[16, 19, 22], 1, Detect, [nc]] # Detect(P3, P4, P5)
第五:运行成功
from ultralytics.models import NAS, RTDETR, SAM, YOLO, FastSAM, YOLOWorldif __name__=="__main__":# 使用YOLOv11.yamy文件搭建的模型训练model = YOLO(r"D:\model\yolov11\ultralytics\cfg\models\11\yolo11_MDFM.yaml") # build a new model from YAMLmodel.train(data=r'D:\model\yolov11\ultralytics\cfg\datasets\VOC_my.yaml',epochs=300, imgsz=640, batch=64# , close_mosaic=10)

相关文章:
YOLO11改进-模块-引入多尺度差异融合模块MDFM
遥感变化检测(RSCD)专注于识别在不同时间获取的两幅遥感图像之间发生变化的区域。近年来,卷积神经网络(CNN)在具有挑战性的 RSCD 任务中展现出了良好的效果。然而,这些方法未能有效地融合双时相特征&#x…...
vlan和vlanif
文章目录 1、为什么会有vlan的存在2、vlan(虚拟局域网)1、vlan原理1. 为什么这样划分了2、如何实现不同交换机相同的vlan实现互访呢3、最优化的解决方法,vlan不同交换机4、vlan标签和vlan数据帧 5、vlan实现2、基于vlan的划分方式1、基于接口的vlan划分方式2、基于m…...
Apache Kylin最简单的解析、了解
官网:Overview | Apache Kylin 一、Apache Kylin是什么? 由中国团队研发具有浓厚的中国韵味,使用神兽麒麟(kylin)为名 的一个OLAP多维数据分析引擎:(据官方给出的数据) 亚秒级响应ÿ…...
MySQL——连接
一.引入库 我们已经分享了很多通过命令行方式去操作数据库,那么数据库该怎么通过语言去访问呢? 这里分享怎么通过C/C来连接数据库。 首先需要到MySQL官网,下载专门用于C/C连接数据库的库,但是一般不需要再去官网下载。 因为在…...
前端微服务实战:大型应用的拆分与治理
"这个系统已经无法维护了..."周五的架构评审会上,我盯着屏幕上那张错综复杂的依赖关系图发愁。作为一个运行了三年的企业级中后台系统,代码量已经超过 50 万行,构建时间长达 40 分钟,任何修改都可能引发连锁反应。 更让人头疼的是,随着业务的快速发展,不同业务线之间…...
Linux shell的七大功能 --- history
1.直接输入“history” 这个命令可以显示出曾经使用过的命令(最近时间的500条) history 2.“history”命令也可以搭配其他命令一起使用。 例:history | grep "vim",找出所有包含“vim”的记录; 也可以搭配…...
C++ webrtc开发(非原生开发,linux上使用libdatachannel库)
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言一、libdatachannel库的下载和build二、开始使用 1.2.引入库3.开始使用 总结 前言 使用c开发webrtc在互联网上留下的资料甚少,经过我一段时间的探…...
C语言刷题
1. 题目描述 根据给出的三角形3条边a:b.c(a.b,c<100.000),计算三角形的周长和面积。 输入描述: 一行,三角形3条边(能构成三角形),中间用一个空格隔开. 输出描述: 一行,三角形周长和面积保留两位小数,中问用一个空…...
LabVIEW实现RFID通信
目录 1、RFID通信原理 2、硬件环境部署 3、程序架构 4、前面板设计 5、程序框图设计 6、测试验证 本专栏以LabVIEW为开发平台,讲解物联网通信组网原理与开发方法,覆盖RS232、TCP、MQTT、蓝牙、Wi-Fi、NB-IoT等协议。 结合实际案例,展示如何利用LabVIEW和常用模块实现物联网系…...
Linux 网络流量控制 - 实现概述
摘要 Linux 提供了一整套丰富的流量控制(traffic control)功能。本文档概述了相应的内核代码设计,描述了其结构,并通过描述一种新的排队策略来说明新元素的添加。 1 引言 最近的Linux内核提供了多种流量控制功能。Alexey Kuznetsov(kuznet…...
分布式 令牌桶算法 总结
前言 相关系列 《分布式 & 目录》《分布式 & 令牌桶算法 & 总结》《分布式 & 令牌桶算法 & 问题》 参考文献 《【算法】令牌桶算法》 概述 简介 TBA Token Bucket Algorithm 令牌桶算法是一种流行于网络通信领域的流量控制/频率限制算法。令牌…...
FFMPEG视频转图片
用FFMPEG视频转图片,并且for循环 import os import subprocess# 输入文件夹和输出文件夹路径 input_folder r"I:\xxx" output_base_folder r"D:\xxx\YOLO\data\video" output_subfolder_name "20240609"# 创建输出子文件夹 output…...
docker入门实践---虚拟机环境配置
文章目录 1.检查内核版本2.确定centos7可以上网3.关闭防火墙4.关闭防火墙5.更换阿里云6.安装gcc7.设置镜像仓库(阿里云)8更新软件包9.安装docket-ce10.启动docker11.普通用户权限设置 1.检查内核版本 2.确定centos7可以上网 3.关闭防火墙 下面的这个表示…...
java要防止重复序列化的问题JSON.toJSONString转义问题
要防止重复序列化的问题JSON.toJSONString(entity) 20241213 10:29 背景: 我在设计业务实现echart图标渲染,业务接口实时性查询耗时很长,为了提高系统可用性和用户体验,采用中间表的方案——即在中间表中存储大JSON。 但是在自测…...
TS的类型守卫、类型约束实践
类型守卫 // 基础类型判断 const arr [30, 50] console.log(typeof arr) // object const set new Set(arr) console.log(typeof set) // object const map new Map() console.log(typeof map) // objectclass Customer {constructor() {}buy(method:string) {console.log(…...
文件转曲,限制PDF文件编辑的最佳方案!
随着数字化进程的推进,PDF文件凭借其多样化的功能和优越的兼容性已经被广泛使用,成为了现代文档交流和存储的重要工具,满足了不同用户和行业的需求。 虽然PDF格式文件的功能很多,常见的比如阅读、编辑、加密、转换、还可用于印刷…...
MySQL系列之数据授权(安全)
导览 前言Q:如何对MySQL数据库进行授权管理一、MySQL的“特权”1. 权限级别2. 权限清单 二、授权操作1. 查看权限2. 分配权限3. 回收权限 结语精彩回放 前言 看过博主上一篇的盆友,可以Get到一个知识点:数据授权(eg:g…...
用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!
用 Python 实现经典的 2048 游戏:一步步带你打造属于你的小游戏!(结尾附完整代码) 简介 2048 是一个简单而又令人上瘾的数字拼图游戏。玩家通过滑动方块使相同数字的方块合并,目标是创造出数字 2048!在这篇…...
Vue vs. React:两大前端框架的深度对比与分析(一)
前言 在当今快速发展的前端领域中,Vue和React作为两个备受瞩目的前端框架,已经成为许多开发者的首选。这两个框架凭借其出色的设计和强大的功能,在构建现代化、高效性能的Web应用方面扮演着重要角色。 Vue和React都以其独特的特点吸引了众多开…...
React 进阶深入理解核心概念与高阶实践
在上一节中,我们学习了 React 的基础知识,包括组件、状态管理和基本操作。接下来,我们将进一步探索 React 的高级功能和实战技巧,例如 组件间通信、高阶组件、Context API、React Router 等。这些内容将帮助你构建更复杂、功能更丰…...
千问3.5-2B在法律科技中的应用:合同截图条款识别+风险点标注+合规建议生成
千问3.5-2B在法律科技中的应用:合同截图条款识别风险点标注合规建议生成 1. 法律科技中的AI应用场景 法律行业每天需要处理大量合同文件,传统的人工审核方式效率低下且容易出错。千问3.5-2B作为一款支持图片理解的AI模型,为法律科技领域带来…...
Unity资源提取工具AssetStudio完全指南:从问题解决到专业应用
Unity资源提取工具AssetStudio完全指南:从问题解决到专业应用 【免费下载链接】AssetStudio AssetStudio - Based on the archived Perfares AssetStudio, I continue Perfares work to keep AssetStudio up-to-date, with support for new Unity versions and addi…...
自己做SEO时有哪些容易被忽视的关键点_SEO 自己怎么做
自己做SEO时容易被忽视的关键点 在当今的互联网时代,搜索引擎优化(SEO)已经成为每个网站主的必修课。在自己做SEO时,有些关键点往往会被忽视,导致网站的流量和排名并未达到最佳效果。本文将深入探讨这些容易被忽视的关…...
如何高效管理ComfyUI插件:完整指南与最佳实践
如何高效管理ComfyUI插件:完整指南与最佳实践 【免费下载链接】ComfyUI-Manager ComfyUI-Manager is an extension designed to enhance the usability of ComfyUI. It offers management functions to install, remove, disable, and enable various custom nodes …...
Python自动化抢票实战:告别手动抢票,用技术提升成功率
Python自动化抢票实战:告别手动抢票,用技术提升成功率 【免费下载链接】damaihelper 支持大麦网,淘票票、缤玩岛等多个平台,演唱会演出抢票脚本 项目地址: https://gitcode.com/gh_mirrors/dam/damaihelper 在演唱会门票秒…...
基于 MySQL+MHA+Keepalived 搭建高可用主从集群实战
一、方案背景与技术选型1.1 为什么需要 MySQL 高可用在生产环境中,数据库是业务系统的核心基石,一旦 MySQL 服务出现宕机、主库故障等问题,会直接导致业务中断、数据丢失,给企业带来不可估量的损失。因此,搭建一套高可…...
WebPlotDigitizer:计算机视觉辅助的图表数据提取工具深度解析
WebPlotDigitizer:计算机视觉辅助的图表数据提取工具深度解析 【免费下载链接】WebPlotDigitizer Computer vision assisted tool to extract numerical data from plot images. 项目地址: https://gitcode.com/gh_mirrors/we/WebPlotDigitizer 在科研和数据…...
收藏!新手程序员必看:大模型入门指南,告别“没基础”焦虑
准备入门大模型?请立刻丢掉“我没基础”“这技术太难”的顾虑!作为常年深耕技术领域的博主,我始终坚信:只要你有主动学习的意愿,再加上持续的付出,不仅能轻松攻克大模型入门难关,更能熟练运用它…...
Stable-Diffusion-V1-5 效果对比:不同开源大模型在人物肖像生成上的差异
Stable-Diffusion-V1-5 效果对比:不同开源大模型在人物肖像生成上的差异 最近在玩AI画图的朋友,可能都绕不开一个名字:Stable Diffusion。尤其是它的V1-5版本,可以说是很多人的“启蒙老师”,在开源社区里火了好一阵子…...
2026年亲测有效:合肥无人机培训案例分享
行业痛点分析随着无人机技术的飞速发展,其在各个领域的应用越来越广泛。然而,无人机行业也面临着一些核心技术挑战。首先,无人机的操作和维护需要专业的知识和技能,而市场上缺乏足够的专业人才。根据行业数据显示,目前…...
