【论文笔记】图像修复MPRNet:Multi-Stage Progressive Image Restoration 含代码解析

news2024/11/25 18:26:43

目录

一、介绍

二、使用方法

1.推理

2.训练

三、MPRNet结构

1.整体结构

2.CAB(Channel Attention Block)

3.Stage1 Encoder

4.Stage2 Encoder

5.Decoder

6.SAM(Supervised Attention Module)

7.ORSNet(Original Resolution Subnetwork)

四、损失函数

1.CharbonnierLoss

2.EdgeLoss


一、介绍

        论文地址:https://arxiv.org/pdf/2102.02808.pdf

        代码地址:http://github.com/swz30/MPRNet

        恢复图像任务,需要在空间细节和高级上下文特征之间取得复杂的平衡。于是作者设计了一个多阶段的模型,模型首先使用编解码器架构来学习上下文的特征,然后将它们与保留局部信息的高分辨率分支结合起来。

        打个比方,我要修复一张蛇的图片,编解码器负责提取高级上下文特征,告诉模型要在蛇身上“画”鳞片,而不是羽毛或其他东西;然后高分辨率分支负责细化鳞片的图案。

        MPRNet细节很多,但最主要的创新还是“多阶段”,模型共有三个阶段,前两个阶段是编解码器子网络,用来学习较大感受野的上下文特征,最后一个阶段是高分辨率分支,用于在最终的输出图像中构建所需的纹理。作者给出了Deblurring、Denoising、Deraining三个任务的项目,三个项目的backbone是一样的,只是参数规模有所不同(Deblurring>Denoising>Deraining),下面我们以最大的Deblurring为例进行介绍。

二、使用方法

        MPRNet项目分为Deblurring、Denoising和Deraining  三个子项目。作者没有用稀奇古怪的库,也没用高级的编程技巧,非常适合拿来研究学习,使用方法也很简单,几句话技能说完。

1.推理

        (1)下载预训练模型:预训练模型分别存在三个子项目的pretrained_models文件夹,下载地址在每个pretrained_models文件夹的 README.md中,需要科学上网,我放在了网盘里:

        链接:https://pan.baidu.com/s/1sxfidMvlU_pIeO5zD1tKZg 提取码:faye 

        (2)准备测试图片:将退化图片放在目录samples/input/中

        (3)执行demo.py

# 执行Deblurring
python demo.py --task  Deblurring

# 执行Denoising
python demo.py --task  Denoising

# 执行Deraining
python demo.py --task  Deraining

        (4)结果放在目录samples/output/中。

2.训练

        (1)根据Dataset文件夹内的README.md文件中的地址下载数据集。

        (2)查看training.yml是否需要修改,主要是最后的数据集地址。

        (3)执行训练

python train.py

三、MPRNet结构

        我将按照官方代码实现来介绍模型结构,一些重要模块的划分可能跟论文有区别,但是整体结构是一样的。

1.整体结构

        MPRNet官方给出的结构图如下:

图1

        这个图总体概括了MPRNet的结构,但是很多细节没有表现出来,通过阅读代码我给出更加详细的模型结构介绍。下面的图中输入统一512x512,我们以Deblurring为例,并且batch_size=1。

        整体结构图如下:

 图2

        图中的三个Input都是原图,整个模型三个阶段,整体流程如下:

        1.1 输入图片采用multi-patch方式分成四份,分成左上、右上、左下、右下;

        1.2 每个patch经过一个3x3的卷积扩充维度,为的是后面能提取更丰富的特征信息;

        1.3 经过CAB(Channel Attention Block),利用注意力机制提取每个维度上的特征;

        1.4 Encoder,编码三种尺度的图像特征,提取多尺度上下文特征,同时也是提取更深层的语义特征;

        1.5 合并深特征,将四个batch的同尺度特征合并成左右两个尺度,送入Decoder;

        1.6 Decoder,提取合并后的每个尺度的特征;

        1.7 输入图片采用multi-patch方式分成两份,分成左、右;

        1.8 将左右两个batch分别与Stage1 Decoder输出的大尺度特征图送入SAM(Supervised Attention Module),SAM在训练的时候可以利用GT为当前阶段的恢复过程提供有用的控制信号;

        1.9 SAM的输出分成两部分,一部分是第二次输入的原图特征,它将继续下面的流程;一部分用于训练时的Stage1输出,可以利用GT更快更好的让模型收敛。

        2.0 经过Stage2的卷积扩充通道和CAB操作,将Stage1中的Decoder前后的特征送入Stage2的Encoder。

        2.2 经过和Stage1相似的Decoder,也产生两个部分的输出,一部分继续Stage3,一部分输出与GT算损失;

        3.1 Stage3的原图输入不在切分,目的是利用完整的上下文信息恢复图片细节。

        3.2 将原图经过卷积做升维处理;

        3.3 将Stage2中的Decoder前后的特征送入Stage3的ORSNet(Original Resolution Subnetwork),ORSNet不使用任何降采样操作,并生成空间丰富的高分辨率特征。

        3.4 最后经过一个卷积将维度降为3,输出。

        图中还有一些模块细节没有表现出来,下面我将详细介绍。

