【论文复现】轻松利用自适应特征融合实现去雾
📝个人主页🌹:Eternity._
🌹🌹期待您的关注 🌹🌹
❀ 智慧医疗
- 介绍
- 创新点
- 网络结构
- 特征提取阶段
- 自适应融合阶段
- 图像重建阶段
- 上下文增强模块CEM
- 特征融合模块AFM
- 结果分析
提示
论文题目:MFAF-Net: image dehazing with multi-level features and adaptive fusion
论文地址:https://doi.org/10.1007/s00371-023-02917-8
接下来将详细介绍本方法的结构、原理以及复现
介绍
该论文提出了多层次特征和自适应融合网络(MFAF-Net),用于单图像去雾。该方法将多尺度膨胀卷积层与特征注意力模块相结合,从而能够获取信息丰富的上下文信息。同时,该方法提出了一种新的融合方法,用于低级和高级特征融合,以恢复具有更详细信息的图像。
创新点
-
此篇论文介绍了一种新颖的特征提取架构,称为CEM。该架构由两个核心部分组成:一是多尺度膨胀卷积层,它负责捕获丰富且多样的上下文特征信息;二是特征增强模块(FAM),该模块从通道维度和像素层面进一步优化和强化了特征表达。
-
此外,论文还创新性地开发了一个融合策略,命名为AFM融合模块。此模块专门设计用于整合语义内容与层级结构不一致的特征,从而赋予了网络在处理多尺度特征时更高的灵活性和适应性。
本文所涉及的所有资源的获取方式:这里
网络结构
该网络的结构如图1所示
图1:MFAF-Net的网络结构
特征提取阶段
如图1所示,网络的前半部分专注于特征提取。首先,利用一个浅层特征提取模块,该模块包含一个3×3的卷积层配合ReLU激活函数,将输入图像的通道数从3提升至32。接着,从F0到F1的转换过程中,嵌入了三层上下文增强模块CEM,其后紧跟一个3×3的卷积层,随后执行一次下采样操作,使通道数增加到64。类似地,F1到F2的过渡也遵循这一模式:三层CEM模块加上一个3×3卷积层,再经过下采样,通道数跃升至96。特征提取的最终阶段与前两个阶段结构相同,即从F2到F3也是通过三层CEM模块和一个3×3卷积层进行处理。在这一部分,设计借鉴了残差结构的理念,通过对不同层级的输出特征图进行相加,构建起了标准的残差连接,旨在维持图像分辨率的同时,有效减少特征提取环节中关键信息的损失。
自适应融合阶段
如图1所示,自适应融合阶段的核心组件为特征融合模块AFM。为了高效整合来自特征提取阶段的特征图信息,该论文创新地在相邻两级特征块间嵌入了全新的AFM模块。通过组合一个双线性插值层与一个3×3的卷积层来执行上采样,这一过程不仅提升了特征的分辨率,还极大地促进了与先前特征图的深度融合与互补。
图像重建阶段
最终,该方法利用一层3×3的卷积从浅层特征图里恢复起RGB彩色图像,使用Tanh激活函数进一步优化整体的视觉效果,最终与输入图像相加,利用残差结构来减少图像关键细节的丢失以在保证图像分辨率的同时获得最优的清晰图像的恢复效果。
上下文增强模块CEM
上下文增强模块能够通过具有不同大小卷积核的卷积来充分提取图像不同尺度的特征并进行上下文的聚合,并利用特征注意力模块FAM增强结果特征。具体来说,由于大的感受野有助于捕获信息丰富的上下文信息,因此该模块采用三个卷积层来提取这些特征图,卷积核大小分别为 1、3 和 5。CEM的整体结构如图2所示,特征图x输入到该模块之后将被分别输入到三个卷积核大小不同的卷积层中,具体实现如下:
self.conv1 = nn.Conv2d(inchannel, outchannel, 1)
self.conv2 = nn.Conv2d(inchannel, outchannel, 3, padding=1)
self.conv3 = nn.Conv2d(inchannel, outchannel, 5, padding=2)
由于在三层卷积后还要两两相加,所以需要注意三层卷积得到的特征图的大小应该相同,所以要在实现卷积的时候巧妙利用padding。
注意
比如输入一个大小为3×256×256大小的图像
经过前面的浅层卷积之后此时x特征图的大小应该为32×256×256
经过k=1的卷积层之后大小为32×254×254
经过k=3的卷积层之后大小为32×252×252
经过k=5的卷积层之后大小为32×250×250
三个特征图的大小并不相同,若想让三者的大小相同需要利用padding
对k=3的卷积层设置padding=1,则此时特征图大小变为32×254×254
对k=5的卷积层设置padding=2,则此时特征图大小变为32×254×254
此时三个特征图的大小相等,所以需要巧妙利用padding实现不同特征图的大小相等以方便后续步骤的进行
在两两相加之后,将获得的两张特征图拼接,注意,拼接之后的图像通道数量从32变成了64,所以在实现后面的卷积的时候需要注意输入通道数和输出通道数。
self.conv4 = nn.Conv2d(2 * inchannel, outchannel, 3, padding=1)
最后经过特征注意力模块增强效果之后与该模块的输入X相加得到最终的输出。
图2:CEM的结构
特征注意力模块的结构如图3所示。
图3:FAM的结构
在该模块中,使用Depth-wise卷积和Point-wise卷积来取代传统特征注意力中的普通卷积,以进一步增强特征提取能力和上下文特征的理解能力。通过这种独特的设计,所提出的FAM能够从通道和像素的角度增强结果的上下文特征,Depth-wise和Point-wise的实现如下:
self.dw = nn.Conv2d(inchannels, outchannels, kernalsize, 1)
self.pw = nn.Conv2d(inchannels, outchannels, 1, padding=1)
特征融合模块AFM
特征融合模块的结构如图4所示。文章里面说设计这个模块的原因是低级和高级特性在本质上是互补的,低级特征空间细节丰富,而高级特征更倾向于语义信息,将它们融合在一起通常有利于图像去雾。
这个模块的结构是将网络前面提取的特征图与网络后面得到的特征图进行融合,所以会有两个输入,Fl是网络前面部分得到的特征图,为低级浅层特征,而Fh为网络当前步骤得到的特征图,为高级特征,两者相加后的结果通过Point-Wise卷积和ReLU激活函数的夹心结构,最后利用Sigmoid函数得到低级和高级特征的权重。具体实现方法如下:
class AFM(nn.Module):def __init__(self, channels):super(AFM, self).__init__()self.pointwise = nn.Conv2d(channels, channels, 1)self.conv1 = nn.Conv2d(channels, channels, 3, padding = 1)self.relu = nn.ReLU(inplace=True)self.s = nn.Sigmoid()def forward(self, x1, x2):fl = x1fh = x2fl_1 = self.conv1(fl)fl_2 = self.pointwise(fl)fL = fl_1 + fl_2fH = self.pointwise(fh)f = fL + fHweight = self.pointwise(f)weight = self.relu(weight)weight = self.pointwise(weight)weight = self.s(weight)fL_1 = fL * weightfH_1 = fH * (1-weight)out = fL_1 + fH_1return out
这样获得权重的方法与普通的直接为两个特征图赋予权重的方法不同,这样可以根据不同的图像来获取不同的权重,以实现自适应融合的目的。
图4:AFM的结构
结果分析
基于Pytorch框架复现,使用显存大小为12.6GB的RTX 3060显卡在O-Haze数据集上跑的模型,结果如下,第一张为原始模糊图像,第二张为该方法恢复的图像,第三章为原始清晰图像。可以看到,模型效果仍有待提升。附件代码中包括了训练得到的11个模型以及每个模型的测试结果,详情见附件。
编程未来,从这里启航!解锁无限创意,让每一行代码都成为你通往成功的阶梯,帮助更多人欣赏与学习!
更多内容详见:这里
相关文章:

