来自 GoPro 的一篇视频降噪的文章,发表在 CVPR 2020 年论文,也公布了 Python 源码

视频降噪和图片降噪区别在于视频降噪后输出的结果,观感上能否保持连贯和平滑,而为了达到这个目的,算法在对视频帧进行降噪时,需要参考相邻帧的信息。

创新点

  1. 使用了类 UNet 架构的网络,因为 Encoder-Decoder 架构本身具有在感受野范围内对齐的功能,所以不需要加入光流或运动估计模块,从而大大降低了计算量,也避免了引入光流带来的伪影
  2. 为了更好的缓解降噪后的视频出现闪烁(flickering)的问题,使用了两阶段的网络架构

上面的 gif 展示了 video flickering 的现象,右边是逐帧的图片降噪算法处理后的结果,可以看到视频播放时,画面是不停闪烁的,看上去不连贯也不舒服。

网络架构

来看看在网络设计上有啥特别之处

架构上由两个 block 组成,每个 block 包含 16 个卷积层,大部分层的激活函数为 ReLU

与常见 U-Net 主要不同的地方有下面三点

1、在上采样这里,采用了 PixelShuffle 层来避免最后的输出结果出现人工痕迹(譬如说用反卷积会出现棋盘效应)的情况

2、而跳层这里采用的是像素维度上的相加,而不是通道维度上的,从而降低了网络对内存的要求

3、模块中包含残差,它连接了Encoder和Decoder,可以加快训练

什么是 PixelShuffle,它的原理入下图所示,可以避免使用反卷积出现的棋盘效应,在 TensorFlow 中,又被称为 depth-to-space,个人认为后者名称更加形象一些


为啥设计成二阶段级联网络?

可以有效的利用相邻帧之间存在的信息,且强化时序上噪音与输出帧之间的相关性,为了证明二阶段的优势,文中还做了消融试验,把它和一阶段网络进行比较,下图是对比的一阶段的架构图


实验证明,两阶段优于一阶段,PSNR 值有 0.9db 的提升,且避免了输出视频闪烁的问题

多尺度架构和端到端训练

文中对比了多尺度和单尺度,实验表明,多尺度对比单尺度在精度上提升很多。这里的多尺度指的就是使用了类 UNet 的网络架构

处理运动物体

一般的视频去噪方法一般都会加入运动或光流估计模块,但如果运动估计的不准确,最终输出的降噪视频就会出现人工痕迹(artifact),作者实验证明了两阶段级联的网络加上端到端的训练可以缓解这个问题

为什么除了输入视频序列外,还要输入一个噪音图?

这个噪音图是根据设置一个方差值后便可以生产不同强度的高斯噪声。

# 生成噪音
noise = torch.empty_like(seq).normal_(mean=0, std=args['noise_sigma']).to(device)
# 给清晰的图像叠加上噪音
seqn = seq + noise

这个噪音图的输入是借鉴于 FFDNet,好处在于可以作为噪声抑制和细节保持之间的 trade-off

训练细节

优化器:Adam

学习率:前 50 epoch 为 1e3,接下来的 10 epoch 为 1e4,最后的 20 epoch 为 1e6

损失函数:均方误差 MSE,也就是 L2 Loss

数据增益:随机 resize 和 flip

其他参数:batch_size = 96,时序窗口为 5,输入图片大小 96x96

为啥这里输入尺寸这么小,在现实当中真的有效吗?

经测试,是可以去噪的,只是速度慢了一些,大胆猜测可能是因为网络学习到了如何识别噪音= =

在前 60 epoch 迭代的训练中,会对卷积核的权重做 svd 的正交化,这么做的原因是参照了 FFDNet 的经验,浅浅看了 An Analysis and Implementation of the FFDNet Image Denoising Method 文章中对这个 trick 的对比图,PSNR 值会有细微的提升,下面是对应的 python 源代码

def svd_orthogonalization(lyr):classname = lyr.__class__.__name__if classname.find('Conv') != -1:weights = lyr.weight.data.clone()c_out, c_in, f1, f2 = weights.size()dtype = lyr.weight.data.type()# Reshape filters to columns# From (c_out, c_in, f1, f2)  to (f1*f2*c_in, c_out)weights = weights.permute(2, 3, 1, 0).contiguous().view(f1*f2*c_in, c_out)try:# SVD decomposition and orthogonalizationmat_u, _, mat_v = torch.svd(weights)weights = torch.mm(mat_u, mat_v.t())lyr.weight.data = weights.view(f1, f2, c_in, c_out).permute(3, 2, 0, 1).contiguous().type(dtype)except:passelse:pass

效果评估

数据集:两个 DAVIS-test 和 Set8

评估指标: PSNR

横向对比 PSNR 指标如下图所示,其中蓝色表示第一,红色表示第二

从论文中展示图来看,简直就是小龙女劈腿神雕,雕的一批啊,但我拿实际的视频进行测试后发现,效果并没有想像中的好,如果要达到可用的效果的话,可能自己还是需要下不少功夫的

关于计算量这块,我也顺便用 torchprofile 评估了一下网络的计算量,在 720P 下,一帧降噪要 587 G 左右,GoPro 最终在产品使用的网络计算量应该不可能会有这么大

# 衡量计算量的代码块
...
if __name__ == '__main__':from torchprofile import profile_macsmodel_temp = FastDVDnet(num_input_frames=5)model_temp.eval()# 假设是 5 帧inp_frames = torch.randn(1, 15, 1280, 720)noise_map = torch.randn(1, 1, 1280, 720)macs = profile_macs(model_temp, (inp_frames, noise_map))print(macs // 1e9) # 计算量在 587 G 左右
...

