ISR实现RDN图像增强

2023-10-18 15:44
文章标签 实现 图像增强 isr rdn

本文主要是介绍ISR实现RDN图像增强,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

ISR实现RDN图像增强

  • 图像增强作用
  • ISR项目
    • 安装
      • 1.从PyPI安装ISR(推荐):
      • 2.从GitHub源代码安装ISR:
    • 用法
      • 预测
      • 大图像推理
    • 训练
      • 创建模型
  • RDN算法介绍
    • Residual Dense Network的结构
      • 残差稠密块(Residual Dense Block)
      • 稠密特征融合(Dense Feature Fusion)

图像增强作用

当谈到计算机视觉和图像处理时,分辨率是一个关键的概念。图像的分辨率决定了我们能够观察到的细节和质量。然而,有时候我们面临的是低分辨率图像,这可能是由于多种原因,包括传感器限制、图像传输和存储问题等。

对于深度学习领域,低分辨率图像通常不是一个好的出发点。深度学习模型通常需要更多的细节和信息来进行准确的识别、分类和分析。这就是超分辨率技术变得如此重要的原因。

在这篇文章中,我们将探讨超分辨率技术的应用以及它对深度学习训练和模型推理的潜在好处。我们将了解如何将低分辨率图像转化为高分辨率图像,以及这种转化对各种计算机视觉任务的影响。

随着深度学习模型的发展,超分辨率技术已经变得更加强大和普遍。这种技术不仅可以提高图像质量,还可以改善深度学习模型在各种应用中的性能。从对象检测到图像分类,超分辨率技术为计算机视觉领域带来了重大的影响。

ISR项目

这里介绍一个图像增强的github项目包括了使用Keras实现的不同的单图像超分辨率(ISR)的残差稠密网络,以及用于训练这些网络的内容和对抗损失组件的脚本。

github地址:https://github.com/idealo/image-super-resolution

实现的网络包括:

基于《Residual Dense Network for Image Super-Resolution》(Zhang等人,2018)描述的超级放大残差稠密网络。
基于《ESRGAN: Enhanced Super-Resolution Generative Adversarial Networks》(Wang等人,2018)描述的具有残差的残差稠密网络。
基于《Photo-Realistic Single Image Super-Resolution Using a Generative Adversarial Network》(SRGANS,Ledig等人,2017)描述的自定义鉴别器网络

安装

有两种安装Image Super-Resolution包的方法:

1.从PyPI安装ISR(推荐):

pip install ISR

2.从GitHub源代码安装ISR:

git clone https://github.com/idealo/image-super-resolution
cd image-super-resolution
python setup.py install

用法

预测

加载图像并准备它:

import numpy as np
from PIL import Imageimg = Image.open('data/input/test_images/sample_image.jpg')
lr_img = np.array(img)

加载预训练模型并运行预测

from ISR.models import RDNrdn = RDN(weights='psnr-small')
sr_img = rdn.predict(lr_img)
Image.fromarray(sr_img)

大图像推理

为了在大图像上进行预测并避免内存分配错误,可以使用by_patch_of_size选项来进行预测,例如:

sr_img = model.predict(image, by_patch_of_size=50)

训练

创建模型

from ISR.models import RRDN
from ISR.models import Discriminator
from ISR.models import Cut_VGG19lr_train_patch_size = 40
layers_to_extract = [5, 9]
scale = 2
hr_train_patch_size = lr_train_patch_size * scalerrdn  = RRDN(arch_params={'C':4, 'D':3, 'G':64, 'G0':64, 'T':10, 'x':scale}, patch_size=lr_train_patch_size)
f_ext = Cut_VGG19(patch_size=hr_train_patch_size, layers_to_extract=layers_to_extract)
discr = Discriminator(patch_size=hr_train_patch_size, kernel_size=3)

创建Trainer对象,并传入所需的设置和模型(f_ext和discr是可选的):

