🔥PaddleGAN发布最新SOTA算法:视频超分辨率模型PP-MSVSR

百度自研的PP-MSVSR是一种多阶段轻量化视频超分模型,以 1.45M 的参数量在当前轻量化视频超分模型中取得SOTA性能。图示是当前参数量小于6M的轻量化视频超分模型在 UDM10 数据集上的PSNR指标对比。

所有代码及教程完整开源至PaddleGAN中,欢迎大家Star⭐收藏!

① PP-MSVSR模型结构

PP-MSVSR模型结构总览

PP-MSVSR结合了滑动窗口方法和循环网络方法的思想,使用多阶段策略进行视频超分,具有局部融合模块、辅助损失和细化对齐模块以逐步细化增强结果。具体来说,首先在第一阶段对输入的视频帧进行特征抽取和局部特征融合;然后在第二阶段对融合后的特征进行循环双向传播,并且引入辅助Loss来加强传播过程中的特征对齐;最后在第三阶段引入再对齐模块重复利用第二阶段对齐产生的mask和offset来进行特征的再对齐和加强传播,再通过一个重构模块和pixelshuffle就得到了超分后的视频帧。

⭐模型创新点⭐

  1. 设计出一个多阶段视频超分深度架构
  2. 在第一阶段设计了局部融合模块,在特征传播之前进行局部特征融合, 以加强特征传播中跨帧特征的融合。
  3. 在第二阶段中引入了一个辅助损失,使传播模块获得的特征保留了更多与高分辨率空间相关的信息。
  4. 在第三阶段中引入了一个再对齐模块,以充分利用前一阶段传播模块的特征信息。

PP-MSVSR模型的局部融合模块

受滑动窗口方法思想的启发,PP-MSVSR在第一阶段设计了一个局部融合模块LFM。该模块在特征传播之前先进行局部特征融合,以加强特征传播中的跨帧特征融合。 具体来说,LFM的目的是让当前帧的特征先融合其相邻帧的信息,然后将融合后的特传给下一阶段的传播模块。

PP-MSVSR模型的再对齐模块

与图像超分不同,视频超分通常需要将相邻帧与当前帧对齐以更好地整合相邻帧的信息。 在一些大型运动视频超分任务中,对齐的作用尤为明显。在使用双向循环网络的过程中,往往会有多次相同的对齐操作。为了充分利用之前对齐操作的结果,PP-MSVSR提出了细化对齐模块RAM,它可以利用之前对齐的参数并获得更好的对齐结果。
具体来说,首先使用第二阶段特征对齐产生的mask和offset对第三阶段的输入特征进行预对齐,得到预对齐特征。然后用预对齐特征和当前帧特征来生成mask和offset的残差。最后两对mask和offset被用来做最终的对齐,得到最后对齐的特征。

PP-MSVSR模型的光流网络

PP-MSVSR模型再第一阶段和第二阶段采用的对齐是光流引导的可形变卷积,在第三阶段采用的对齐是再对齐模块。其中光流引导的可形变卷积和再对齐模块中的光流网络是我们基于SPyNet进行改进的。具体来说,我们通过用

  1. kernel_size为3的卷积替 kernel_size为7的卷积
  2. 减少基础模块数量

使SPyNet

  1. 精度几乎不变(下降0.3%)
  2. 模型大小由5.5M降低至0.56M,降低了90%参数量。

大模型PP-MSVSR-L

为了满足精度的提升,我们通过增加PP-MSVSR模型的基础模块数量等,获得了一个大模型PP-MSVSR-L。

开发者可根据实际业务场景中对精度速度的要求灵活选择。

② PP-MSVSR模型性能

PP-MSVSR模型数值性能

PP-MSVSR模型性能优异,与当前其他轻量视频超分模型相比,PP-MSVSR仅使用 1.45M 参数在4个常用视频超分测试数据集上均取得最优效果。

PP-MSVSR模型效果可视化

图示为Vid4数据集上的可视化效果对比,PP-MSVSR模型的有更好的细节恢复和可视化。

PP-MSVSR-L模型数值性能

PP-MSVSR-L模型具有精度优势,与当前精度最优的BasicVSR++相比,PP-MSVSR-L以相似的参数量达到了更高的精度。

PP-MSVSR-L模型效果可视化

图示为reds4数据集上的可视化效果对比,PP-MSVSR模型的有更好的细节恢复和可视化。

