Video SR-1

一、Video Super-Resolution With Convolutional Neural Networks (VSRNet-2016)

  • 滑动窗口+LR图像运动补偿+特征拼接
1、主要工作
  • 提出基于CNN的视频超分算法;
  • 提出三种结构,用来融合相邻的多帧信息
  • 提出预训练方法,利用图像数据对VSR模型预训练;
  • 利用一种自适应运动补偿方案来处理视频中的快速运动物体和运动模糊;
2、三种结构

在这里插入图片描述

3、运动补偿(Motion Compensation)

运动补偿(MC)的作用其实就是多个相邻帧的对齐。
基于运动补偿算法(Druleas algorithm),作者提出自适应运动补偿(AMC),用来解决大运动,严重运动模糊的情况。
从公式可以看出,当运动较大时,即e(i,j)较大时,r(i,j)较小,r小,则t帧权重大,反之,参考帧权重增大。所以,当运动大时,目标帧权重大,当运动小时,参考帧权重增大。
在这里插入图片描述
自适应运动补偿基于运动补偿算法改进得来,根据不匹配误差e(i,j)的大小,确定当前帧与相邻帧的权重。作者实验中表明AMC在大运动视频中优于MC算法。

二、Real-Time Video Super-Resolution with Spatio-Temporal Networks and Motion Compensation(VESPCN-CVPR2018)

  • 滑动窗口+LR运动估计(由粗到细网络)+特征拼接3D卷积。
  • SR网络与运动估计网络分开训练。
1、主要工作
  • 提出了一种基于亚像素卷积和时空网络的视频SR实时算法(VESPCN),提高了精度和时间一致性。
  • 提出了一种基于多尺度空间变换网络的密集帧间运动补偿方法
2、网络结构

在这里插入图片描述

3、Spatial transformer motion compensation
  • 网络结构
    分两步预测光流:先粗略预测光流δc,然后精细预测光流δf,最后将两者相加达到总的光流,利用光流和t+1帧进行Warp操作,得到修正后的t+1帧
    在这里插入图片描述
