超分辨率重建——冠军队EDVR视频超分网络训练自己数据集与推理测试(详细图文教程)

在这里插入图片描述

💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《暗光增强》
📝《模型优化》
📝《模型实战部署》


在这里插入图片描述

EDVR模型在NTIRE19视频恢复和增强挑战赛的四个赛道中都赢得了冠军,并以巨大的优势超过了第二名。

一、EDVR

EDVR(Enhanced Deep Video Restoration)是一种用于视频超分辨率重建的深度学习方法,专注于提高视频质量和分辨率。EDVR 旨在解决视频超分辨率中的关键挑战,如复杂的运动估计、多帧信息融合、以及高效地恢复细节等。EDVR 被广泛应用于视频增强、去噪、去模糊、视频超分辨率等任务中。它在保持视频流畅性的同时,能够显著提高视频的清晰度和视觉质量。

1.1 核心思想

时空特征提取:利用多个连续帧的信息,通过时空卷积神经网络提取丰富的特征。这帮助模型更好地捕捉时间动态和空间细节。
可变形卷积:EDVR 使用了可变形卷积来处理视频中的复杂运动,提供了灵活的感受野以更好地对齐不同帧之间的特征。
多帧融合:通过一个融合模块,将多个帧的特征信息整合起来,以增强重建的细节和一致性。

1.2 网络架构

EDVR 的设计充分考虑了视频处理中的时空复杂性,使其在处理具有运动模糊和多样化场景的视频时具有明显的优势。EDVR整体网络结构见下:
在这里插入图片描述

1.2.1 PCD模块

Pyramid, Cascading, and Deformable (PCD) Alignment:用于对齐不同时间步长的帧,以捕捉帧间的运动信息。

Pyramid Alignment在不同分辨率下对齐视频帧,以捕捉不同尺度的运动信息。实现:使用图像金字塔,将每个输入帧降采样到不同的分辨率层次,从高分辨率到低分辨率逐层对齐。

Cascading Alignment在不同层次中逐步细化对齐过程。实现:每一层的对齐结果作为下一层的输入,从粗到细逐层改善对齐精度。

Deformable Convolution处理复杂的、非线性的运动。实现:通过引入可变形卷积,允许卷积核在不规则位置采样特征,以增强网络的灵活性和对不同运动的适应能力。

PCD模块见下:
在这里插入图片描述

1.2.2 TSA模块

Temporal and Spatial Attention (TSA) Fusion:该模块负责将时间和空间的信息有效融合,以生成高质量的超分辨率图像。

Temporal Attention选择性地利用时间序列信息,增强重要帧的贡献。实现:通过学习不同帧的重要性权重,动态调整帧的贡献,增强时间信息的有效融合。

Spatial Attention增强空间信息的关键细节。实现:利用空间注意力机制来突出图像中的重要区域和特征,忽略背景和不重要的细节。

Reconstruction Module将融合后的特征重建为高分辨率图像。实现:通过一系列卷积层,将提取和融合后的特征逐步还原成超分辨率图像。这部分结构通常简单但有效,确保生成的图像具有高质量和清晰度。

TSA模块见下:
在这里插入图片描述

二、源码包准备

EDVR官网源码链接:EDVR

论文地址:paper

PaddleGAN官网源码链接:PaddleGAN

训练和测试的代码我没用EDVR官网提供的,我用了PaddleGAN集成代码,配套源码包获取方法文章末扫码到公众号「视觉研坊」中回复关键字:超分辨率重建EDVR。获取下载链接。

下载解压后的源码包见下:

在这里插入图片描述

三、数据准备

3.1 开源数据集

我用的视频数据集为REDS,此数据集是NTIRE19比赛最新提出的高质量(720p)视频数据集,其由240个训练片段、30个验证片段和30个测试片段组成(每个片段有100个连续帧)。

在我提供的源码包中有部分测试集,验证集和测试集,文件太大,完整的REDS数据集去官网下载。

REDS数据集里有针对锐化,去模糊,超分辨重建的数据集等,此数据集下载链接为:REDS数据集下载,打开后下载方法见下:

在这里插入图片描述

学者根据自己需求对应下载数据,用于视频超分的开源数据集还有:

Vimeo90K数据集是Tianfan Xue等人构建的一个用于视频超分、视频降噪、视频去伪影、视频插帧的数据集。Vimeo90K是大规模、高质量的视频数据集,包含从vimeo.com下载的 89,800 个视频剪辑,涵盖了大量场景和动作。Vimeo90K数据集下载

Vid4数据集是常用的视频超分验证数据集,包含4个视频段。Vid4数据集下载

UDM10数据集是常用的视频超分验证数据集,包含10个视频段。UDM10数据集下载

REDS数据集训练集较大,可将下载链接复制到迅雷中下载:

在这里插入图片描述

下载好的数据集,存放到根目录下的data文件夹中,见下:

在这里插入图片描述