③ PP-MSVSR模型视频超分效果

PP-MSVSR视频超分实践

PP-MSVSR提供两种体积模型,开发者可根据实际场景灵活选择:PP-MSVSR(参数量1.45M)与PP-MSVSR-L(参数量7.42)。

ppgan.apps.PPMSVSRPredictor(output='output', weight_path=None, num_frames)
ppgan.apps.PPMSVSRLargePredictor(output='output', weight_path=None, num_frames)
参数
  • output_path (str,可选的): 输出的文件夹路径,默认值:output.
  • weight_path (None,可选的): 载入的权重路径,如果没有设置,则从云端下载默认的权重到本地。默认值:None.
  • num_frames (int,可选的): 模型输入帧数,默认值:10.输入帧数越大,模型超分效果越好。
# 安装ppgan
# 当前目录在: /home/aistudio/, 这个目录也是左边文件和文件夹所在的目录
# 克隆最新的PaddleGAN仓库到当前目录
# !git clone https://github.com/PaddlePaddle/PaddleGAN.git
# 如果从github下载慢可以从gitee clone:
!git clone https://gitee.com/paddlepaddle/PaddleGAN.git
%cd /home/aistudio/PaddleGAN/
!pip install -v -e .
!git checkout develop
# 导入一些可视化需要的包
import cv2
import imageio
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
import warnings
warnings.filterwarnings("ignore")
# 定义一个展示视频的函数
def display(driving, fps, size=(8, 6)):
    fig = plt.figure(figsize=size)

    ims = []
    for i in range(len(driving)):
        cols = []
        cols.append(driving[i])

        im = plt.imshow(np.concatenate(cols, axis=1), animated=True)
        plt.axis('off')
        ims.append([im])

    video = animation.ArtistAnimation(fig, ims, interval=1000.0/fps, repeat_delay=1000)

    plt.close()
    return video
# 展示一下输入的视频, 如果视频太大,时间会非常久,可以跳过这个步骤
video_path = '/home/aistudio/011.mp4'
video_frames = imageio.mimread(video_path, memtest=False)

# 获得视频的原分辨率
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
    

HTML(display(video_frames, fps).to_html5_video())
# PPMSVSR模型对该视频进行修复
# input参数表示输入的视频路径
# output表示处理后的视频的存放文件夹
# proccess_order 表示使用的模型和顺序(目前支持)
# num_frames 表示模型输入帧数
%cd applications/
!python tools/video-enhance.py --input /home/aistudio/011.mp4 \
                               --process_order PPMSVSR \
                               --output /home/aistudio/output_dir \
                               --num_frames 100
# 展示一下处理好的视频, 如果视频太大,时间会非常久,可以下载下来看
# 这个路径可以查看上个code cell的最后打印的output video path
output_video_path = '/home/aistudio/output_dir/PPMSVSR/011_PPMSVSR_out.mp4'

video_frames = imageio.mimread(output_video_path, memtest=False)