from ISR.train import Trainer
loss_weights = {'generator': 0.0,'feature_extractor': 0.0833,'discriminator': 0.01
}
losses = {'generator': 'mae','feature_extractor': 'mse','discriminator': 'binary_crossentropy'
}log_dirs = {'logs': './logs', 'weights': './weights'}learning_rate = {'initial_value': 0.0004, 'decay_factor': 0.5, 'decay_frequency': 30}flatness = {'min': 0.0, 'max': 0.15, 'increase': 0.01, 'increase_frequency': 5}trainer = Trainer(generator=rrdn,discriminator=discr,feature_extractor=f_ext,lr_train_dir='low_res/training/images',hr_train_dir='high_res/training/images',lr_valid_dir='low_res/validation/images',hr_valid_dir='high_res/validation/images',loss_weights=loss_weights,learning_rate=learning_rate,flatness=flatness,dataname='image_dataset',log_dirs=log_dirs,weights_generator=None,weights_discriminator=None,n_validation=40,
)

开始训练

trainer.train(epochs=80,steps_per_epoch=500,batch_size=16,monitored_metrics={'val_PSNR_Y': 'max'}
)

卷积神经网络(CNN)在图像超分辨率(SR)方面取得了巨大成功,并提供了分层特征。然而,大多数基于深度CNN的SR模型没有充分利用原始低分辨率(LR)图像的分层特征

RDN算法介绍

这项研究提出了一种新颖的图像超分辨率(SR)解决方案,即残差稠密网络(RDN),以应对SR领域的挑战。RDN的设计主要集中在充分利用图像中的分层特征,旨在提高性能并提供更清晰的超分辨率图像。

RDN的关键特点

  1. 分层特征利用:RDN充分利用了来自卷积神经网络的各个层次的分层特征。这有助于更好地理解图像的不同部分,并为超分辨率提供更多信息。
  2. 残差稠密块(RDB):RDN引入了残差稠密块,这是一种密集连接的卷积层,用于提取图像的丰富局部特征。这有助于保留图像中的细节和纹理。
  3. 连续内存(CM)机制:RDB允许前一个RDB的状态直接连接到当前RDB的所有层,从而形成了一个连续内存机制。这有助于信息的传递和共享,提高了网络的性能。
  4. 局部特征融合:RDB中的局部特征融合机制用于自适应地学习来自前一个和当前局部特征的更有效信息。这有助于稳定更宽的神经网络的训练过程。
  5. 全局特征融合:一旦获得了密集的局部特征,RDN使用全局特征融合机制,以一种整体的方式联合和自适应地学习全局分层特征。这有助于更好地理解图像的整体结构。

Residual Dense Network的结构

如下图所示,Residual Dense Network(RDN)是一种用于图像超分辨率的深度神经网络结构,包括四个主要部分:

  • 浅特征提取网络(SFENet)
  • 残差稠密块(RDBs) (下一节详细介绍)
  • 稠密特征融合(DFF)
  • 上采样网络(UPNet)

在这里插入图片描述

RDN的输入是低分辨率(LR)图像,用 I L R I_{LR} ILR表示,输出是经过超分辨率处理后的图像,用 I S R I_{SR} ISR表示。

  • I L R I_{LR} ILR:低分辨率(LR)图像的输入
  • I S R I_{SR} ISR:超分辨率(SR)处理后的输出

下面按照RDN的结构从左到右开始介绍结构

首先,我们使用两个卷积层来提取浅特征。第一个卷积层从 I L R I_{LR} ILR输入中提取特征 F − 1 F_{-1} F1,第二个卷积层将 F − 1 F_{-1} F1进一步转化为 F 0 F_0 F0。这些浅特征将用于后续的处理,公式如下所示:

F − 1 = H S F E 1 ( I L R ) F_{-1} = H_{SFE1} (I_{LR}) F1=HSFE1(ILR)

其中 H S F E 1 ( ⋅ ) H_SFE1(·) HSFE1()表示卷积操作。 F − 1 F_{-1} F1然后用于进一步提取浅特征和全局残差学习,进一步得到

F 0 = H S F E 2 ( F − 1 ) F_0 = H_{SFE2} (F_{-1}) F0=HSFE2(F1)

其中 H S F E 2 ( ⋅ ) H_{SFE2}(·) HSFE2()表示第二个浅特征提取层的卷积操作,并用作输入到残差稠密块。

接下来,进入到RDB中,RDN包含多个残差稠密块(RDBs),它们用于从浅特征中提取局部密集特征。每个RDB产生局部特征 F d F_d Fd,其中 d d d表示第几个RDB。这些RDBs共同提取并丰富图像的特征,公式如下:

