视频降噪

一直没有接触过视频图像处理,一来这个问题太南了,二来也确实没有想过要接触这方面的东西,借着这个机会看一下传说中的视频图像处理,和单帧图像处理又什么区别,他是如何利用多帧信息更好处理图像,又是如何解决帧间(时间序列)一致性这样一个问题。


Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

文章做了这么几件事

  1. 利用谷歌Unprocessing 仿真了视频的raw, 用的是MOT 追踪的数据
  2. 使用定格动画采集了真实视频对用于微调网络(多帧平均得到GT,这样还是会有噪声的BM3D降噪)
  3. 提出了估计噪声的两种方法lambda_shot 使用flat frame, lambda_read 使用bias frame
  4. 采用空间, channnel,和帧间多种信息融合,使用了可形变的卷积(deformable conv)和一种信息融合的方法

我们先来看怎么从RGB 仿真RAW unprocessing,知道了怎么仿真数据,那么我们开始看这个文章的做法。

  • unprocessing 实现了两个问题
  1. raw 的仿真,已实现
  2. 噪声估计,已实现,使用的是本文的方法


看训练框架,输入三帧,恢复中间帧

  • predenoise
    输入3xhxwx4, 输出 3xhxwx4
  • alignment
    • deformable convolution[13, 35]
      [43] 使用的是 ‘explicit flow information’
      大家说DConv 是自适应的dilatation conv,是Spatial Transformer Networks(STN) 的类似产物

2
p k p_k pk 是常规卷积的偏移量
δ p k \delta p_k δpk 是学习的偏移量
δ m k \delta m_k δmk 是偏移量位置的权重
看这个博客
fig
fig3
上面的图看起来很晕,看edvr的图
edvr-fig3
两个疑问:(暂且猜测这样做,看完代码再做评判)

  1. offset 上采样后和相应level 的特征concat 卷积得到新的level 的offset
  2. DConv 卷积后上采样的特征和相应level 的DConv 怎样融合,通过卷积

  • Non-local Attention
    使用separated attention modules 分离的注意模块,包括spatial attention, channel attention, temporal attention, 他们的输出相加,然后再接一个输入的残差相加。文章使用的是一个criss-cross attention[20], 降低计算量和内存
    fig4
    没看懂

  • Temporal fusion[35]
    formula6

  • spatial fusion[37]
    10 个residual blocks

  • ISP

  • Loss

formula7
时间损失,怎么得到的,相邻两帧怎么会对应同一个raw 呢?他和SMID 又不一样??


看代码

  1. 第一阶段训练predenoise 和ISP 网络
    相当于单张图像raw 域降噪,分别训练,联合优化
  2. 仿真数据训练 RViDeNet


Unprocessing Images for Learned Raw Denoising


  • 写在前面, 我们可以得到干净的raw 为什么还需要仿真raw 图呢?直接在干净的raw 上加噪声,然后使用仿真的噪声来训练一个去噪的网络,把问题回归到一个更简单的领域。来看看文章的说法
  1. RAW 域的噪声适合sensor 强相关的,我们不能针对每一款相机都采集大量的训了数据。(那么我就是可以针对有限的几款相机训练有限的几个模型-False)
  2. 难以获取paired 数据,由于相机的抖动,物体的运动等(确实是这样的,暂时没有很好的方法获取有效多的运动视频-True)
  3. 大多这样的数据对采用长短曝光的快门采集静态场景的数据,短快门作为噪声数据,长快门作为干净数据,这样的数据场景亮度不一致(对于视频超微光来说这样的场景是不是更适合呢?但是视频数据对还是采不到的-True or False)
  4. 按照以上说法似乎单张图像降噪并没有仿真数据的必要,而视频数据或许是可行的
  5. 对于夜间降噪或许又和这篇文章的降噪问题不太一样,我们怎样解决这个问题,看这个文章是怎么针对极端光照下的图像建模的
  6. raw 域的降噪后怎么实行后面的ISP 流程呢?即怎么提亮?怎么做颜色校正?怎么做这一些列的图像增强?这仍旧是一个需要探讨的问题

官方代码 google-research/unprocessing/
torch实现 aasharma90/UnprocessDenoising_PyTorch
文章依据Darmstadt Noise Dataset 流程仿真的数据,我下载不下来这个数据,所以无从得知这个数据集的具体样貌,整个流程的代码操作很明确,但是诸多参数的估计有些云里雾里,他只给了公式,一个流程一个流程梳理看,最重要的其实就是噪声估计


