0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

视频去模糊-STFAN, 达到速度,精度和模型大小同步考虑的SOTA性能

电子设计 来源:电子设计 作者:电子设计 2020-12-10 20:22 次阅读
该文是商汤研究院、南京科技以及哈工大联合提出的一种采用动态滤波器卷积进行视频去模糊的方法。

由于相机抖动、目标运动以及景深变化会导致视频中存在spatially variant blur现象。现有的去模糊方法通常在模糊视频中估计光流进行对齐。这种方法会因光流估计的不够精确导致生成的视频存在伪影,或无法有效去除模糊。为克服光流估计的局限性,作者提出了一种的STFAN框架(同时进行对齐和去模糊)。它采用了类似FRVSR的思路进行视频去模糊(它前一帧的模糊以及去模糊图像联合当前帧模糊图像作为输出,经CNN后输出当前帧去模糊图像),其CNN架构采用了空间自使用滤波器进行对齐与去模糊。

作者提出一种新的FAC操作进行对齐,然后从当前帧移除空间可变模糊。最后,作者设计了一个重建网络用于复原清晰的图像。
作者在合成数据与真实数据进行了量化对比分析,所提方法取得了SOTA性能(同时考虑了精度、速度以及模型大小)。

文章作者: Happy

Abstract

论文将视频去模糊中的近邻帧对齐与非均匀模糊移除问题建模为element-wise filter adaptive convolution processes。论文的创新点包含:

  • 提出一个滤波器自适应卷积计算单元,它用于特征域的对齐与去模糊;
  • 提出一个新颖的STFAN用于视频去模糊,它集成帧对齐、去模糊到同一个框架中,而无需明显的运动估计;
  • 从精度、速度以及模型大小方面对所提方法进行了量化评估,取得了SOTA性能。

Method


​上图给出了文中所用到的网络架构示意图。从中可以看出,它包含三个子模块:特征提取、STFAN以及重建模块。它的输入包含三个图像(前一帧模糊图像,前一帧去模糊图像以及当前帧模糊图像),由STFAN生成对齐滤波器与去模糊滤波器,然后采用FAC操作进行特征对齐与模糊移除。最后采用重建模块进行清晰图像生成。

FAC

​关于如何进行代码实现,见文末,这里就不再进行更多的介绍。

网络架构

​如前所述,该网络架构包含三个模块,这里将分别针对三个子模块进行简单的介绍。

  • 特征提取网络。该模块用于从模糊图像$B_t$中提取特征$E_t$,它由三个卷积模块构成,每个卷积模块包含一个stride=2的卷积以及两个残差模块(激活函数选择LeakyReLU)。这里所提取的特征被送入到STFAN模块中采用FAC操作进行去模糊。该网络的配置参数如下:

注:上述两个滤波器生成模块均包含一个卷积和两个残差模块并后接一个1x1卷积用于得到期望的输出通道。基于所得到的两组滤波器,采用FAC对前一帧的去模糊特征与当前帧的帧特征进行对齐,同时在特征层面进行模糊移除。最后,将两者进行拼接送入到重建模块中。该模块的配置参数如下:

  • 重建模块。该模块以STFAN中的融合特征作为输入,输出清晰的去模糊图像。该模块的配置参数如下所示。

损失函数

​为更有效的训练所提网络,作者考虑如下两种损失函数:

  • MSE Loss。它用于度量去模糊图像R与真实图像S之间的差异。
  • Perceptional Loss。它用于度量去模糊图像R与真实图像S在特征层面的相似性。

总体的损失定义为:
$$ L_{deblur} = L_{mse} + 0.01 * L_{perceptual}$$

Experiments

Dataset

​训练数据源自《Deep video deblurring for hand-held camars》,它包含71个视频(6708对数据),被划分为61用于训练(5708对数据),10个用于测试(1000对数据)。

​在数据增广方面,作者将每个视频划分为长度为20的序列。

​为增广运动的多样性,对序列数据进行随机逆序。对每个序列数据,执行相同的图像变换(包含亮度、对比度调整(从[0.8, 1.2]范围内均匀采样))、几何变换(包含随机水平/垂直镜像)以及裁剪。

​为提升模块在真实场景的鲁棒性,对序列图像添加了高斯(N(0, 0.01))随机噪声。

Training Settings