【论文复现】轻松利用自适应特征融合实现去雾
📝个人主页🌹:Eternity._ 🌹🌹期待您的关注 🌹🌹 ❀ 智慧医疗 介绍创新点网络结构特征提取阶段自适应融合阶段图像重建阶段上下文增强模块CEM特征融合模块AFM 结果分析 提示 论文题目࿱…...

【大数据学习 | HBASE高级】hbase-phoenix 与二次索引应用
1. hbase-phoenix的应用 1.1 概述: 上面我们学会了hbase的操作和原理,以及外部集成的mr的计算方式,但是我们在使用hbase的时候,有的时候我们要直接操作hbase做部分数据的查询和插入,这种原生的方式操作在工作过程中还…...
高级java每日一道面试题-2024年11月09日-缓存中间件篇-Redis和Memecache有什么区别?
如果有遗漏,评论区告诉我进行补充 面试官: Redis和Memecache有什么区别? 我回答: 一、基础特性 数据类型支持 Redis: 支持多种数据类型,包括字符串(String)、哈希(Hash)、列表(List)、集合…...

vscode 关闭绑定元素 隐式具有“any”类型这类错误
在vue的项目里面,经常看到any类型的报错,真的很烦的 在tsconfig.json中配置以下参数 “noImplicitAny”: false 就可以了 出现类型“never”上不存在属性“userName”。ts-plugin(2339) 配置该参数 modeuleResolution : node "compilerOptions&qu…...