fig2
文章根据DND 数据模拟的ISP 流程

  1. Shot 和read 噪声估计
    针对RGB 图像我们很难估计出每个像素的噪声,但是对于相机sensor 的噪声我们已经有了一定的认知,即光子到达sensor 的统计(shot) 和电路系统的不准确性(read),前者符合泊松分布,后者近似于0均值和固定方差的高斯噪声,所以对于观测值我们有以下模型
    1
    2
    以上g_d和g_a 分别是数字增益和模拟增益, δ r \delta_{r} δr 表示read 噪声的固定方差,基于此,我们可以看出噪声的参数和增益时强相关的,也和sensor 是相关的,而增益在相机中是ISO(感光度)起作用。
    以上一顿操作,我们可以获取相机的噪声水平,但是这个噪声水平怎么得到呢?可以从不同的曝光场景中得到,文章说是从DND 数据集中统计得到的。
    3
    我的猜测是相机会记录下数字增益和模拟增益的大小,那么 δ r \delta_{r} δr怎么估计出来的。按照上一篇文章的说法两者的噪声方差可以通过实验室环境采集得到。原理不得而知,但是方法很明确。以下分布怎么来的看不太懂。
    公式
  2. Demosaic
    双线性/最近邻
  3. 数字增益
    4
    简单认为其为一个全局的scale,为了生成这个scale,假设仿真和真实数据图像灰度是从不同的指数分布中采样,不懂。
  4. 白平衡
    就是 r g a i n r_{gain} rgain b g a i n b_{gain} bgain, 为了防止g>1 的时候,亮区没有信息,设置th=0.9,保护了一下
    fig
  5. 颜色校正
    这涉及到相机CCM 参数校正,在DND 数据集中记录了两个矩阵cam2xyz,xyz2rgb
  6. gamma 压缩
    f
  7. Tone Mapping
    f

数据仿真大概就是这样,后面他们又发了一篇CycleISP 来解决这个数据仿真的问题,我们暂时按照这个来做

  • framework
    fig
  • 数据
    使用MIR Flicker,并且使用高斯下采样了两倍来减少噪声,量化,jpeg 压缩,去马赛克和其他影响。
  • 网络输入
    四通道的bayer 图像+四通道的像素方差估计
'''
添加噪声,添加某增益下噪声采样,注意每个pixel 独立采样
预估某增益下噪声水平,本来噪声的方差应该用真值估计,但是真值往往不可得,所以用观测值代替

'''
variance = image * shot_noise + read_noise
noise = tf.random_normal(tf.shape(image), stddev=tf.sqrt(variance))
image_noise = image + noise
image_var = image_noise * shot_noise + read_noise

其他好像没有什么需要注意的了,嗯没有norm layer,batchsize=16,leakyReLU,下采样了4次,残差学习


A Physics-based Noise Formation Model for Extreme Low-light Raw Denoising


Benchmarking Denoising Algorithms with Real Photographs

  • analog gains (ISO values)
    通过控制ISO,文章的解释就是模拟增益来获取不同水平的噪声,然后通过调整曝光时长来控制图像的平均亮度。
  • 那么在ISP 中增益和ISO 有什么样的关系呢?他们又是怎样控制图像亮度的呢?

ISP 中增益一般以db位单位,db和提高亮度之间的关系符合 d b = 20 l o g x db=20logx db=20logx,即每提高一倍的亮度需提高的增益

# coding=utf-8
"""
ISO Gain(db, intensity) 之间的关系
ISO 感光度,指sensor 的感光能力,同样的场景下ISO 越好,那么图像就越亮,但是通常情况下,相机的硬件固定了以后ISO就固定了
故我们通常通过调整模拟增益(analog gains)来提高ISO
那么我们通常所说的ISO-200、ISO-2500 和0db 增益30db 增益是怎样控制图像亮度的呢?
其实他们都和提升的亮度的倍数有关 $db=20logscale$, 即每提升2倍的亮度db 大约提高6db,ISO 提高2倍
举个栗子:
ISO | db | intensity|
---| --- | --- |
100 | 0  | 1 |
200 | 6 | 2 |
400 | 12 | 4 |
"""

import numpy as np
import matplotlib.pyplot as plt

i = np.linspace(1, 20, 100)
# i-db
db = 20 * np.log(i)
plt.figure(1)
plt.plot(i, db)
plt.xlabel('i_scale')
plt.xlim(1)
plt.ylabel('gain_db')
plt.ylim(0)
plt.savefig('i_db.png')
plt.figure(2)
plt.plot(db, i)
plt.xlabel('gain_db')
plt.xlim(0)
plt.ylabel('i_scale')
plt.ylim(1)
plt.savefig('db_i.png')
# i-ISO
# 就是正比