上面各个文件夹中又包含多个子文件夹,子文件夹中有100张连续的视频帧,见下:

在这里插入图片描述
其中meta_info_REDS_GT.txt文件内容见下,meta_info_REDS_GT.txt文件内容的生成见另外一篇博文:meta_info_GT.txt文件制作,对应的脚本为源码包中make_meta_info.py。

在这里插入图片描述

3.2 自己制作数据集

3.2.1 倔驴必看

本小结可跳过不看。

制作自己数据集时,图片的名称格式有讲究,我之前犟过,修改源码为适合自己图片名称格式,我自己视频帧命名格式为frame_1.bmp,frame_2.bmp…frame_1096.bmp,见下:
在这里插入图片描述
PaddleGAN源码中仅支持.png格式图片,忍不了,在官网基础上,被我改了很多源码,我的低分辨率图片为90x120,代码中间有两次降采样,第一次降采样后分辨率为45x60,第二次降采样后分辨率为23x30,注意:45除以2后代码自动向上取整为23,这步就会导致和其它层的维度对应不上而报错,其它层处理后为22x30,见下:

在这里插入图片描述

下面是为了维度对齐,修改了模型结构代码:

在这里插入图片描述

Padding:原本 padding=1,卷积计算会在每个空间维度上保持大小。通过设置 padding=0,可以让输出的高度减少一个单位。
效果:这将会把输出的高度从 23 调整为 22,而宽度保持不变。

改后的输出维度见下:

在这里插入图片描述

上面维度对齐了,但是后续还有很多关于维度的报错,我又修改了很多代码,其中最多的是在跳跃连接进行paddle.aoncat张量拼接时的报错,修改代码见下:

在这里插入图片描述

在测试阶段还有报维度错误,也需要修改,修改地方太多,这里就不一 一列出,整体代码已经调试通,可以处理我自己的图片命名格式和处理120x90图像,改过代码的脚步后缀带INF,犟种学者想研究一下的可以仔细看看我提供的源码,改动过的脚本见下:

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

3.2.2 简易制作数据集

上面3.2.1是让网络模型适用自己的视频帧命名格式,现在介绍修改自己的视频帧命名格式和官网一样,此方法较简单,不用修改源码。

本教程配套提供的源码包中代码适用官网原本的命名格式。

将自己视频帧命名格式修改的方法见另外一篇博文:制作图片格式为00000001.png方法

四、训练

4.1 模型选择

EDVR模型根据中间通道数分为EDVR_L(128通道)和EDVR_M(64通道),对应模型配置文件选择见下:

在这里插入图片描述

我提供的源码包中在PaddleGAN框架上还有很多其它网络,训练和测试方法都差不多,学者结合自己情况选择。目前PaddleGAN框架支持的模型在ppgan/models路径下,见下:

在这里插入图片描述

4.2 第一阶段训练

本教程的主体为EDVR,就选择EDVR模型进行讲解。

EDVR模型训练分为两个阶段,第一阶段训练不带TSA模块,第二阶段训练在第一阶段模型基础上带TSA模块训练。

4.2.1 训练配置文件修改

下面是第一阶段训练的配置文件常用修改地方,见下:

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

4.2.2 启动训练

下面两种启动方式二选一都可以。

4.2.2.1 命令启动

配置文件修改好后,在终端输入下面命令启动训练:

python -u tools/main.py --config-file configs/edvr_m_wo_tsa.yaml
4.2.2.2 Configutation配置启动

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.2.3 模型权重保存

训练过程中的模型权重文件保存到根目录下的output_dir文件夹中,见下:

在这里插入图片描述

4.3 第一阶段测试

上面一阶模型训练好后进行测试。

4.3.1 测试配置文件修改

测试的配置文件和训练的配置文件是一个,有几个参数是针对测试的需要修改,见下:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3.2 启动测试

下面启动方式二选一都可以。

4.3.2.1 命令启动

在终端输入下面命令:

   python tools/main.py --config-file configs/edvr_m_wo_tsa.yaml --evaluate-only --load output_dir/edvr_m_wo_tsa-2024-07-29-17-14/iter_1_checkpoint.pdparams

上面命令中–load后面参数为第一阶段训练好的模型权重文件路径。

4.3.2.2 Configutation配置启动

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4.3.3 一阶测试结果

测试结果保存在output_dir文件件下:

在这里插入图片描述

4.4 第二阶段训练

4.4.1 训练配置文件修改

二阶段训练的配置文件修改参数和第一阶段差不多,参考4.2.1,二阶段的配置文件见下:

在这里插入图片描述

4.4.2 启动训练

4.4.2.1 命令启动

在终端输入下面命令:

 python -u tools/main.py --config-file configs/edvr_m_w_tsa.yaml --load output_dir/edvr_m_wo_tsa-2024-07-31-09-13/iter_600000_weight.pdparams

上面命令中–load后面参数为第一阶段训练好的模型权重路径。