​整个网络采用kaiming方式进行初始化,采用Adam优化器( [公式] ),初始学习率设为1e-4,每400k迭代乘以0.1。总计迭代次数为900k。

Results

​下面两图给出了不同去模糊方法的量化对比以及视觉效果对比。更多实验结果以及相关分析请查阅原文。

小结

​本文提出一种新颖的基于动态滤波器卷积的时空网络用于视频去模块。该网路可以动态的生成用于对齐与去模糊的滤波器。基于所生成滤波器以及FAC单元,该网络可以执行时序对齐与特征去模糊。这种无明显运动估计的方法使得它可以处理动态场景中的空间可变的模块现象。

结合论文所提供的网络架构,以及论文附加文档中所提供的相关参数,简单的整理代码如下:了精度、速度以及模型大小)。

参考代码

结合论文所提供的网络架构,以及论文附加文档中所提供的相关参数,参考代码如下:

import torch
import torch.nn as nn
import torch.nn.functional as F

# 论文中各个模块中设计的残差模块(文中未提到是否有BN层,因此这里未添加BN)。
class ResBlock(nn.Module):
    def __init__(self, inc):
        super(ResBlock, self).__init__()
        self.conv1 = nn.Conv2d(inc, inc, 3, 1, 1)
        self.lrelu = nn.LeakyReLU(0.1)
        self.conv2 = nn.Conv2d(inc, inc, 3, 1, 1)
    def forward(self, x):
        res = self.conv2(self.lrelu(self.conv1(x)))
        return res + x

# 特征提取模块
class FeatureExtract(nn.Module):
    def __init__(self):
        super(FeatureExtract, self).__init__()
        self.net = nn.Sequential(nn.Conv2d(3, 32, 3, 1, 1),
                                ResBlock(32),
                                ResBlock(32),
                                nn.Conv2d(32, 64, 3, 2, 1),
                                ResBlock(64),
                                ResBlock(64),
                                nn.Conv2d(64, 128, 3, 2, 1),
                                ResBlock(128),
                                ResBlock(128))
    def forward(self, x):
        return self.net(x)
    
# 重建模块
# (注:ConvTranspose的参数参考附件文档设置,pad参数是估计所得,只有这组参数能够满足论文的相关特征之间的尺寸关系,如有问题,请反馈更新)
class ReconBlock(nn.Module):
    def __init__(self):
        super(ReconBlock, self).__init__()
        self.up1  = nn.ConvTranspose2d(256, 64, 4, 2, 1)
        self.res2 = ResBlock(64)
        self.res3 = ResBlock(64)
        self.up4  = nn.ConvTranspose2d(64, 32, 3, 2, 1)
        self.res5 = ResBlock(32)
        self.res6 = ResBlock(32)
        self.conv7 = nn.Conv2d(32, 3, 3, 1, 1)

    def forward(self, feat, inputs):
        N, C, H, W = feat.size()
        up1  = self.up1(feat, output_size=(H * 2, W * 2))
        res2 = self.res2(up1)
        res3 = self.res3(res2)
        
        up4  = self.up4(res3, output_size=(H * 4, W * 4))
        res5 = self.res5(up4)
        res6 = self.res6(res5)
        
        conv7 = self.conv7(res6)
        return conv7 + inputs
    
# FAC(以下代码源自本人博客[动态滤波器卷积在CV中的应用]中的相关分析)
def unfold_and_permute(tensor, kernel, stride=1, pad=-1):
    if pad < 0:
        pad = (kernel - 1) // 2
    tensor = F.pad(tensor, (pad, pad, pad, pad))
    tensor = tensor.unfold(2, kernel, stride)
    tensor = tensor.unfold(3, kernel, stride)
    N, C, H, W, _, _ = tensor.size()
    tensor = tensor.reshape(N, C, H, W, -1)
    tensor = tensor.permute(0, 2, 3, 1, 4)
    return tensor

def weight_permute_reshape(tensor, F, S2):
    N, C, H, W = tensor.size()
    tensor = tensor.permute(0, 2, 3, 1)
    tensor = tensor.reshape(N, H, W, F, S2)
    return tensor

# Filter_adaptive_convolution
def FAC(feat, filters, kernel_size):
    N, C, H, W = feat.size()
    pad = (kernel_size - 1) // 2
    feat = unfold_and_permute(feat, kernel_size, 1, pad)
    weight = weight_permute_reshape(filters, C, kernel_size**2)

    output = feat * weight
    output = output.sum(-1)
    output = output.permute(0,3,1,2)
    return output