手机ip地址异常怎么解决
在现代社会中,手机已成为我们日常生活中不可或缺的一部分,无论是工作、学习还是娱乐,都离不开网络的支持。然而,有时我们会遇到手机IP地址异常的问题,这不仅会影响我们的网络体验,还可能带来安全隐患。本文…...

【售前方案】工业园区整体解决方案,智慧园区方案,智慧城市方案,智慧各类信息化方案(ppt原件)
基于云计算、物联网、移动通信计算的智慧园区集中运营管理平台是一个高度集成化、智能化的管理系统,它利用先进的技术手段对园区进行全方位的监控和管理。 软件资料清单列表部分文档清单:工作安排任务书,可行性分析报告,立项申请审…...
37.超级简易的计算器 C语言
超级简单,简单到甚至这个计算器输入都比较反人类 但是足够简单 有输入功能有Switch语句支持四种运算还能检查除数是不是0还能打印出完整的式子 #define _CRT_SECURE_NO_WARNINGS// 禁用安全警告 #include <stdio.h>int main() {double num1, num2;// 声明两…...

防火墙----iptables
防火墙是位于内部网和外部网之间的屏障,他按照系统管理员预先定义好的规则来控制数据包的进出 一、iptables简介 防火墙会从以上至下的顺序来读取配置的策略规则,在找到匹配项后就立即结束匹配工作并去执行匹配项中定义的行为(即放行或阻止&…...

若点集A=B则A必能恒等变换地变为B=A这一几何常识推翻直线(平面)公理
黄小宁 关键词:“更无理”复数 复平面z各点z的对应点z1的全体是z1面。z面平移变为z1面就使x轴⊂z面沿本身平移变为ux1轴。R可几何化为R轴,R轴可沿本身平移变为R′轴,R′轴可沿本身平移变为R″轴,...。直线公理和平面公理使几百年…...
网络安全之WINDOWS端口及病毒编写
目录 一、常见端口和服务 二、Windows病毒编写 声明:学习视频来自b站up主 泷羽sec,如涉及侵权马上删除文章 声明:本文主要用作技术分享,所有内容仅供参考。任何使用或依赖于本文信息所造成的法律后果均与本人无关。请读者自行判…...
Flink 开发工程应加载哪些依赖
在我们要开发Flink程序时,就会涉及到应该加载哪些Flink jar的问题。本章内容就是向你展示如何配置你的项目,添加必要的依赖。 每个应用程序都会依赖一些 Flink libraries,比如至少依赖 Flink APIs库,如果使用了connector,则还需要依赖connector相关的库,比如kafka、jdbc…...
wordpress建外贸独立站常用的多语言插件
WordPress是一个功能强大的内容管理系统,对于外贸独立站来说,多语言支持是非常重要的功能。以下是一些常用的WordPress多语言插件: 1. WPML (WordPress Multilingual) 这是最流行且功能最全面的多语言插件之一。它支持翻译整个网站…...
[SpB]如何开始使用 Spring Boot?
如何开始使用 Spring Boot? Spring Boot 简化了 Java 项目开发,你只需要专注于业务逻辑,底层的很多配置和功能由 Spring Boot 自动帮你处理。下面是你如何快速上手 Spring Boot 的步骤,以及如何通过 IDEA 了解 Spring Boot 的功能…...
蓝桥杯模拟
【问题描述】 如果一个数 p 是个质数,同时又是整数 a 的约数,则 p 称为 a 的一个质因数。 请问 2024 有多少个质因数。 【答案提交】 这是一道结果填空的题,你只需要算出结果后提交即可。本题的结果为一个整数,在提交答案时只…...

数字化转型企业架构设计手册(交付版),企业数字化转型建设思路、本质、数字化架构、数字化规划蓝图(PPT原件获取)
1、企业架构现状分析 2、企业架构内容框架 3、企业架构设计方法 3.1 、业务架构设计方法 3.2 、数据架构设计方法 3.3 、应用架构设计方法 3.4 、技术架构设计方法 软件全套资料部分文档清单: 工作安排任务书,可行性分析报告,立项申请审批表&…...
2. langgraph中的react agent使用 (在react agent添加历史消息)
1. 导入必要的库 首先,我们需要导入所需的库。这里我们使用 langchain_openai 来与 智谱AI 模型进行交互,并使用 langchain_core.tools 来定义自定义工具。 from langchain_openai import ChatOpenAI from typing import Literal from langchain_core.…...

MySQL社区版的启动与连接
1.启动: 注意:MySQL是默认开机自启的 方式一: 1.WinR 的命令行中直接输入services.msc 2.在服务中找到数据库名称,然后鼠标右键点击启动 方式二: 1.在开始选项中搜索“cmd”命令提示符,使用管理员身份运行 …...

【图像压缩感知】论文阅读:Content-Aware Scalable Deep Compressed Sensing
tips: 本文为个人阅读论文的笔记,仅作为学习记录所用。本文参考另一篇论文阅读笔记 Title: Content-Aware Scalable Deep Compressed Sensing Journal: TIP 2022 代码链接: https://github.com/Guaishou74851/CASNet…...

物理hack
声明 声明 文章只是方便各位师傅学习知识,以下网站只涉及学习内容,其他的都与本人无关,切莫逾越法律红线,否则后果自负。 ✍🏻作者简介:致力于网络安全领域,目前作为一名学习者,很荣…...

Linux——环境基础开发工具使用2(正在更新中...)
1.自动化构建-make/Makefile 1.1 认识make和Makefile make是一个命令; Makefile是一个文件。 1.2 理解 其中在第一个图片中,第一行的 mytest:test.c 叫做依赖关系;第二行的 gcc test.c -o mytest 叫做依赖方法。 依赖关系和依赖方法共同…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...

docker详细操作--未完待续
docker介绍 docker官网: Docker:加速容器应用程序开发 harbor官网:Harbor - Harbor 中文 使用docker加速器: Docker镜像极速下载服务 - 毫秒镜像 是什么 Docker 是一种开源的容器化平台,用于将应用程序及其依赖项(如库、运行时环…...

python打卡day49
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 import torch import torch.nn as nn# 定义通道注意力 class ChannelAttention(nn.Module):def __init__(self,…...
React Native 导航系统实战(React Navigation)
导航系统实战(React Navigation) React Navigation 是 React Native 应用中最常用的导航库之一,它提供了多种导航模式,如堆栈导航(Stack Navigator)、标签导航(Tab Navigator)和抽屉…...
JVM垃圾回收机制全解析
Java虚拟机(JVM)中的垃圾收集器(Garbage Collector,简称GC)是用于自动管理内存的机制。它负责识别和清除不再被程序使用的对象,从而释放内存空间,避免内存泄漏和内存溢出等问题。垃圾收集器在Ja…...
MVC 数据库
MVC 数据库 引言 在软件开发领域,Model-View-Controller(MVC)是一种流行的软件架构模式,它将应用程序分为三个核心组件:模型(Model)、视图(View)和控制器(Controller)。这种模式有助于提高代码的可维护性和可扩展性。本文将深入探讨MVC架构与数据库之间的关系,以…...

C++ 求圆面积的程序(Program to find area of a circle)
给定半径r,求圆的面积。圆的面积应精确到小数点后5位。 例子: 输入:r 5 输出:78.53982 解释:由于面积 PI * r * r 3.14159265358979323846 * 5 * 5 78.53982,因为我们只保留小数点后 5 位数字。 输…...
Xen Server服务器释放磁盘空间
disk.sh #!/bin/bashcd /run/sr-mount/e54f0646-ae11-0457-b64f-eba4673b824c # 全部虚拟机物理磁盘文件存储 a$(ls -l | awk {print $NF} | cut -d. -f1) # 使用中的虚拟机物理磁盘文件 b$(xe vm-disk-list --multiple | grep uuid | awk {print $NF})printf "%s\n"…...

初探Service服务发现机制
1.Service简介 Service是将运行在一组Pod上的应用程序发布为网络服务的抽象方法。 主要功能:服务发现和负载均衡。 Service类型的包括ClusterIP类型、NodePort类型、LoadBalancer类型、ExternalName类型 2.Endpoints简介 Endpoints是一种Kubernetes资源…...

基于Springboot+Vue的办公管理系统
角色: 管理员、员工 技术: 后端: SpringBoot, Vue2, MySQL, Mybatis-Plus 前端: Vue2, Element-UI, Axios, Echarts, Vue-Router 核心功能: 该办公管理系统是一个综合性的企业内部管理平台,旨在提升企业运营效率和员工管理水…...