[视频降噪] GoPro FastDVDNet 看名字就知道它很快
來(lái)自 GoPro 的一篇視頻降噪的文章,發(fā)表在 CVPR 2020 年論文,也公布了 Python 源碼
視頻降噪和圖片降噪?yún)^(qū)別在于視頻降噪后輸出的結(jié)果,觀感上能否保持連貫和平滑,而為了達(dá)到這個(gè)目的,算法在對(duì)視頻幀進(jìn)行降噪時(shí),需要參考相鄰幀的信息。
創(chuàng)新點(diǎn)
上面的 gif 展示了 video flickering 的現(xiàn)象,右邊是逐幀的圖片降噪算法處理后的結(jié)果,可以看到視頻播放時(shí),畫面是不停閃爍的,看上去不連貫也不舒服。
網(wǎng)絡(luò)架構(gòu)
來(lái)看看在網(wǎng)絡(luò)設(shè)計(jì)上有啥特別之處
架構(gòu)上由兩個(gè) block 組成,每個(gè) block 包含 16 個(gè)卷積層,大部分層的激活函數(shù)為 ReLU
與常見(jiàn) U-Net 主要不同的地方有下面三點(diǎn)
1、在上采樣這里,采用了 PixelShuffle 層來(lái)避免最后的輸出結(jié)果出現(xiàn)人工痕跡(譬如說(shuō)用反卷積會(huì)出現(xiàn)棋盤效應(yīng))的情況
2、而跳層這里采用的是像素維度上的相加,而不是通道維度上的,從而降低了網(wǎng)絡(luò)對(duì)內(nèi)存的要求
3、模塊中包含殘差,它連接了Encoder和Decoder,可以加快訓(xùn)練
什么是 PixelShuffle,它的原理入下圖所示,可以避免使用反卷積出現(xiàn)的棋盤效應(yīng),在 TensorFlow 中,又被稱為 depth-to-space,個(gè)人認(rèn)為后者名稱更加形象一些
為啥設(shè)計(jì)成二階段級(jí)聯(lián)網(wǎng)絡(luò)?
可以有效的利用相鄰幀之間存在的信息,且強(qiáng)化時(shí)序上噪音與輸出幀之間的相關(guān)性,為了證明二階段的優(yōu)勢(shì),文中還做了消融試驗(yàn),把它和一階段網(wǎng)絡(luò)進(jìn)行比較,下圖是對(duì)比的一階段的架構(gòu)圖
實(shí)驗(yàn)證明,兩階段優(yōu)于一階段,PSNR 值有 0.9db 的提升,且避免了輸出視頻閃爍的問(wèn)題
多尺度架構(gòu)和端到端訓(xùn)練
文中對(duì)比了多尺度和單尺度,實(shí)驗(yàn)表明,多尺度對(duì)比單尺度在精度上提升很多。這里的多尺度指的就是使用了類 UNet 的網(wǎng)絡(luò)架構(gòu)
處理運(yùn)動(dòng)物體
一般的視頻去噪方法一般都會(huì)加入運(yùn)動(dòng)或光流估計(jì)模塊,但如果運(yùn)動(dòng)估計(jì)的不準(zhǔn)確,最終輸出的降噪視頻就會(huì)出現(xiàn)人工痕跡(artifact),作者實(shí)驗(yàn)證明了兩階段級(jí)聯(lián)的網(wǎng)絡(luò)加上端到端的訓(xùn)練可以緩解這個(gè)問(wèn)題
為什么除了輸入視頻序列外,還要輸入一個(gè)噪音圖?
這個(gè)噪音圖是根據(jù)設(shè)置一個(gè)方差值后便可以生產(chǎn)不同強(qiáng)度的高斯噪聲。
# 生成噪音 noise = torch.empty_like(seq).normal_(mean=0, std=args['noise_sigma']).to(device) # 給清晰的圖像疊加上噪音 seqn = seq + noise這個(gè)噪音圖的輸入是借鑒于 FFDNet,好處在于可以作為噪聲抑制和細(xì)節(jié)保持之間的 trade-off
訓(xùn)練細(xì)節(jié)
優(yōu)化器:Adam
學(xué)習(xí)率:前 50 epoch 為 1e3,接下來(lái)的 10 epoch 為 1e4,最后的 20 epoch 為 1e6
損失函數(shù):均方誤差 MSE,也就是 L2 Loss
數(shù)據(jù)增益:隨機(jī) resize 和 flip
其他參數(shù):batch_size = 96,時(shí)序窗口為 5,輸入圖片大小 96x96
為啥這里輸入尺寸這么小,在現(xiàn)實(shí)當(dāng)中真的有效嗎?
經(jīng)測(cè)試,是可以去噪的,只是速度慢了一些,大膽猜測(cè)可能是因?yàn)榫W(wǎng)絡(luò)學(xué)習(xí)到了如何識(shí)別噪音= =
在前 60 epoch 迭代的訓(xùn)練中,會(huì)對(duì)卷積核的權(quán)重做 svd 的正交化,這么做的原因是參照了 FFDNet 的經(jīng)驗(yàn),淺淺看了 An Analysis and Implementation of the FFDNet Image Denoising Method 文章中對(duì)這個(gè) trick 的對(duì)比圖,PSNR 值會(huì)有細(xì)微的提升,下面是對(duì)應(yīng)的 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效果評(píng)估
數(shù)據(jù)集:兩個(gè) DAVIS-test 和 Set8
評(píng)估指標(biāo): PSNR
橫向?qū)Ρ?PSNR 指標(biāo)如下圖所示,其中藍(lán)色表示第一,紅色表示第二
從論文中展示圖來(lái)看,簡(jiǎn)直就是小龍女劈腿神雕,雕的一批啊,但我拿實(shí)際的視頻進(jìn)行測(cè)試后發(fā)現(xiàn),效果并沒(méi)有想像中的好,如果要達(dá)到可用的效果的話,可能自己還是需要下不少功夫的
關(guān)于計(jì)算量這塊,我也順便用 torchprofile 評(píng)估了一下網(wǎng)絡(luò)的計(jì)算量,在 720P 下,一幀降噪要 587 G 左右,GoPro 最終在產(chǎn)品使用的網(wǎng)絡(luò)計(jì)算量應(yīng)該不可能會(huì)有這么大
# 衡量計(jì)算量的代碼塊 ... if __name__ == '__main__':from torchprofile import profile_macsmodel_temp = FastDVDnet(num_input_frames=5)model_temp.eval()# 假設(shè)是 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) # 計(jì)算量在 587 G 左右 ...源代碼中提供的是對(duì)于圖片序列的去噪代碼,我用 cv2 實(shí)現(xiàn)了個(gè)讀取視頻輸出視頻的代碼,有需求的朋友可自取,同時(shí)也可以 follow 和 star 我一波。
https://github.com/edvardHua/fastdvdnet/blob/master/run_video_fastdvdnet.py
但文中是在服務(wù)器端的 NVIDIA Titan XP 上進(jìn)行的速度測(cè)試,對(duì)比現(xiàn)有的算法,速度那還是非常快的。
參考文獻(xiàn)
Estimation - https://arxiv.org/pdf/1907.01361.pdf
總結(jié)
以上是生活随笔為你收集整理的[视频降噪] GoPro FastDVDNet 看名字就知道它很快的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 计算机毕业设计ssm吴通智能电子有限公司
- 下一篇: java7 rhino,Java 7 可