# Architecture
class STFAN(nn.Module):
    def __init__(self, kernel_size=5):
        super(STFAN, self).__init__()
        filters = 128 * kernel_size ** 2
        self.ext = nn.Sequential(nn.Conv2d(9,32,3,1,1),
                                 ResBlock(32),
                                 ResBlock(32),
                                 nn.Conv2d(32,64,3,2,1),
                                 ResBlock(64),
                                 ResBlock(64),
                                 nn.Conv2d(64,128,3,2,1),
                                 ResBlock(128),
                                 ResBlock(128))
        self.align = nn.Sequential(nn.Conv2d(128,128,3,1,1),
                                   ResBlock(128),
                                   ResBlock(128),
                                   nn.Conv2d(128, filters, 1))
        self.deblur1 = nn.Conv2d(filters, 128, 1, 1)
        self.deblur2 = nn.Sequential(nn.Conv2d(256,128,3,1,1),
                                     ResBlock(128),
                                     ResBlock(128),
                                     nn.Conv2d(128, filters, 1))
        self.conv22 = nn.Conv2d(256, 128, 3, 1, 1)

    def forward(self, pre, cur, dpre):
        ext = self.ext(torch.cat([dpre, pre, cur], dim=1))
        align = self.align(ext)

        d1 = self.deblur1(align)
        deblur = self.deblur2(torch.cat([ext, d1], dim=1))
        return align, deblur


class Net(nn.Module):
    def __init__(self, kernel_size=5):
        super(Net, self).__init__()
        self.kernel_size = kernel_size
        self.feat = FeatureExtract()
        self.stfan = STFAN()
        self.fusion = nn.Conv2d(256, 128, 3, 1, 1)
        self.recon = ReconBlock()

    def forward(self, pre, cur, dpre, fpre):
        # Feature Extract.
        feat = self.feat(cur)

        # STFAN
        align, deblur = self.stfan(pre, cur, dpre)

        # Align and Deblur
        falign  = FAC(fpre, align, self.kernel_size)
        fdeblur = FAC(feat, deblur, self.kernel_size)
        fusion = torch.cat([falign, fdeblur], dim=1)

        # fpre for next
        fpre  = self.fusion(fusion)

        # Reconstruction
        out = self.recon(fusion, cur)
        return out, fpre
    
def demo():
    pre = torch.randn(4, 3, 64, 64)
    cur = torch.randn(4, 3, 64, 64)
    dpre = torch.randn(4, 3, 64, 64)
    fpre = torch.randn(4, 128, 16, 16)

    model = Net()
    model.eval()

    with torch.no_grad():
        output = model(pre, cur, dpre, fpre)
    print(output[0].size())
    print(output[1].size())

if __name__ == "__main__":
    demo()



本文章著作权归作者所有,任何形式的转载都请注明出处。更多动态滤波,图像质量,超分辨相关请关注我的专栏深度学习从入门到精通。
审核编辑 黄昊宇

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 人工智能
    +关注

    关注

    1777

    文章

    44006

    浏览量

    230976
  • 机器学习
    +关注

    关注

    66

    文章

    8142

    浏览量

    130696