2.CAB(Channel Attention Block)

        顾名思义,CAB就是利用注意力机制提取每个通道的特征,输出输入特征图形状不变,结构图如下:

图3 

        可以看到,经过了两个卷积和GAP之后得到了一个概率图(就是那个残差边),在经过两个卷积和Sigmoid之后与概率图相乘,就实现了一个通道注意力机制。

3.Stage1 Encoder

        Stage1和Stage1的Encoder有一些区别,所以分开介绍。Stage1 Encoder有一个输入和三个不同尺度的输出,为的是提取三个尺度的特征并为下面的尺度融合流程做准备;其中有多个CAB结构,可以更好的提取通道特征;下采样通过粗暴的Downsample实现,结构如下:

         图4

4.Stage2 Encoder

        Stage2 Encoder输入为三个,分别为上一层的输出和Stage1中的Decoder前后的特征。主流程(也就是左面竖着的那一列)和Stage1 Encoder是一样的。增加的两个输入,每个输入又分为三个尺度,每个尺度经过一个卷积层,然后相同尺度的特征图做特征融合,输出,结构如下:

图5

5.Decoder

        两个阶段的Decoder结构是一样的,所以放在一起说,有三个不用尺度的输入;通过CAB提取特征;小尺度特征通过上采样变大,通过卷积使通道变小;小尺度的特征图shape最终变成跟大尺度一样,通过残差边实现特征融合,结构如下:

 图6

6.SAM(Supervised Attention Module)

        SAM出现在两个阶段间,有两个输入,将上一层特征和原图作为输入,提升了特征提取的性能,,SAM作为有监督的注意模块,使用注意力图强力筛选了跨阶段间的有用特征。有两个输出,一个是经过了注意力机制的特征图,为下面的流程提供特征;一个是3通道的图片特征,为了训练阶段输出,结构如下:

 图7

7.ORSNet(Original Resolution Subnetwork)

        为了保留输入图像的细节,模型在最后一阶段引入了原始分辨率的子网(ORSNet:Original Resolution Subnetwork)。ORSNet不使用任何降采样操作,并生成空间丰富的高分辨率特征。它由多个原始分辨率块(BRB)组成,是模型的最后阶段,结构如下:

 图8

        可以看到,输入为三个,分别为上一层的输出和Stage2中的Decoder前后的特征。后两个输入,每个输入又分为三个尺度,三个尺度的通道数都先变成96,然后在变成128;小尺度的size都变成和大尺度一样,最后做特征融合融合前会经过ORB(Original Resolution Block)模块。

        ORB由一连串的CAB组成,还有一个大的残差边,结构如下:

 图9

四、损失函数

        MPRNet主要使用了两个损失函数CharbonnierLoss和EdgeLoss,公式如下:

L=\sum_{S=1}^{3}[L_{char}(X_{S},Y)+\lambda L_{edge}(X_{S},Y)]

         其中累加是因为训练的时候三个阶段都有输出,都需要个GT计算损失(如图2的三个output);该模型不是直接预测恢复的图像X_{S},而是预测残差图像R_{S},添加退化的输入图像I得到:  X_{S}=I+R_{S}

        Deblurring和Deraining两个任务CharbonnierLoss和EdgeLoss做了加权求和,比例1:0.05;只使用了CharbonnierLoss,我感觉是因为这里使用的噪声是某种分布(入高斯分布、泊松分布)的噪声,不会引起剧烈的边缘差异,所以Denoising没有使用EdgeLoss。

        下面简单介绍一下两种损失。