F d = H R D B , d ( F d − 1 ) = H R D B , d ( H R D B , d − 1 ( . . . ( H R D B , 1 ( F 0 ) ) ⋯ ) ) F_d = H_{RDB,d}(F_{d-1}) = H_{RDB,d}(H_{RDB,d-1}(...(H_{RDB,1}(F_0))⋯)) Fd=HRDB,d(Fd1)=HRDB,d(HRDB,d1(...(HRDB,1(F0))))

其中 H R D B , d H_{RDB,d} HRDB,d表示第d个RDB的操作。 H R D B , d H_{RDB,d} HRDB,d可以是一系列操作的复合函数,如卷积和整流线性单元(ReLU)。

由于 F d F_d Fd是由第d个RDB完全利用块内的每个卷积层产生的,可以将Fd视为局部特征。

在使用一组RDB提取分层特征之后,模型进一步进行了稠密特征融合(DFF),其中包括全局特征融合(GFF)和全局残差学习(GRL)。

DFF充分利用来自所有前面层的特征进行融合,也就是结构图中的如下部分,用公式可以表示为
在这里插入图片描述

F D F = H D F F ( F − 1 , F 0 , F 1 , ⋯ , F D ) F_{DF} = H_{DFF}(F_{-1}, F_0, F_1, ⋯, F_D) FDF=HDFF(F1,F0,F1,,FD)

其中 F D F F_{DF} FDF是通过使用复合函数 H D F F H_{DFF} HDFF利用DFF的输出特征图。有关DFF的更多细节下一节将介绍。

最后在LR空间中提取局部和全局特征后,在HR空间中堆叠上采样网络(UPNet)。在UPNet中使用了ESPCN 网络结构,然后再接一个卷积层。最后

RDN的输出可以表示为

I S R = H R D N ( I L R ) I_{SR} = H_{RDN}(I_{LR}) ISR=HRDN(ILR)

其中 H R D N H_{RDN} HRDN表示RDN的函数。

下面对核心网络块详细介绍

残差稠密块(Residual Dense Block)

在这里插入图片描述

残差稠密块如上图所示,下面将详细介绍提出的残差稠密块(RDB)。

RDB包含密集连接的层、局部特征融合(LFF)以及局部残差学习,从而实现连续内存( C M CM CM)机制

连续内存机制是通过将先前的RDB状态传递给当前RDB的每一层来实现的。

F d − 1 F_{d-1} Fd1 F d F_d Fd分别表示第 d d d个RDB的输入和输出,它们都具有 G 0 G_0 G0特征图。第 d d d个RDB中的第c个卷积层的输出可以表示为

F d , c = σ ( W d , c [ F d − 1 , F d , 1 , ⋯ , F d , c − 1 ] ) F_{d,c} = σ(W_{d,c}[F_{d-1}, F_{d,1}, ⋯, F_{d,c-1}]) Fd,c=σ(Wd,c[Fd1,Fd,1,,Fd,c1])

其中σ表示ReLU激活函数。 W d , c W_{d,c} Wd,c c − t h c-th cth卷积层的权重,为简化起见省略了偏置项。假设 F d , c F_{d,c} Fd,c G G G特征图组成。 [ F d − 1 , F d , 1 , ⋯ , F d , c − 1 ] [F_{d-1}, F_{d,1}, ⋯, F_{d,c-1}] [Fd1,Fd,1,,Fd,c1]是由第 ( d − 1 ) (d-1) (d1)个RDB产生的特征图、第d个RDB中的卷积层1、⋯、第 c − 1 c-1 c1个RDB中的卷积层构成的拼接,从而得到 G 0 + ( c − 1 ) × G G_0 + (c-1) \times G G0+(c1)×G特征图。先前的RDB和每一层的输出与所有后续层都有直接连接,这不仅保留了前馈性质,还提取了局部密集特征。

然后,就是局部特征融合(LFF)被应用于自适应融合来自前一个RDB的状态和当前RDB中的所有卷积层的信息,由 ( d − 1 ) (d-1) (d1)个RDB产生的特征图以拼接方式直接引入第 d d d个RDB是必要的,以减小特征数量。另一方面,引入了一个 1 × 1 1 \times 1 1×1卷积层,以自适应控制输出信息。我们将这一操作命名为局部特征融合(LFF),表示为

