【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用
论文信息
标题: Poly Kernel Inception Network for Remote Sensing Detection
作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao
论文链接:https://arxiv.org/pdf/2403.06258
代码链接:https://github.com/NUST-Machine-Intelligence-Laboratory/PKINet
创新点
Poly Kernel Inception Network (PKINet) 的主要创新在于其设计的卷积结构,旨在解决遥感图像目标检测中的几个关键挑战:
-
多尺度特征提取: PKINet采用无膨胀的多尺度卷积核,能够有效提取不同尺度的目标特征,避免了传统大核卷积带来的背景噪声问题。
-
上下文锚定注意力机制: 引入了上下文锚定注意(CAA)模块,以捕获远程上下文信息,增强特征提取的能力。
-
轻量化设计: 通过并行使用深度卷积和1×1卷积,PKINet在保持高性能的同时,显著降低了模型的复杂性和计算成本。
方法
PKINet的核心方法包括以下几个方面:
-
无膨胀多尺度卷积: 通过使用不同大小的卷积核,PKINet能够在不同的感受野中提取丰富的纹理特征,而不依赖于膨胀卷积。
-
上下文锚定注意力模块: CAA模块通过全局平均池化和一维卷积,捕获远程像素之间的关系,增强了中心特征的表达能力。
-
自适应特征融合: 通过通道维度的自适应融合,PKINet能够有效整合局部和全局上下文信息,从而提高目标检测的准确性。
无膨胀多尺度卷积PKI 模块详解
Poly Kernel Inception Network (PKINet) 中的 PKI Module 是其核心组成部分,旨在有效提取遥感图像中的多尺度特征。以下是对 PKI Module 的详细解读,包括其设计理念、结构、功能和实验结果。
设计理念
PKI 模块的设计旨在解决遥感图像目标检测中面临的挑战,尤其是目标尺度的巨大变化和复杂背景。与传统方法不同,PKI 模块采用无膨胀的多尺度卷积核,以避免引入背景噪声,同时有效捕获局部上下文信息。
结构
PKI 模块主要由以下几个部分组成:
-
小卷积核:
- 使用小卷积核(如 3 × 3 3 \times 3 3×3)提取局部特征,能够有效捕捉细节信息。
-
深度可分离卷积:
- 采用一系列并行的深度可分离卷积(Depth-wise Convolutions),以捕获不同尺度的上下文信息。这种设计不仅减少了计算复杂度,还提高了特征提取的效率。
-
多尺度特征提取:
- PKI 模块通过组合不同大小的卷积核(如 3 × 3 3 \times 3 3×3, 5 × 5 5 \times 5 5×5, 7 × 7 7 \times 7 7×7 等),实现对多尺度特征的提取,增强了模型对不同尺寸目标的适应能力。
功能
PKI 模块的主要功能包括:
-
多尺度特征提取: 通过不同大小的卷积核,PKI 模块能够有效提取不同尺度的目标特征,适应遥感图像中目标的多样性。
-
上下文信息捕获: 通过深度可分离卷积,PKI 模块能够捕获局部上下文信息,增强特征的表达能力。
-
避免背景噪声: 由于不使用膨胀卷积,PKI 模块能够避免过于稀疏的特征表示,从而提高检测精度。
PKI 模块是 PKINet 的核心组件,通过创新的多尺度卷积设计和深度可分离卷积结构,有效提升了遥感图像目标检测的性能。其在特征提取和上下文信息捕获方面的优势,使得 PKINet 在多个基准数据集上取得了优异的表现,展示了其在实际应用中的潜力。
效果
在多个遥感目标检测基准数据集上进行的实验表明,PKINet在性能上优于传统方法,尤其是在处理目标尺度变化和复杂背景时表现突出。具体来说,PKINet在以下数据集上取得了显著的检测效果:
- DOTA-v1.0
- DOTA-v1.5
- HRSC2016
- DIOR-R
这些实验结果表明,PKINet不仅提高了检测精度,还在处理速度上也有良好的表现。
实验结果
实验中,PKINet在多个标准数据集上进行了广泛的评估,结果显示:
-
检测精度: PKINet在各个数据集上均表现出色,尤其是在小目标和复杂背景下的检测能力显著提升。
-
模型效率: 由于其轻量化设计,PKINet在计算资源的使用上更为高效,适合实际应用场景。
-
对比分析: 与传统的目标检测模型相比,PKINet在多个指标上均有明显的优势,尤其是在处理多样化的上下文环境时。
总结
Poly Kernel Inception Network (PKINet) 通过创新的卷积结构和上下文注意力机制,成功应对了遥感图像目标检测中的多种挑战。其在特征提取和上下文信息捕获方面的优势,使得PKINet在多个基准数据集上取得了优异的性能,展示了其在实际应用中的潜力。未来的研究可以进一步探索PKINet在其他计算机视觉任务中的应用,以及如何进一步优化其结构以提升性能。
代码
import torch
import torch.nn as nn
from mmcv.cnn import ConvModule
from mmengine.model import BaseModule
from typing import Optional, Union, Sequence
import math
def autopad(k, p=None, d=1): # kernel, padding, dilation# Pad to 'same' shape outputsif 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 p
def make_divisible(x, divisor):# Returns nearest x divisible by divisorif isinstance(divisor, torch.Tensor):divisor = int(divisor.max()) # to intreturn math.ceil(x / divisor) * divisor
class GSiLU(BaseModule):"""Global Sigmoid-Gated Linear Unit, reproduced from paper <SIMPLE CNN FOR VISION>"""def __init__(self):super().__init__()self.adpool = nn.AdaptiveAvgPool2d(1)def forward(self, x):return x * torch.sigmoid(self.adpool(x))class CAA(BaseModule):"""Context Anchor Attention"""def __init__(self,channels: int,h_kernel_size: int = 11,v_kernel_size: int = 11,norm_cfg: Optional[dict] = dict(type='BN', momentum=0.03, eps=0.001),act_cfg: Optional[dict] = dict(type='SiLU'),init_cfg: Optional[dict] = None,):super().__init__(init_cfg)self.avg_pool = nn.AvgPool2d(7, 1, 3)self.conv1 = ConvModule(channels, channels, 1, 1, 0,norm_cfg=norm_cfg, act_cfg=act_cfg)self.h_conv = ConvModule(channels, channels, (1, h_kernel_size), 1,(0, h_kernel_size // 2), groups=channels,norm_cfg=None, act_cfg=None)self.v_conv = ConvModule(channels, channels, (v_kernel_size, 1), 1,(v_kernel_size // 2, 0), groups=channels,norm_cfg=None, act_cfg=None)self.conv2 = ConvModule(channels, channels, 1, 1, 0,norm_cfg=norm_cfg, act_cfg=act_cfg)self.act = nn.Sigmoid()def forward(self, x):attn_factor = self.act(self.conv2(self.v_conv(self.h_conv(self.conv1(self.avg_pool(x))))))return x*attn_factorclass InceptionBottleneck(BaseModule):"""Bottleneck with Inception module"""def __init__(self,in_channels: int,out_channels: Optional[int] = None,kernel_sizes: Sequence[int] = (3, 5, 7, 9, 11),dilations: Sequence[int] = (1, 1, 1, 1, 1),expansion: float = 1.0,add_identity: bool = True,with_caa: bool = True,caa_kernel_size: int = 11,norm_cfg: Optional[dict] = dict(type='BN', momentum=0.03, eps=0.001),act_cfg: Optional[dict] = dict(type='SiLU'),init_cfg: Optional[dict] = None,):super().__init__(init_cfg)out_channels = out_channels or in_channelshidden_channels = make_divisible(int(out_channels * expansion), 8)self.pre_conv = ConvModule(in_channels, hidden_channels, 1, 1, 0, 1,norm_cfg=norm_cfg, act_cfg=act_cfg)self.dw_conv = ConvModule(hidden_channels, hidden_channels, kernel_sizes[0], 1,autopad(kernel_sizes[0], None, dilations[0]), dilations[0],groups=hidden_channels, norm_cfg=None, act_cfg=None)self.dw_conv1 = ConvModule(hidden_channels, hidden_channels, kernel_sizes[1], 1,autopad(kernel_sizes[1], None, dilations[1]), dilations[1],groups=hidden_channels, norm_cfg=None, act_cfg=None)self.dw_conv2 = ConvModule(hidden_channels, hidden_channels, kernel_sizes[2], 1,autopad(kernel_sizes[2], None, dilations[2]), dilations[2],groups=hidden_channels, norm_cfg=None, act_cfg=None)self.dw_conv3 = ConvModule(hidden_channels, hidden_channels, kernel_sizes[3], 1,autopad(kernel_sizes[3], None, dilations[3]), dilations[3],groups=hidden_channels, norm_cfg=None, act_cfg=None)self.dw_conv4 = ConvModule(hidden_channels, hidden_channels, kernel_sizes[4], 1,autopad(kernel_sizes[4], None, dilations[4]), dilations[4],groups=hidden_channels, norm_cfg=None, act_cfg=None)self.pw_conv = ConvModule(hidden_channels, hidden_channels, 1, 1, 0, 1,norm_cfg=norm_cfg, act_cfg=act_cfg)if with_caa:self.caa_factor = CAA(hidden_channels, caa_kernel_size, caa_kernel_size, None, None)else:self.caa_factor = Noneself.add_identity = add_identity and in_channels == out_channelsself.post_conv = ConvModule(hidden_channels, out_channels, 1, 1, 0, 1,norm_cfg=norm_cfg, act_cfg=act_cfg)def forward(self, x):x = self.pre_conv(x)y = x # if there is an inplace operation of x, use y = x.clone() instead of y = xx = self.dw_conv(x)x = x + self.dw_conv1(x) + self.dw_conv2(x) + self.dw_conv3(x) + self.dw_conv4(x)x = self.pw_conv(x)if self.caa_factor is not None:y = self.caa_factor(y)if self.add_identity:y = x * yx = x + yelse:x = x * yx = self.post_conv(x)return xif __name__ == "__main__":# 如果GPU可用,将模块移动到 GPUdevice = torch.device("cuda" if torch.cuda.is_available() else "cpu")# 输入张量 (batch_size, height, width,channels)x = torch.randn(1,32,40,40).to(device)# 初始化 HWD 模块dim=32block = InceptionBottleneck(32)print(block)block = block.to(device)# 前向传播output = block(x)print("输入:", x.shape)print("输出:", output.shape)
输出结果:
相关文章:

【Block总结】PKI 模块,无膨胀多尺度卷积,增强特征提取的能力|即插即用
论文信息 标题: Poly Kernel Inception Network for Remote Sensing Detection 作者: Xinhao Cai, Qiuxia Lai, Yuwei Wang, Wenguan Wang, Zeren Sun, Yazhou Yao 论文链接:https://arxiv.org/pdf/2403.06258 代码链接:https://github.com/NUST-Mac…...

自制一个入门STM32 四足机器人具体开发顺序
0 前期准备 1. 知识储备 学习 STM32 微控制器的基础知识,包括 GPIO、定时器、串口通信等外设的使用,可通过官方文档、教程和视频课程进行学习。了解舵机控制原理,因为四足机器人通常使用舵机来实现关节运动。掌握基本的机械结构设计知识&am…...

物联网智能项目之——智能家居项目的实现!
成长路上不孤单😊😊😊😊😊😊 【14后😊///计算机爱好者😊///持续分享所学😊///如有需要欢迎收藏转发///😊】 今日分享关于物联网智能项目之——智能家居项目…...

[免费]微信小程序智能商城系统(uniapp+Springboot后端+vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序智能商城系统(uniappSpringboot后端vue管理端),分享下哈。 项目视频演示 【免费】微信小程序智能商城系统(uniappSpringboot后端vue管理端) Java毕业设计_哔哩哔哩_bilibili 项目介绍…...

C28.【C++ Cont】顺序表的实现
🧨🧨🧨🧨🧨🧨🧨🧨🧨初二篇🧨🧨🧨🧨🧨🧨🧨🧨🧨 目录 1.知识回顾…...

【电工基础】低压电器元件,低压断路器(空开QF),接触器(KM)
一.低压电器元件定义 电器可分为高压电器和低压电器两大类,我国现行标准是将工作在交流1200V(50Hz)以下、直流1500V以下的电器设备称为低压电器。 二.低压断路器,空开,空气断路器 1.空开图片与使用方式 当电路中发生严重过载、短路及失压等故…...

从 UTC 日期时间字符串获取 Unix 时间戳:C 和 C++ 中的挑战与解决方案
在编程世界里,从 UTC 日期时间字符串获取 Unix 时间戳,看似简单,实则暗藏玄机。你以为输入一个像 “Fri, 17 Jan 2025 06:07:07” 这样的 UTC 时间,然后轻松得到 1737094027(从 1970 年 1 月 1 日 00:00:00 UTC 开始经…...

[前端开发]记录国内快速cdn库,用于在线引入JavaScript第三方库
字节跳动的两个库,官网地址如下,搜索时优先找第一个,可用来链接axios,Boostrap等等第三方库 1. 字节跳动静态资源公共库 比如说搜索lodash,用于节流防抖的库,点击复制即可,一般是****.js或****.min.js这样的为后缀名的链接 点击复制即可, <script src"https://lf9-cd…...

留学生scratch计算机haskell函数ocaml编程ruby语言prolog作业VB
您列出了一系列编程语言和技术,这些可能是您在留学期间需要学习或完成作业的内容。以下是对每个项目的简要说明和它们可能涉及的领域或用途: Scratch: Scratch是一种图形化编程语言,专为儿童和初学者设计,用于教授编程…...

CF 766A.Mahmoud and Longest Uncommon Subsequence(Java实现)
题目分析 (小何同学语文不太好,看这个题弯弯绕绕,看不懂一点,哈哈哈。)在尝试示例中分析之后,题目的意思大概就是,两个字符串相同就输出-1,不同就输出最长的那个字符串长度 思路分析 数据输入存值之后&…...

React 的 12 个核心概念
文章目录 一、JSX:逻辑与视图的桥梁二、组件:模块化构建的核心三、Props:单向数据流的基石四、State:动态交互的核心五、useEffect:副作用管理的利器六、Context:跨层级数据共享的利器七、React.memo&#…...

玩转大语言模型——使用langchain和Ollama本地部署大语言模型
系列文章目录 玩转大语言模型——使用langchain和Ollama本地部署大语言模型 玩转大语言模型——ollama导入huggingface下载的模型 玩转大语言模型——langchain调用ollama视觉多模态语言模型 玩转大语言模型——使用GraphRAGOllama构建知识图谱 玩转大语言模型——完美解决Gra…...

【数据结构】(2)时间、空间复杂度
一、衡量算法好坏的指标 时间复杂度衡量算法的运行速度,空间复杂度衡量算法所需的额外空间。这些指标,是某场景中选择使用哪种数据结构和算法的依据。如今,计算机的存储器已经变得容易获得,所以不再太关注空间复杂度。 二、渐进表…...

分享14分数据分析相关ChatGPT提示词
数据分析 在研究过程中数据分析扮演着至关重要的角色,它能够帮助研究者从海量数据中提取有价值的信息,从而为研究结论提供坚实的依据。而ChatGPT在数据分析领域展现出了强大的辅助能力,为研究者提供了全方位的支持。当研究者提供清晰且具体的…...

dify实现原理分析-rag-数据检索的实现
数据检索的总体执行步骤 数据检索总体步骤如下: #mermaid-svg-YCRNdSE7T1d0Etyj {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-YCRNdSE7T1d0Etyj .error-icon{fill:#552222;}#mermaid-svg-YCRNdSE7T1d…...

Day30-【AI思考】-错题分类进阶体系——12维错误定位模型
文章目录 错题分类进阶体系——12维错误定位模型**一、认知层错误(根源性缺陷)****二、操作层错误(执行过程偏差)****三、心理层错误(元认知障碍)****四、进阶错误(专业级陷阱)** 错…...

全国31省空间权重矩阵(地理相邻空间、公路铁路地理距离空间、经济空间)权重矩阵数据-社科数据
中国31个省份空间权重矩阵-社科数据https://download.csdn.net/download/paofuluolijiang/90028597 https://download.csdn.net/download/paofuluolijiang/90028597 空间权重矩阵是反映个体在空间中依赖关系的矩阵,本数据计算全国31个省三种标准化处理的空间权重矩…...

Docker容器数据恢复
Docker容器数据恢复 1 创建mongo数据库时未挂载数据到宿主机2 查找数据卷位置3 将容器在宿主机上的数据复制到指定目录下4 修改docker-compose并挂载数据(注意端口)5 重新运行新容器 以mongodb8.0.3为例。 1 创建mongo数据库时未挂载数据到宿主机 versi…...

Visual Studio使用GitHub Copilot提高.NET开发工作效率
GitHub Copilot介绍 GitHub Copilot 是一款 AI 编码助手,可帮助你更快、更省力地编写代码,从而将更多精力集中在问题解决和协作上。 GitHub Copilot Free包含哪些功能? 每月 2000 代码补全,帮助开发者快速完成代码编写。 每月 …...

【matlab】绘图 离散数据--->连续函数
matlab绘图练习 离散数据及离散函数对离散区间进行细划分 达到连续效果画plot(y)图 与 复数的应用 离散数据及离散函数 例1 x1[1 2 4 6 7 8 10 11 12 14 16 17 18 20] y1[1 2 4 6 7 8 10 10 8 7 6 4 2 1] figure(1); plot(x1,y1,o,MarkerSize,15); x21:20; y2log(x2); figure…...

Python大数据可视化:基于python的电影天堂数据可视化_django+hive
开发语言:Python框架:djangoPython版本:python3.7.7数据库:mysql 5.7数据库工具:Navicat11开发软件:PyCharm 系统展示 管理员登录 管理员功能界面 电影数据 看板展示 我的信息 摘要 电影天堂数据可视化是…...

几种K8s运维管理平台对比说明
目录 深入体验**结论**对比分析表格**1. 功能对比****2. 用户界面****3. 多租户支持****4. DevOps支持** 细对比分析1. **Kuboard**2. **xkube**3. **KubeSphere**4. **Dashboard****对比总结** 深入体验 KuboardxkubeKubeSphereDashboard 结论 如果您需要一个功能全面且适合…...

YOLO11/ultralytics:环境搭建
前言 人工智能物体识别行业应该已经饱和了吧?或许现在并不是一个好的入行时候。 最近看到了各种各样相关的扩展应用,为了理解它,我不得不去尝试了解一下。 我选择了git里非常受欢迎的yolo系列,并尝试了最新版本YOLO11或者叫它ultr…...

Effective Objective-C 2.0 读书笔记—— 消息转发
Effective Objective-C 2.0 读书笔记—— 消息转发 文章目录 Effective Objective-C 2.0 读书笔记—— 消息转发前言消息转发机制概述动态方法解析处理dynamic的属性用于懒加载 消息转发快速消息转发完整消息转发 总结 前言 在前面我学习了关联对象和objc_msgSend的相关内容&a…...

【Python-办公自动化】实现自动化输出json数据类型的分析报告和正逆转换
分析报告 import json from pprint import pprint, PrettyPrinterdef analyze_energy_data(file_path):"""能源数据分析与结构查看函数参数:file_path (str): JSON文件路径功能:1. 加载并解析JSON数据2. 显示数据结构概览3. 交互式结构探索"""…...

Docker小游戏 | 使用Docker部署RPG网页小游戏
Docker小游戏 | 使用Docker部署RPG网页小游戏 前言一、项目介绍项目简介项目预览二、系统要求环境要求环境检查Docker版本检查检查操作系统版本三、部署RPG网页小游戏下载镜像创建容器检查容器状态检查服务端口安全设置四、访问RPG网页小游戏五、总结前言 随着互联网技术的不断…...

技术周总结 01.13~01.19 周日(Spring Visual Studio git)
文章目录 一、01.14 周二1.1)问题01:Spring的org.springframework.statemachine.StateMachine 是什么,怎么使用?:如何使用StateMachine: 1.2)问题02:Spring StateMachine 提供了一系列高级特性 …...

Linux中使用unzip
安装命令 yum install unzip unzip常用选项和参数 选项 说明 -q 隐藏解压过程中的消息输出 -d /path/to/directory 指定解压文件的目标目录 -P password 如果.zip文件被密码保护,使用此选项可以指定打开文件所需的密码 解压命令 unzip 要解压的压缩包unz…...

Baklib引领内容管理平台新时代优化创作流程与团队协作
内容概要 在迅速变化的数字化时代,内容管理平台已成为各种行业中不可或缺的工具。通过系统化的管理,用户能够有效地组织、存储和共享信息,从而提升工作效率和创意表达。Baklib作为一款新兴的内容管理平台,以其独特的优势和创新功…...

利用Redis实现数据缓存
目录 1 为啥要缓存捏? 2 基本流程(以查询商铺信息为例) 3 实现数据库与缓存双写一致 3.1 内存淘汰 3.2 超时剔除(半自动) 3.3 主动更新(手动) 3.3.1 双写方案 3.3.2 读写穿透方案 3.3.…...