💪 专业从事且热爱图像处理,图像处理专栏更新如下👇:
📝《图像去噪》
📝《超分辨率重建》
📝《语义分割》
📝《风格迁移》
📝《目标检测》
📝《暗光增强》
📝《模型优化》
📝《模型实战部署》
EDVR模型在NTIRE19视频恢复和增强挑战赛的四个赛道中都赢得了冠军,并以巨大的优势超过了第二名。
目录
- 一、EDVR
- 1.1 核心思想
- 1.2 网络架构
- 1.2.1 PCD模块
- 1.2.2 TSA模块
- 二、源码包准备
- 三、数据准备
- 3.1 开源数据集
- 3.2 自己制作数据集
- 3.2.1 倔驴必看
- 3.2.2 简易制作数据集
- 四、训练
- 4.1 模型选择
- 4.2 第一阶段训练
- 4.2.1 训练配置文件修改
- 4.2.2 启动训练
- 4.2.2.1 命令启动
- 4.2.2.2 Configutation配置启动
- 4.2.3 模型权重保存
- 4.3 第一阶段测试
- 4.3.1 测试配置文件修改
- 4.3.2 启动测试
- 4.3.2.1 命令启动
- 4.3.2.2 Configutation配置启动
- 4.3.3 一阶测试结果
- 4.4 第二阶段训练
- 4.4.1 训练配置文件修改
- 4.4.2 启动训练
- 4.4.2.1 命令启动
- 4.4.2.2 Configutation配置启动
- 4.4.3 模型权重保存
- 4.5 第二阶段测试
- 4.5.1 测试配置文件修改
- 4.5.2 启动测试
- 4.5.2.1 命令启动
- 4.5.2.2 Configutation配置启动
- 4.5.3 二阶段测试结果
- 五、中断后接着训练
- 六、可能报错
- 6.1 报错
- 6.2 问题分析
- 6.3 解决办法
- 七、效果展示
- 八、总结
一、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超分模型训练自己数据集与推理测试的详细过程,供参考!从测试结果来看,效果不错,有一定优势。
感谢您阅读到最后!😊总结不易,多多支持呀🌹 点赞👍收藏⭐评论✍️,您的三连是我持续更新的动力💖
关注公众号「视觉研坊」,获取干货教程、实战案例、技术解答、行业资讯!