源代码中提供的是对于图片序列的去噪代码,我用 cv2 实现了个读取视频输出视频的代码,有需求的朋友可自取,同时也可以 follow 和 star 我一波。

https://github.com/edvardHua/fastdvdnet/blob/master/run_video_fastdvdnet.py

但文中是在服务器端的 NVIDIA Titan XP 上进行的速度测试,对比现有的算法,速度那还是非常快的。

参考文献

  1. FastDVDnet: Towards Real-Time Deep Video Denoising Without Flow
    Estimation - https://arxiv.org/pdf/1907.01361.pdf
  2. https://www.youtube.com/watch?v=Hu7ez10XOJo&t=40s

[视频降噪] GoPro FastDVDNet 看名字就知道它很快相关推荐

  1. CVPR 2022 在星空下起舞,伯克利联合Intel Labs提出极弱光环境下的视频降噪方案

    论文链接:https://arxiv.org/abs/2204.04210 项目主页:https://kristinamonakhova.com/starlight_denoising/ 代码链接:h ...

  2. fcpx:专业视频降噪插件 ProDenoise for Mac

    小编带来 fcpx降噪插件prodenoise「PJB」是一款由Pixel Film Studios出品的fcpx视频降噪插件,适用于Mac版Final Cut Pro X.fcpx降噪插件prode ...

  3. FCPX插件:视频降噪插件ProDenoise for Mac破解激活方法

    fcpx降噪插件prodenoise破解版是一款由Pixel Film Studios出品的fcpx视频降噪插件,适用于Mac版Final Cut Pro X.fcpx降噪插件prodenoise可以 ...

  4. LiveVideoStack线上分享第四季(十):图像视频降噪的现在与未来——从经典方法到深度学习...

    噪声是图像与视频中的一种常见失真类型,也是腾讯多媒体实验室以及腾讯云提供的多种失真处理能力之一.今晚 7:30,LiveVideoStack线上分享第四季,第十期,我们邀请到了腾讯 多媒体实验室总监 ...

  5. au人声处理_如何使用AU软件为视频降噪?

    如何使用AU软件为视频降噪?在录制视屏过程中,会因为环境.设备等种种原因,导致视频录制的声音听起来的很嘈杂,那么怎么运用AU软件为视频降噪呢?下面进行讲解. 1.安装AU完成后,点击"文件& ...

  6. 两段视频合成一个视频用什么软件 怎么把两段视频合成一段看不出来

    两段视频合成一个视频用什么软件?无论是两段视频的合成,还是三段视频的合成,用视频编辑软件都能轻松搞定.但怎么把两段视频合成一段看不出来?这就比较考验制作者的功力了,不过我们还是有捷径的,下面一起来看看 ...

  7. moviepy剪切视频spleeter视频降噪-CPUGPU

    文章目录 简介 安装spleeter 代码执行 简介 moviepy官方中文API spleeter官方github 本文视频降噪原理为使用spleeter提取出人声,仅将人声写回视频并保存. 对于A ...

  8. 视频编辑器GoPro Quik for mac中文版

    GoPro Quik for mac免费版自带28种完全免费的视频风格,用户可以随便挑选任何一种视频风格进行编辑.gopro quik mac版不仅可以帮助用户编辑视频,还可以自动分析您的照片和视频剪 ...

  9. 视频编码h264怎么看_新手怎么上高速,视频拍给你看

    新手怎么上高速,视频拍给你看https://www.zhihu.com/video/1078283038936395776 ​ 其实高速开车并不比市区难的,心态放松一点,掌握一些简单的行车技巧,也不难 ...

最新文章

  1. 大三Java实习总结网易百度小米美团阿里(均拿offer)
  2. Android Stdio 插件谷歌兼容库Appcompat
  3. iframe子页面与父页面元素的访问以及js变量的访问[zhuan]
  4. 判断js变量是否定义,
  5. Qt Creator可视化Chrome跟踪事件
  6. cross_compile = arm-linux-,cross compile grpc for arm
  7. ogre研究之第一个程序(一)
  8. 1-1.Win10系统利用Pycharm社区版安装Django搭建一个简单Python Web项目的步骤之一
  9. VS.Net 2003/VC6.0常用快捷键集合
  10. wxpython下载很慢_FAQ:在 Windows 使用 Python
  11. LED —— 发光二极管
  12. Tcl Tutorial 笔记6 ·while
  13. Android 源码变迁
  14. 「量化技术」Inv_Strategy 胜率76%的趋势反转策略
  15. 安徽师大附中%你赛day3T1 怜香惜玉 解题报告
  16. 产品周报第27期|会员新增拉黑用户权益;CSDN APP V5.1.0版本发布……
  17. 谈谈堆排序,大顶堆,小顶堆
  18. 产品经理——从一块钱看产品推广方案
  19. 《看不见的森林:林中自然笔记》书摘二
  20. Android开发百度地图指南针消失问题

热门文章

  1. 与成都嘉兰图合作了 开启工业设计众包模式
  2. 【转】Rancher部署Træfik实现微服务的快速发现
  3. gephi mysql_使用Gephi分析论坛社交关系网络
  4. 手机照片局部放大镜_苹果常用的放大镜动画演示,引发无数人探寻究竟?
  5. HTML中的XMP标签
  6. 我写了一个脚本,实现了图片分类问题的全自动化训练
  7. HTML项目心得500字,学习心得体会500字大全(7篇)
  8. UiPath RPA 工具中的键盘快捷键
  9. 输入命令:mount /mnt/cdrom输出错误为:mount: /mnt/cdrom: can‘t find in /etc/fstab
  10. 编译原理Antlr教程