class MotionCompensator(nn.Module):
    def __init__(self, args):
        self.device = 'cuda'
        if args.cpu:
            self.device = 'cpu' 
        super(MotionCompensator, self).__init__()
        print("Creating Motion compensator")

        def _gconv(in_channels, out_channels, kernel_size=3, groups=1, stride=1, bias=True):
            return nn.Conv2d(in_channels*groups, out_channels*groups, kernel_size, groups=groups, stride=stride,
                             padding=(kernel_size // 2), bias=bias)

        # Coarse flow
        coarse_flow = [_gconv(2, 24, kernel_size=5, groups=args.n_colors, stride=2), nn.ReLU(inplace=True)]
        coarse_flow.extend([_gconv(24, 24, kernel_size=3, groups=args.n_colors), nn.ReLU(True)])
        coarse_flow.extend([_gconv(24, 24, kernel_size=5, groups=args.n_colors, stride=2), nn.ReLU(True)])
        coarse_flow.extend([_gconv(24, 24, kernel_size=3, groups=args.n_colors), nn.ReLU(True)])
        coarse_flow.extend([_gconv(24, 32, kernel_size=3, groups=args.n_colors), nn.Tanh()])
        coarse_flow.extend([nn.PixelShuffle(4)])

        self.C_flow = nn.Sequential(*coarse_flow)

        # Fine flow
        fine_flow = [_gconv(5, 24, kernel_size=5, groups=args.n_colors, stride=2), nn.ReLU(inplace=True)]
        for _ in range(3):
            fine_flow.extend([_gconv(24, 24, kernel_size=3, groups=args.n_colors), nn.ReLU(True)])
        fine_flow.extend([_gconv(24, 8, kernel_size=3, groups=args.n_colors), nn.Tanh()])
        fine_flow.extend([nn.PixelShuffle(2)])

        self.F_flow = nn.Sequential(*fine_flow)

    def forward(self, frame_1, frame_2):
        # Create identity flow
        x = np.linspace(-1, 1, frame_1.shape[3])
        y = np.linspace(-1, 1, frame_1.shape[2])
        xv, yv = np.meshgrid(x, y)
        id_flow = np.expand_dims(np.stack([xv, yv], axis=-1), axis=0)
        self.identity_flow = torch.from_numpy(id_flow).float().to(self.device)

        # Coarse flow
        coarse_in = torch.cat((frame_1, frame_2), dim=1)
        coarse_out = self.C_flow(coarse_in)
        coarse_out[:,0] /= frame_1.shape[3]
        coarse_out[:,1] /= frame_2.shape[2]
        frame_2_compensated_coarse = self.warp(frame_2, coarse_out)
        
        # Fine flow
        fine_in = torch.cat((frame_1, frame_2, frame_2_compensated_coarse, coarse_out), dim=1)
        fine_out = self.F_flow(fine_in)
        fine_out[:,0] /= frame_1.shape[3]
        fine_out[:,1] /= frame_2.shape[2]
        flow = (coarse_out + fine_out)

        frame_2_compensated = self.warp(frame_2, flow)

        return frame_2_compensated, flow

    def warp(self, img, flow):
        # https://discuss.pytorch.org/t/solved-how-to-do-the-interpolating-of-optical-flow/5019
        # permute flow N C H W -> N H W C
        img_compensated = F.grid_sample(img, (-flow.permute(0,2,3,1)+self.identity_flow).clamp(-1,1), padding_mode='border')
        return img_compensated
光流估计损失函数

MSE损失保证t+1帧与t帧尽可能接近。
在经典的光流方法中,通常会约束光流在空间中的平滑度,所以利用Huber损失,最小化对光流图梯度。
在这里插入图片描述

class Approx_Huber_Loss(nn.Module):
    def __init__(self, args):
        super(Approx_Huber_Loss, self).__init__()
        self.device = torch.device('cpu' if args.cpu else 'cuda')
        self.sobel_filter_X = np.array([[1, 0, -1], [2, 0, -2], [1, 0, -1]]).reshape((1, 1, 3, 3))
        self.sobel_filter_Y = np.array([[1, 2, 1], [0, 0, 0], [-1, -2, -1]]).reshape((1, 1, 3, 3))
        self.sobel_filter_X = torch.from_numpy(self.sobel_filter_X).float().to(self.device)
        self.sobel_filter_Y = torch.from_numpy(self.sobel_filter_Y).float().to(self.device)
        self.epsilon = torch.Tensor([0.01]).float().to(self.device)

    def forward(self, flow):
        flow_X = flow[:, 0:1]
        flow_Y = flow[:, 1:]
        grad_X = F.conv2d(flow_X, self.sobel_filter_X, bias=None, stride=1, padding=1)
        grad_Y = F.conv2d(flow_Y, self.sobel_filter_Y, bias=None, stride=1, padding=1)
        huber = torch.sqrt(self.epsilon + torch.sum(grad_X.pow(2)+grad_Y.pow(2)))
        return huber

三、Detail-revealing Deep Video Super-resolution(ICCV2017)

  • 滑动窗口+LR图像运动补偿(采用VESPCN中的光流估计方法,然后SPMC层利用光流直接对参考帧上采样重建)+LSTM多帧特征融合;
  • 先单独训练ME模块,然后联合训练。
1、主要工作

提出了亚像素运动补偿(Sub-pixel Motion Compensation, SPMC)层,可以同时完成超分辨和运动补偿

2、网络流程图
  • 利用运动估计(ME)方法预测光流;
  • 利用光流和LR参考帧,经过SPMC层,直接重建出参考帧的HR图像;
  • 利用U-Net的encoder部分提取特征,在UNet 最底层利用LSTM融合多帧信息;
  • 利用decoder部分上采样完成重建。

在这里插入图片描述

3、SPMC层

分两步:坐标变换+双线性插值上采样
在这里插入图片描述

4、Detail Fusion Net

利用LSTM融合多帧信息
在这里插入图片描述

四、Video Super-Resolution via Bidirectional Recurrent Convolutional Networks (BRCN-TPAMI2018)

双向RNN(无光流估计)+特征拼接

1、主要工作
  • 提出了一种用于多帧SR的双向循环卷积网络(BRCN),其中时间相关性可以通过递归卷积和3D前馈卷积有效地建模。
2、BRCN结构

结构很简单,就是一个双向RNN,没有对齐操作,利用RNN隐式学习多帧空间信息。
在这里插入图片描述

五、Building an End-to-End Spatial-Temporal Convolutional Network for Video Super-Resolution (AAAI 2017)

  • 双向LSTM(无光流估计)+直接拼接融合
1、主要工作
  • 提出了一种深度时空网络(STCN)。 基于LSTM,作者提出了一种双向多尺度卷积LSTM(BMC-LSTM)来融合多帧信息;
  • STCN未进行光流法对齐。作者认为,显式建模可能不足以探索时间信息,因为有太多种类的时间关系(物体运动、颜色过渡和补丁相似),无法完全建模。所以完全通过隐藏层隐式发掘空间信息。
2、STCN结构

其双向RNN结构与BRCN一样,分前向和后向。
在这里插入图片描述

3、BMC-LSTM

前向分支提取前向特征,后向分支提取后向特征,然后利用1x1卷积融合。
在这里插入图片描述

4、MC-LSTM

该模块利用前向特征或者后向特征来更新当前帧的特征
先特征拼接,然后利用多分支提取多尺度信息,最后融合多尺度特征,得到
在这里插入图片描述

六、Frame-Recurrent Video Super-Resolution (FRVSR CVPR 2018)

  • RNN+利用LR图像光流估计(但是光流图作用在HR图像上)+拼接特征融合。
  • 光流与重建联合训练
1、出发点
  • 对每个输入帧进行多次处理和变形,增加了计算成本;
  • 对每个输出帧进行独立条件下的估计,限制了系统产生时间一致结果的能力。
2、主要工作
  • 提出了一个循环框架(FRVSR),使用前一帧的HR估计生成后续帧,从而产生一个时间一致结果(temporally consistent)的有效模型;
  • 与现有方法不同的是,所提出的框架可以在不增加计算量的情况下在大时间范围内传播信息。
3、算法流程
  • 利用FNet进行光流估计,得到LR的光流;
  • 对LR的光流上采样,得到HR的光流;
  • 利用HR光流校正前一帧重建好的HR图像
  • 将校正好的t-1帧的HR利用一个网络进行下采样提取特征得到t-1帧的特征;
  • 将t-1帧的特征与t帧特征融合,完成重建。
    在这里插入图片描述
4、FNet与SRNet

在这里插入图片描述

5、损失函数

重建损失+光流损失
在这里插入图片描述

七、TDAN: Temporally Deformable Alignment Network for Video Super-Resolution (2018)

本文首次提出利用可变形性卷积解决多帧图像对齐问题。

  • 滑动窗口(5帧)+可变形性卷积DCN对齐+LR图像直接拼接融合;
  • 对齐与重建联合训练;
1、出发点

现有方法利用光流法对多帧图像进行对齐,因此,这些模型的性能将很大程度上依赖于光流的预测精度,而不准确的光流将导致参考帧中出现伪影,这些伪影也将传播到重建的HR视频帧中。

2、主要贡献
  • 提出了一种新的用于特征级对齐时间变形对齐网络(TDAN),避免了以往基于光流的两阶段对齐方法。
  • 提出了一个基于TDAN的端到端可训练的VSR框架。
3、方法介绍
  • 网络结构:
    主要分两部分:TDAN对齐部分+SR重建部分
    (1)对齐部分:将参考帧向目标帧对齐;
    (2)SR重建部分:将对齐的LR图像拼接,输入SR网络完成重建;
    在这里插入图片描述
4、TDAN

TDAN分三部分:特征提取+对齐+对齐帧重建

  • 特征提取
    提取不同帧的信息,提取的特征将用于特征的时间对齐。
  • 可变形性对齐(Deformable Alignment)+ 对齐帧重建
    DCN(Deformable Convolutional Networks)相关知识参考DCN
    (1)对i帧和t帧的特征图进行卷积,得到偏移量θ;
    (2)利用学习到的偏移量与i帧特征进行可变形性卷积,达到校正特征的目的
    (3)对校正后的特征图进行重建,得到校正后的LR图像
    (4)重复循环,得到所有参考帧的LR图像,拼接输出,作为SR重建部分的输入。
5、损失函数
  • 训练TDAN,设计对齐损失:
    在这里插入图片描述
  • 训练SR模型,常规的L1损失:
    在这里插入图片描述
  • 联合训练,总体损失为:
    在这里插入图片描述

八、EDVR: Video Restoration with Enhanced Deformable Convolutional Networks(2019 NTIRE19冠军)

  • 滑动窗口+DCN对齐(级联+金字塔)+时空注意力特征融合
1、出发点
  • 如何对齐大运动下(大偏移量)的多个帧(对齐问题);
  • 如何有效地融合带有运动和模糊的多个帧(多帧信息融合问题);
2、主要工作
  • 首先,为了处理大型运动,本文设计了一个金字塔、级联和可变形(PCD)对齐模块,在该模块中,以粗到细的方式使用可变形卷积在特征层面完成帧对齐。
  • 其次,提出时空注意(Temporal and Spatial Attention, TSA)融合模块,在该模块中,注意力同时应用于时间和空间,允许在不同的时间和空间位置上有不同的重点。
3、EDVR整体流程图
  • 预处理去模糊;
  • PCD对齐模块;
  • TSA多帧信息融合;
  • 重建;

在这里插入图片描述

4、PCD模块

PCD模块主要由三部分组成:特征金字塔、级联和可变形卷积对齐。
在这里插入图片描述
第l层的偏移量校正后的特征的计算公式为:
在这里插入图片描述
式中用到的( ,)为拼接操作,g和f为多层CNN,上采样采用bilinear。

5、时空注意力特征融合(TSA)

帧间时间关系和帧内空间关系在融合中至关重要:
(1)由于遮挡、模糊区域和视差问题,不同的相邻帧信息不一样;
(2)前一个对齐阶段产生的不对齐会对随后的重建性能产生不利影响。
为了解决上述问题,本文提出了TSA(时间空间注意力)融合模块,在每一帧上分配像素级聚合权值。
在这里插入图片描述

  • 参考帧与目标帧之间相似性度量,h()即为时间注意力图: 在这里插入图片描述
    将时间注意力图与参考帧做主元素乘法加权,然后拼接所有加权后的,最后卷积完成特征融合。
    在这里插入图片描述
  • 下半部分为空间注意力部分。利用U-Net结构增加感受野,得到空间Mask,最后和特征图逐位置相乘加权。

九、BasicVSR: The Search for Essential Components in Video Super-Resolution and Beyond (CVPR2021)

  • 双向RNN+光流估计+特征内对齐并拼接融合
1、不同方法策略对比

在这里插入图片描述

2、主要工作
  • 本文BasicVSR的方法主要基于BRCN,在BRCN基础上加入光流估计对特征进行对齐。
  • 基于BasicVSR提出IconVSR,在两方面做出改进:
    (1)第一个为information-refill。该机制利用一个额外的模块从稀疏选择的帧(关键帧)中提取特征,然后将这些特征插入到主网络中进行特征细化。
    (2)第二个是耦合传播(coupled propagation)方案,它促进了前向和后向传播分支之间的信息交换。
3、BasicVSR网络结构

基本架构为BRCN,S、W和R分别表示光流估计、对齐和残差块。
在这里插入图片描述

  • 相邻帧个数对结果的影响:
    在这里插入图片描述
  • 双向传播与单向传播结果对比:
    在这里插入图片描述
4、对齐问题

对齐问题有三种解决方法:

  • 无对齐环节:如BRCN,基于递归的方法没有额外的对齐环节。作者进行实验,在BasicVSR中加入特征域对齐操作比不加入对齐操作精度PSNR提升1.19dB。
  • 图像对齐:目前多数方法基于该方法进行,先对LR输入图像对齐,再提取特征。作者进行实验,在BasicVSR中加入图像对齐操作比加入特征对齐操作精度PSNR降低0.17dB。
  • 特征对齐:本文采用特征域内对齐方法,之前方法为LR与对齐的LR拼接,本文方法为LR与对齐的特征拼接。利用LR计算光流,在特征域内完成对齐,然后利用对齐的参考帧的特征与目标帧LR拼接,利用网络残差网络得到融合后的特征。
    在这里插入图片描述
5、IconVSR - Information-refill mechanism

在遮挡区域和图像边界上的不准确对齐是一个挑战,可以导致错误积累,特别是在我们的框架中采用长期传播。为了减轻这些错误特征带来的不良影响,我们提出了一种信息填充机制来进行特征细化。
在这里插入图片描述
在这里插入图片描述

6、IconVSR - Coupled Propagation

在BRCN中,特征在两个相反的方向独立传播,每个传播分支中的特征是基于部分信息计算的,这些信息来自之前的帧或之后的帧为了利用序列中的信息,我们提出了一种耦合传播方案,在前向分支和后向分支之间加了一条通路,如上图所示,加了一条后向到前向的通路,这样前向分支就增加了来自后续帧的信息。由下公式可以看出,前向特征多了一项输入hib。
在这里插入图片描述
但实际上在重建第i帧的信息时,前向和后向特征又进行了融合,感觉这个操作有点多余,但是实验上好像又有点效果。。

  • 3
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值