收藏 人收藏

    评论

    相关推荐

    MOS管为什么还要考虑电流大小呢?

    当MOS管驱动能力不足时,我们会使用推挽电路来放大电流,但是MOS管明明是压控型器件,为什么要去考虑电流大小呢?
    发表于 04-28 14:40 310次阅读
    MOS管为什么还要<b class='flag-5'>考虑</b>电流<b class='flag-5'>大小</b>呢?

    消卷积在图像处理中的应用策略与实践

    去模糊算法对三维图像堆栈的每个二维平面进行操作。最近邻算法是最常见的去模糊技术,其通过模糊相邻平面(使用数字模糊滤波器的z + 1和z-1)对每个z平面进行操作,然后从z平面减
    的头像 发表于 04-24 11:43 215次阅读

    变频器闭环控制速度控制精度一般是多少?

    我查阅了部分变频器厂商的说明书,在闭环编码器反馈矢量控制时速度控制精度在0.02%,我想着能够做出这么高的精度吗?0.02%这么高的精度,以50HZ两级对电机为例,
    发表于 02-28 12:16

    fx3进行视频数据流的传输的时候,请问如何修改可以达到同步传输的要求?

    在fx3的固件中给出的slavefifo 是通过bulk传输的demo 我想进行视频数据流的传输的时候,请问如何修改可以达到同步传输的要求 我目前在固件里面只看到了bulk的方式,如果有
    发表于 02-28 07:50

    速度传感器的基本力学模型是什么

    速度传感器的基本力学模型是一个受力物体的运动学和动力学模型的组合。本文将从以下几个方面介绍加速度传感器的基本力学模型。 一、运动学
    的头像 发表于 01-17 11:08 399次阅读

    ADN8834温控精度达到多少?

    拟选用ADN8834做温控芯片,需要的温控精度为正负0.1℃,咨询一下ADN8834温控精度达到多少?内部集成的运放的输入失调电压随温度偏移是多少?
    发表于 12-28 06:13

    解读大模型FP量化的解决方案

    在 LLaMA, BERT 以及 ViTs 模型上,4-bit 量化皆取得了远超 SOTA 的结果。特别是,这篇文章展示了 4-bit 量化的 LLaMA-13B 模型,在零样本推理任务上达到
    发表于 11-24 11:15 377次阅读
    解读大<b class='flag-5'>模型</b>FP量化的解决方案

    AD625的增益精度怎么能达到0.05%的精度啊?

    运放用的AD625,增益精度达到0.02%,外围可编程的放大电路,怎么能达到0.05%的精度啊?算了几天都不行,电阻目前选用的是0.1%的精度
    发表于 11-20 06:05

    去模糊算法适对发射点扩散函数(PSF)的假设要求最低

            长期以来,在显微镜领域获得高分辨率图像一直是一个挑战。去卷积是一种增强图像清晰度的方法,它通常会放大样品和图像之间的噪声。波士顿大学的研究人员最近开发了一种新的去模糊算法,可以
    的头像 发表于 11-02 09:15 310次阅读
    <b class='flag-5'>去模糊</b>算法适对发射点扩散函数(PSF)的假设要求最低

    人工智能SOTA什么意思

    中,SOTA通常用于描述当前最先进的算法或者模型在一个特定数据集上的表现。 SOTA是一个极其重要的标准,因为它可以衡量研究人员的技术水平,并且可以用于比较不同算法的性能优劣。
    的头像 发表于 08-22 16:45 1.1w次阅读

    六相永磁同步电机降阶模型ECE抽取方法

    永磁同步电机降阶模型ECE抽取是通过对永磁同步电机有限元结果进行降阶抽取,等效抽取的结果是基于有限元计算得到的数据表,在控制系统联合仿真过程中只需通过查表得方法就能得到电机的性能,因此
    发表于 08-14 14:08 1689次阅读
    六相永磁<b class='flag-5'>同步</b>电机降阶<b class='flag-5'>模型</b>ECE抽取方法

    Arm性能模型库发布说明产品修订版

    ARM®性能模型库是一个包,其中包含支持的ARM性能模型,用于动态建模和模拟已配置的ARM IP的性能。 您可以根据
    发表于 08-11 06:20

    即插即用的视频深度预测框架是什么

    用我们的VDW数据集而只用统一的NYUDV2训练集进行训练,已经能取得SOTA性能;而用我们的VDW数据集预训练,再在封闭场景的NYUDV2进行finetune,则能够进一步提升模型性能
    发表于 08-09 10:01 407次阅读
    即插即用的<b class='flag-5'>视频</b>深度预测框架是什么

    通过A2B更新软件—A2B如何给汽车应用中的SOTA带来变革

    无线软件升级(SOTA)正迅速成为汽车OEM须开发和部署的重要能力。更新模块、支持客户、和通过附加特性带来利润的能力,使得掌握SOTA成为一个有吸引力的主张。本文讨论SOTA为何出现在汽车环境中,如何部署
    的头像 发表于 06-15 16:02 1202次阅读
    通过A2B更新软件—A2B如何给汽车应用中的<b class='flag-5'>SOTA</b>带来变革

    永磁同步电主轴的电磁噪声分析

    为了提高永磁同步电主轴的加工精度、减小振动、降低其电磁噪声,考虑谐波磁动势的影响,推导永磁同步电 主轴气隙磁密的解析表达式,提高了永磁同步
    发表于 05-24 15:57 0次下载