# 获得视频的原分辨率
cap = cv2.VideoCapture(output_video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
    

HTML(display(video_frames, fps, size=(16, 12)).to_html5_video())

PaddleGAN视频上色、插帧

除了视频超分外,PaddleGAN中还提供了视频上色与补帧的功能,配合上述的PP-MSVSR一起使用,即可实现视频清晰度提高、色彩丰富、播放流畅

补帧模型DAIN

DAIN 模型通过探索深度的信息来显式检测遮挡。并且开发了一个深度感知的流投影层来合成中间流。在视频补帧方面有较好的效果。

ppgan.apps.DAINPredictor(
                        output_path='output',
                        weight_path=None,
                        time_step=None,
                        use_gpu=True,
                        remove_duplicates=False)
参数
  • output_path (str,可选的): 输出的文件夹路径,默认值:output.
  • weight_path (None,可选的): 载入的权重路径,如果没有设置,则从云端下载默认的权重到本地。默认值:None
  • time_step (int): 补帧的时间系数,如果设置为0.5,则原先为每秒30帧的视频,补帧后变为每秒60帧。
  • remove_duplicates (bool,可选的): 是否删除重复帧,默认值:False.

上色模型DeOldifyPredictor

DeOldify 采用自注意力机制的生成对抗网络,生成器是一个U-NET结构的网络。在图像的上色方面有着较好的效果。

ppgan.apps.DeOldifyPredictor(output='output', weight_path=None, render_factor=32)
参数
  • output_path (str,可选的): 输出的文件夹路径,默认值:output.
  • weight_path (None,可选的): 载入的权重路径,如果没有设置,则从云端下载默认的权重到本地。默认值:None
  • render_factor (int): 会将该参数乘以16后作为输入帧的resize的值,如果该值设置为32,
    则输入帧会resize到(32 * 16, 32 * 16)的尺寸再输入到网络中。

上色模型DeepRemasterPredictor

DeepRemaster 模型基于时空卷积神经网络和自注意力机制。并且能够根据输入的任意数量的参考帧对图片进行上色。

ppgan.apps.DeepRemasterPredictor(
                                output='output',
                                weight_path=None,
                                colorization=False,
                                reference_dir=None,
                                mindim=360):
参数
  • output_path (str,可选的): 输出的文件夹路径,默认值:output.
  • weight_path (None,可选的): 载入的权重路径,如果没有设置,则从云端下载默认的权重到本地。默认值:None
  • colorization (bool): 是否对输入视频上色,如果选项设置为 True ,则参考帧的文件夹路径也必须要设置。默认值:False
  • reference_dir (bool): 参考帧的文件夹路径。默认值:None
  • mindim (bool): 输入帧重新resize后的短边的大小。默认值:360。

使用PaddleGAN进行老视频修复

# 导入一些可视化需要的包
import cv2
import imageio
import numpy as np
import matplotlib.pyplot as plt
import matplotlib.animation as animation
from IPython.display import HTML
import warnings
warnings.filterwarnings("ignore")
# 定义一个展示视频的函数
def display(driving, fps, size=(8, 6)):
    fig = plt.figure(figsize=size)

    ims = []
    for i in range(len(driving)):
        cols = []
        cols.append(driving[i])

        im = plt.imshow(np.concatenate(cols, axis=1), animated=True)
        plt.axis('off')
        ims.append([im])

    video = animation.ArtistAnimation(fig, ims, interval=1000.0/fps, repeat_delay=1000)

    plt.close()
    return video
# 展示一下输入的视频, 如果视频太大,时间会非常久,可以跳过这个步骤
video_path = '/home/aistudio/Peking_input360p_clip6_5s.mp4'
video_frames = imageio.mimread(video_path, memtest=False)

# 获得视频的原分辨率
cap = cv2.VideoCapture(video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
    

HTML(display(video_frames, fps).to_html5_video())
# 使用插帧(DAIN), 上色(DeOldify), 超分(MSVSR)这三个模型对该视频进行修复
# input参数表示输入的视频路径
# output表示处理后的视频的存放文件夹
# proccess_order 表示使用的模型和顺序(目前支持)
%cd applications/
!python tools/video-enhance.py --input /home/aistudio/Peking_input360p_clip6_5s.mp4 \
                               --process_order DAIN DeOldify PPMSVSR \
                               --output /home/aistudio/output_dir
# 展示一下处理好的视频, 如果视频太大,时间会非常久,可以下载下来看
# 这个路径可以查看上个code cell的最后打印的output video path
output_video_path = '/home/aistudio/output_dir/PPMSVSR/Peking_input360p_clip6_5s_deoldify_out_PPMSVSR_out.mp4'

video_frames = imageio.mimread(output_video_path, memtest=False)

# 获得视频的原分辨率
cap = cv2.VideoCapture(output_video_path)
fps = cap.get(cv2.CAP_PROP_FPS)
    

HTML(display(video_frames, fps, size=(16, 12)).to_html5_video())

PaddleGAN的花样玩法~

至此,本项目带大家体验了使用PaddleGAN的PP-MSVSR完成视频超分和老视频修复,欢迎大家尝试本项目进行不同类型的视频修复~

当然,PaddleGAN的应用也不会止步于此,PaddleGAN还能提供各类不同的图形影像生成、处理能力人脸属性编辑能力能够在人脸识别和人脸生成基础上,操纵面部图像的单个或多个属性,实现换妆、变老、变年轻、变换性别、发色等,一键换脸成为可能;动作迁移,能够实现肢体动作变换、人脸表情动作迁移等等等等。
强烈鼓励大家玩起来,激发PaddleGAN的潜能!

欢迎加入官方QQ群(1058398620)与各路技术高手交流~~

Logo

学大模型,用大模型上飞桨星河社区!每天8点V100G算力免费领!免费领取ERNIE 4.0 100w Token >>>

更多推荐