1.CharbonnierLoss

        公式如下:

L_{char}=\sqrt{\left \| X_{s}-Y \right \|^{2}+\varepsilon^{2}}

        CharbonnierLoss在零点附近由于常数\varepsilon的存在,梯度不会变成零,避免梯度消失。函数曲线近似L1损失,相比L2损失而言,对异常值不敏感,避免过分放大误差。

2.EdgeLoss

        L1或者L2损失注重的是全局,没有很好地考虑一些显著特征的影响, 而显著的结构和纹理信息与人的主观感知效果高度相关,是不能忽视的。

        边缘损失主要考虑纹理部分的差异,可以很好地考虑高频的纹理结构信息, 提高生成图像的细节表现,公示如下:

L_{edge}=\sqrt{\left \| \Delta (X_{S})-\Delta (Y) \right \|^{2}+\varepsilon^{2}}

        其中\Delta表示Laplacian边缘检测中的核函数,\Delta (X_{S})表示对X_{S}做边缘检测,公式中其他部分和CharbonnierLoss类似。

        MPRNet的主要的内容就介绍到这,主要是backbone的创新,其他部分中规中矩,关注不迷路。

        

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/764960.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

[LINUX]之grep文本过滤

linux通过使用grep -v操作来实现文本过滤 新创建文本如下 执行过滤命令如下,已经过滤了test3 cat test.txt |grep -v "test3"

Dockerd的迁移与备份

1、容器保存为镜像 (1) 通过以下命令将容器保存为镜像 # 保存nginx容器为镜像 docker commit 容器名称 镜像名称 例如:docker commit mynginx mynginx_i(2)用 docker ps -a 查看所有的容器 (3&#xf…

15-C++基本算法-贪心法

📚 理论基础 贪心法(Greedy Algorithm)是一种常见的算法思想,它在每一步选择中都采取当前状态下最优的选择,以期望获得全局最优解。贪心法通常适用于问题具有最优子结构和贪心选择性质的情况。 适用场景 贪心法适用…

react 实现浮动可吸附悬浮窗,悬浮球,悬浮按钮,支持拖动拖拽功能(suspend-button)