4.4.2.2 Configutation配置启动

在这里插入图片描述

4.4.3 模型权重保存

第二阶段训练好的模型权重文件也是保存到根目录output_dir文件夹中,见下:

在这里插入图片描述

4.5 第二阶段测试

4.5.1 测试配置文件修改

测试的配置文件需要修改地方见下:

在这里插入图片描述

在这里插入图片描述

4.5.2 启动测试

4.5.2.1 命令启动

在终端输入下面命令:

   python tools/main.py --config-file configs/edvr_m_w_tsa.yaml --evaluate-only --load output_dir/edvr_m_w_tsa-2024-08-05-09-05/iter_600000_weight.pdparams

上面命令中–load中后面参数为第二阶段训练好的模型权重文件路径。

4.5.2.2 Configutation配置启动

在这里插入图片描述

4.5.3 二阶段测试结果

测试结果保存在根目录output_dir文件夹中,见下:

在这里插入图片描述

五、中断后接着训练

在训练过程可能会出现训练中断的问题,恢复接着训练的参数为–resume,见下:

在这里插入图片描述

举例我的训练中断位置为31500,见下:

在这里插入图片描述

继续之前的训练命令为:

python -u tools/main.py --config-file configs/edvr_m_wo_tsa.yaml --resume output_dir/edvr_m_wo_tsa-2024-07-30-11-41/iter_315000_checkpoint.pdparams

运行后继续接着训练,见下:

在这里插入图片描述

不管是第一阶段训练还是二阶段训练,恢复训练方法都一样。

六、可能报错

当配置文件中将save_img设置为true时报错:

在这里插入图片描述

6.1 报错

Traceback (most recent call last): File “F:/Code/Python/PaddleGAN/PaddleGAN/tools/main.py”, line 56, in main(args, cfg) File “F:/Code/Python/PaddleGAN/PaddleGAN/tools/main.py”, line 42, in main trainer.test() File “F:\Code\Python\PaddleGAN\PaddleGAN\ppgan\engine\trainer.py”, line 305, in test short_path = os.path.basename(current_paths[j]) # 如果当前索引 j 在 current_paths 的范围内,则获取对应的文件名,并去掉文件扩展名以获得 basename。 File “D:\APP\Anaconda\Path\envs\PaddlePaddle2.4_Py3.8\lib\ntpath.py”, line 216, in basename return split§[1] File “D:\APP\Anaconda\Path\envs\PaddlePaddle2.4_Py3.8\lib\ntpath.py”, line 185, in split p = os.fspath§ TypeError: expected str, bytes or os.PathLike object, not list

6.2 问题分析

问题出在 os.path.basename(current_paths[j]) 这一行。current_paths[j] 传递给 os.path.basename() 的参数是一个列表,而不是字符串(或字节序列、PathLike对象),这导致了 TypeError。

6.3 解决办法

修改代码见下:

在这里插入图片描述

七、效果展示

各个阶段的超分的效果图对比见下:

场景1见下:

在这里插入图片描述

场景2见下:

在这里插入图片描述

八、总结

以上就是EDVR超分模型训练自己数据集与推理测试的详细过程,供参考!从测试结果来看,效果不错,有一定优势。

感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖

关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!

  • 17
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
随着深度学习技术的不断发展,超分辨率算法也在不断地更新和提升。以下是一些目前被认为是SOTA(State-of-the-art)的超分辨率算法: 1. ESRGAN(Enhanced Super-Resolution Generative Adversarial Networks):这是一种基于对抗生成网络(GAN)的算法,能够生成高质量的超分辨率图像。ESRGAN在2018年提出,相比于之前的SRGAN算法,在视觉效果和定量评价上都有了很大的提升。 2. RCAN(Residual Channel Attention Networks):这是一种基于残差注意力网络的算法,能够有效地提高超分辨率图像的质量。RCAN在2018年提出,相比于之前的SRCNN算法,在视觉效果和定量评价上都有了很大的提升。 3. RDN(Residual Dense Network):这是一种基于残差密集网络的算法,能够有效地提高超分辨率图像的质量。RDN在2018年提出,相比于之前的SRResNet算法,在视觉效果和定量评价上都有了很大的提升。 4. EDVR(Enhanced Deep Video Restoration):这是一种基于视频修复的算法,能够对视频进行超分辨率重建和去噪等操作。EDVR在2019年提出,相比于之前的基于单张图像的算法,在处理视频时能够更好地保持连续性和稳定性。 5. SAN(Scale Aggregation Network):这是一种基于多尺度特征融合的算法,能够有效地提高超分辨率图像的质量。SAN在2020年提出,相比于之前的基于单尺度特征的算法,在处理多尺度图像时能够更好地保持细节和纹理。 总之,随着深度学习技术的不断进步,超分辨率算法的质量和效果也在不断提高。未来还有可能会出现更多更先进的算法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

视觉研坊

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值