公式
论文之路止步于此…
2020.11.24 再来看下这个文章
文章通过在不同的ISO 下调整曝光时长来获取配对的图像,那么在低ISO 的图像近似无噪声的作为参考。
这个参考(reference) 并不是gt,需要细致的后处理

  • 空间对齐(correct spatial misalignment)
  • 校正曝光参数(cope with inaccuracies in the exposure parameters)
    基于各向异性的Tobit 回归模型的线性灰度变换
  • 去除低频偏置残差(remove residual low-frequency bias that stems, e.g., from minor illumination changes)
    这些操作都不知道

去噪数据GT的获取,目前看来,多帧平均或者低增益配合长曝光,两种模式。1. 对齐问题是存在的,但是就超微光的经验来看,我们的采集方式应该不会有影响。2. 亮度不同确实是这样的,如果所有的差异都差不多或者差异的趋势一致,那么这个对于应用会有很大影响吗?影响肯定是有的,但是对于去噪这个任务的影响大小呢?但是对于作为benchmark 评估来说肯定是有影响的吧?3. 看不懂

我发现这几篇文章估计噪声的方式好像不太一样

  • unprocessing—在固定增益下,估计高斯噪声的方差参数,这个参数是相机原始数据记载的,我们的相机并没有记录啊
    fig
  • Burst Denoising with Kernel Prediction Networks
    unprocessing 引的这篇,也是他们自己写的
    fig
    确实看起来是一样的,但是还是有一个疑问 δ s \delta_s δs,还是 δ s 2 \delta_s^2 δs2,感觉应该是指方差
  • RViDe
    fig
    这个才是最接近原始物理意义的
  • K-sigma transform
    看了这篇文章才觉得以上几篇文章都白看了。做完这一系列实验,优化实验就在他身上了。

既然我都知道噪声估计的方法了,这篇文章到此为止。


FastDVDnet: Towards Real-Time Deep Video Denoising Without Flow Estimation

figa
figb

FastDVDNet 舍弃了视频处理中常用的光流方法和可形变卷积,直接使用two-stage 的卷积处理视频信息,有利有弊吧。


  • 20201214 总结下上面所作的工作
  1. unprocessing 仿真raw 数据
    使用imx305 D50 下的白平衡和ccm 矩阵替换了谷歌的流程,仿真的 raw 数据和真实的raw 数据通过真实数据预训练的ISP 有色差,但是仿真的raw 数据训练raw 域降噪还是可以的
  2. 标定imx305 的噪声
    使用的是RViDeNet 标定噪声的方法,和论文表现一致,可复现性较高
  3. 训练了三个降噪模型
    3.1 raw denoise + isp
    3.2 two-stage raw denoise + isp
    3.3 FastDVDNet two-stage 和one-stage 都尝试过
    上述模型可以做到raw 域降噪的效果,但是效果不尽如人意。感觉不知道时序一致性到底是降噪没有训练好还是时序一致性没有训练好。接下来想要拥有两个目标,一个是训练一个好的去噪网络,但是实际上ssim 已经到了0.98,但是噪声还是很大,并没有论文放出来的图那么好。下次阅读论文应该先复现,在用自己的数据做实验,看到底是自己的问题,就不用老是怀疑论文了,比较有目标性的调优。
  4. 工作计划
    4.1 复现 cycleISP
    4.2 使用cycleISP 仿真的数据做实验
    4.3 复现沈老师的工作
    4.4 另外k-sigma transform 的工作也值得关注

CycleISP

github 20201217 没有放出训练代码

在low-level 问题中获取pixel-wise paired 数据是必要且困难的,但是实际上空间像素的不对齐,颜色,亮度的不匹配时不可避免的,且不同场景,不同设备的数据获取代价巨大且工作重复。

The main idea is to inject noise in the RAW images obtained with our learned device-agnostic transformation rather than in the sRGB images directly
文章主要的思想是在通过学习得到的设备无关的变换的RAW 加入噪声而不是直接将噪声加在RGB 上

  • 文章主要工作
    • CycleISP - 一个设备无关的变换,可以使rgb 和 raw 之间相互转换
    • 真实噪声的合成
    • 双注意力机制(dual attention mechanism)
    • 轻量的网络,最好的效果
    • other application

20201218 日 先用MOT 数据做沈老师的时序一致性,这样的话还是得有raw 的视频流噪声和无噪声+无噪声的gt


20210126 我现在有一个不成熟的想法,学习到的raw 图除以一定的scale 就可以仿真低照度的raw 图啦?



Efficient Semantic Video Segmentation with Per-frame Inference

视频流的处理,要么使用光流将结果
这篇文章关于时序一致性的约束其实和SMID 并无区别。
实验证明,选择合适的超参是有效果的,但是约束时序一致性的同时会造成图像的模糊。那么这两者好像是不可调和的矛盾?怎样缓解呢?
20210126 暂时并无办法解决,也没有想通为什么会这样。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值