可变3D卷积|| Deformable 3D Convolution for Video Super-Resolution

DEFORMABLE 3D CONVOLUTION FOR VIDEO SUPER-RESOLUTION

~前言~

3D卷积可以比2D卷积更关注时空特征。且对于3D Net来说,在所有层使用3×3×3的小卷积核效果更好。

以前的方法多是在空间域上提取特征,在时域上进行动作补偿。因此视频序列中的时空信息无法被共同利用,超分辨视频序列的相干性被削弱。

由于视频帧在时间维度上提供了额外的信息,因此充分利用视频帧的时空依赖性来提高视频SR的性能是非常重要的。

由于三维卷积(C3D)可以同时建模外观与运动,于是C3D应用于视频。但是,C3D的接收域固定,不能有效的模拟大动作。

为了补短板,将可变形卷积与C3D结合,实现可变形3D卷积(D3D)。

D3D仅在空间维度上执行核变形去融合时间先验(时间上越接近参考帧越重要)。


 C3D:普通的3D卷积​

image-20210729214600904

  1. 对输入的特征图用3D卷积采样

  2. 通过函数w对采样值计算加权和

具体来说,通过一个3×3×3卷积可以被表示为:

$$y(P_0)=\sum^{N}_{n=1}w(P_n)·x(P_0+P_n)
$$

P_0​代表输出特征中的一个位置

P_n代表n_{th}​在3×3×3卷积采样网格G中的值。

N=27(3×3×3)是采样网格的尺寸。

Fig.1中所示,在输入特征图中的3×3×3的浅橘色立方体是普通的C3D采样网格,用于生成输出特征中的深橙色立方体。

D3D 可变3D卷积

D3D通过可学习的偏置增大空间接收域来提升外观与动作的建模能力。

Fig.1 C×T×W×H的输入特征图一开始被喂进C3D产生2N×T×W×H的偏置。偏移特征的通道数量被设置为2N,是为了2D空间形变(即沿着高度和宽度维度形变)。学习到的偏置用于指导C3D网格的形变去生成D3D网格。最后,D3D网格被用于产生输出特征。

D3D的表达式为:

$$
y(P_0)=\sum^N_{n=1}w(p_n)·x(p_0+p_n+△p_n)
$$

其中的△p_n​​​代表第n_{th}​​​​的值在3×3×3卷积采样网格中对应的偏置。

P_0​代表输出特征中的一个位置

P_n代表n_{th}​在3×3×3卷积采样网格G中的值。

N=27(3×3×3)是采样网格的尺寸。

image-20210729142550080

image-20210729222716023

D3DNET

image-20210729161518902

一个带有7帧的视频序列被输入一个C3D层产生特征图。

接着喂进5个resD3D层(Fig.2(b)),以达到动作感知深度时空特征提取。

然后,输入瓶颈层去融合提取的特征。

最后这些融合的特征被6个联级残差模块(Fig.2.(c))处理,一个超像素层用于重建。

总结

  1. 提出D3Dnet来充分利用时空信息

  2. 融合可变卷积与C3D卷积为D3D卷积,拥有高效的时空挖掘与自适应运动补偿。

  3. 计算效率高。

效果

  • 2
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
对于3D可变卷积3D Deformable Convolution)的PyTorch实现,你可以使用`torch.nn.Conv3d`结合自定义的可变形操作来实现。以下是一个简单的示例代码: ```python import torch import torch.nn as nn from torch.autograd import Function class DeformConv3dFunction(Function): @staticmethod def forward(ctx, input, offset, weight, bias=None): ctx.save_for_backward(input, offset, weight, bias) output = input.new_empty(DeformConv3dFunction._output_size(input, weight)) # 在这里实现可变卷积的前向传播操作 # 使用偏移量(offset)来计算采样点的位置,再根据权重(weight)进行卷积运算 return output @staticmethod def backward(ctx, grad_output): input, offset, weight, bias = ctx.saved_tensors grad_input = grad_offset = grad_weight = grad_bias = None # 在这里实现可变卷积的反向传播操作 # 根据grad_output和之前保存的参数,计算梯度 return grad_input, grad_offset, grad_weight, grad_bias @staticmethod def _output_size(input, weight): # 根据输入和权重的形状计算输出的大小 return input.size(0), weight.size(0), input.size(2), input.size(3), input.size(4) class DeformConv3d(nn.Module): def __init__(self, in_channels, out_channels, kernel_size, stride=1, padding=0, bias=True): super(DeformConv3d, self).__init__() self.offset_conv = nn.Conv3d(in_channels, 3 * kernel_size**3, kernel_size, stride, padding) self.conv = nn.Conv3d(in_channels, out_channels, kernel_size, stride, padding, bias=bias) def forward(self, input): offset = self.offset_conv(input) output = DeformConv3dFunction.apply(input, offset, self.conv.weight, self.conv.bias) return output # 使用示例 input = torch.randn(1, 3, 10, 10, 10) offset_conv = DeformConv3d(3, 64, 3) output = offset_conv(input) ``` 注意,这只是一个简单的示例代码,实际使用中可能需要根据需求进行适当的修改和调整。希望能对你有所帮助!如果还有其他问题,请继续提问。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值