F d , L F = H L F F d ( [ F d − 1 , F d , 1 , ⋯ , F d , c , ⋯ , F d , C ] ) F_{d,LF} = H^d_{LFF}([F_{d-1}, F_{d,1}, ⋯, F_{d,c}, ⋯, F_{d,C}]) Fd,LF=HLFFd([Fd1,Fd,1,,Fd,c,,Fd,C])

其中 H L F F d H^d_{LFF} HLFFd表示第d个RDB中的 1 × 1 1 \times 1 1×1卷积层的函数

局部残差学习(LRL)在RDB中引入,以进一步改善信息流,因为在一个RDB中有多个卷积层。第d个RDB的最终输出可以通过以下方式获得

F d = F d − 1 + F d , L F F_d = F_{d-1} + F_{d,LF} Fd=Fd1+Fd,LF

稠密特征融合(Dense Feature Fusion)

在使用一组RDB提取局部密集特征后,进一步提出了稠密特征融合(DFF)以全局方式利用分层特征。DFF包括全局特征融合(GFF)和全局残差学习。全局特征融合旨在通过融合来自所有RDB的特征来提取全局特征FGF,表示为:

F G F = H G F F ( [ F 1 , ⋯ , F D ] ) F_{GF} = H_{GFF}([F_1, ⋯, F_D]) FGF=HGFF([F1,,FD])

其中 [ F 1 , ⋯ , F D ] [F_1, ⋯, F_D] [F1,,FD]表示由第1个至第D个残差稠密块产生的特征图的拼接。 H G F F H_{GFF} HGFF 1 × 1 1 \times 1 1×1 3 × 3 3 \times 3 3×3卷积的复合函数。 1 × 1 1 \times 1 1×1卷积层用于自适应融合具有不同级别的特征。接下来的 3 × 3 3 \times 3 3×3卷积层用于进一步提取全局残差学习所需的特征.。

然后,利用全局残差学习来获得上采样之前的特征图

F D F = F − 1 + F G F F_{DF} = F_{-1} + F_{GF} FDF=F1+FGF

其中 F − 1 F_{-1} F1表示浅特征图。在全局特征融合之前的所有其他层都充分利用了提出的残差稠密块(RDBs)。RDBs生成了多层局部密集特征,这些特征被进一步自适应融合以形成FGF。经过全局残差学习后,获得了稠密特征FDF。

这篇关于ISR实现RDN图像增强的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/233554

相关文章

python使用Akshare与Streamlit实现股票估值分析教程(图文代码)

《python使用Akshare与Streamlit实现股票估值分析教程(图文代码)》入职测试中的一道题,要求:从Akshare下载某一个股票近十年的财务报表包括,资产负债表,利润表,现金流量表,保存... 目录一、前言二、核心知识点梳理1、Akshare数据获取2、Pandas数据处理3、Matplotl

分布式锁在Spring Boot应用中的实现过程

《分布式锁在SpringBoot应用中的实现过程》文章介绍在SpringBoot中通过自定义Lock注解、LockAspect切面和RedisLockUtils工具类实现分布式锁,确保多实例并发操作... 目录Lock注解LockASPect切面RedisLockUtils工具类总结在现代微服务架构中,分布

Java使用Thumbnailator库实现图片处理与压缩功能

《Java使用Thumbnailator库实现图片处理与压缩功能》Thumbnailator是高性能Java图像处理库,支持缩放、旋转、水印添加、裁剪及格式转换,提供易用API和性能优化,适合Web应... 目录1. 图片处理库Thumbnailator介绍2. 基本和指定大小图片缩放功能2.1 图片缩放的

Python使用Tenacity一行代码实现自动重试详解

《Python使用Tenacity一行代码实现自动重试详解》tenacity是一个专为Python设计的通用重试库,它的核心理念就是用简单、清晰的方式,为任何可能失败的操作添加重试能力,下面我们就来看... 目录一切始于一个简单的 API 调用Tenacity 入门:一行代码实现优雅重试精细控制:让重试按我

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q