前言: 最近在做移动端,有个需求是 实现一个浮动球可拖拽,能吸附(吸附到 左右两则,距离哪进就吸附到哪边)。 实现过程: 使用 suspend-button (但是此组件不支持 ts 和pc端&#x…

VMWare安装统信UOS虚拟机

单击 创建新的虚拟机 按钮,然后选择 自定义, 然后 下一步 硬件兼容性 选择 Workstation16.x ,然后 下一步 选择“稍后安装操作系统”, 然后 下一步 选择 Linux , 再选 版本 CentOS 8 64位/ Ubuntu 均可,然…

【数据结构之树】初阶数据结构之树的实现及其各种方式(上)

文章目录 😏专栏导读🤖文章导读🙀树的预备知识🙀二叉树😳树的代码实现及其各类讲解🌲树的结构体初始化 总结 😏专栏导读 👻作者简介:M malloc,致力于成为嵌入…

LinkNet分割模型搭建

原论文:LinkNet: Exploiting Encoder Representations for Efficient Semantic Segmentation 直接步入正题~~~ 一、LinkNet 1.decoder模块 class DecoderBlock(nn.Module):def __init__(self, in_channels, n_filters): #512, 256super(DecoderBlock, self).__in…

计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二

文章目录 导文题目导文 计算机毕业论文选题推荐|软件工程|信息管理|数据分析|系列二 (***语言)==使用其他任何编程语言 例如:基于(***语言)门窗账务管理系统的设计与实现 得到:基于JAVA门窗账务管理系统的设计与实现 基于vue门窗账务管理系统的设计与实现 等等 题目 …

关于21电赛数字识别

这里我们只讲数字识别的代码。 关于模型的训练,这里就不多讲了,看我的这篇文章: K210学习篇(八)在MaixHub训练模型_ODF..的博客-CSDN博客 这里着重讲我们得到训练后的模型该怎么去修改以及和stm32单片机通信。 当我们把下载的模型解压后,就得到一些这些文件,我们只需…

EasyDSS视频直播点播平台如何修改登录密码与开启接口鉴权?

随着互联网的发展,网络安全问题也越来越受到重视。近期我们也对旗下所有的视频平台进行了技术升级,以增强平台的数据安全性,保障用户的信息安全。用户也可以通过以下指导步骤,对平台相关配置进行修改,提高保护等级。 1…

阻塞、挂起和睡眠

挂起(主动)和阻塞(被动) 本质:正在执行的进程/线程,由于某些原因主动或者被动的释放 CPU,暂停执行;挂起会将进程移出内存,阻塞的进程还在内存中;挂起时会释放…

CSDN发表文章的常用语法说明

CSDN常用语法说明 一、标题二、文本样式三、列表四、图片五、链接六、目录一级目录二级目录三级目录 七、表格八、注释九、自定义列表十、LaTeX 数学公式十一、插入甘特图十二、插入UML图十三、插入Mermaid流程图十五、插入Flowchart流程图十六、 插入类图十七、快捷键十八、脚…

汽车供应链专场对接会 | 8月25日大会同期活动

爱普搜汽车供应链对接会,是根据采购商的项目需求,有针对性地组织全国各地采购商与供应商,进行面对面交流与沟通,促成实质性交易。参会群体为汽车行业制造型企业、主机厂、Tier1/2。 供应商在参加对接会前已做足功课,现…

使用Linux Deploy搭建服务器(二)使用chroot容器安装linux发行版

一、先下载好软件 Linux Deploy(一)Linux Deploy简介与软件安装_吻等离子的博客-CSDN博客 二、搭建debian 首先手机要获取root权限 linux Deploy支持许多发行版linux,发行版建议选择Debian,这个版本最好装,Ubuntu …

提升互联网创业项目在搜索结果中的排名的SEO技巧

搜索引擎优化(SEO)技巧:提升互联网创业项目在搜索结果中的排 在当今竞争激烈的互联网创业领域,拥有一个高排名的搜索结果对于项目的成功至关重要。搜索引擎优化(SEO)是一种有效的策略,可以提高您的互联网创业项目在搜索…

RocketMQ 5.1.0 在java中的使用

版本&#xff1a; 当前测试版本&#xff1a;springBoot 2.3.9、 RocketMQ 5.1.0 Maven或Gradle RocketMQ的依赖项&#xff1a; <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-client</artifactId><version>5…

国内开源框架(快速开发,避免重复造轮子)

若依开源框架&#xff08;最容易上手&#xff0c;轻巧简洁&#xff09; 若依开源框架是一款基于SpringBoot2.x和Vue.js的前后端分离的权限管理系统。它采用了前后端分离的架构&#xff0c;使得系统更加灵活、易扩展。同时&#xff0c;它还集成了多种常见的功能模块&#xff0c…

UEC++: 接口

1. 2. 3. 4.一般接口的源文件是不用写逻辑的&#xff0c;一般是在接口头文件中编写 5.被C类继承&#xff1a; 写完函数&#xff0c;千万不允许定义&#xff01;&#xff01;&#xff01; 添加标记宏 找到一个类&#xff1a;继承I开头的接口&#xff1a;引用头文件 错误重写&…

移 动 端

移动端 国内的UC和QQ&#xff0c;百度等手机浏览器都是根据 Webkit 修改过来的内核 兼容移动端主流浏览器 处理 webkit 内核浏览器即可 常见移动端屏幕尺寸 调式 Chrome DevTools&#xff08;谷歌浏览器&#xff09;的模拟手机调试搭建本地 web 服务器&#xff0c; 手机和服…

嵌入式开发--STM32用DMA+IDLE中断方式串口接收不定长数据

回顾 之前讲过用 利用IDLE空闲中断来接收不定长数据 &#xff0c;但是没有用到DMA&#xff0c;其实用DMA会更加的高效&#xff0c;MCU也可以腾出更多的性能去处理应该做的事情。 原理简介 IDLE顾名思义&#xff0c;就是空闲的意思&#xff0c;即当监测到串口空闲超过1个串口…