如何在信号中添加指定信噪比的高斯白噪声,为何深度学习去噪研究采用高斯白噪声?
在信號或者圖像的降噪研究中,很多學(xué)者采用高斯白噪聲添加到干凈的樣本中,來模擬含有噪聲的樣本,并以此來驗(yàn)證提出模型的降噪效果(比如降噪自編碼器——Denoising Autoencoder)。有一次投稿,一個(gè)審稿人問為什么采用高斯白噪聲? 如何保證添加噪聲后,樣本有指定的信噪比(Signal to Noise Ratio)?
對于第一個(gè)問題,我自己一時(shí)回答不上來,于是就去網(wǎng)上查找資料。我相信這兩個(gè)問題也是初次接觸降噪研究的人需要了解的,所以將這兩個(gè)問題的答案記錄如下,首先我們來回答第二個(gè)問題。
1、如何在樣本中添加噪聲,使樣本具有指定的信噪比
1.1 合成具有指定信噪比的噪聲樣本
首先,我們要知道信噪比的定義。信噪比是指信號功率和噪聲功率比值的對數(shù),如下式所示:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
通常,我們獲取的信號是離散的,而且可以直接計(jì)算信號的功率。假設(shè)我們有一離散信號為 S= {s1, s2, ..., sn},那么,可以計(jì)算出信號功率 P_signal 為:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
有了信號功率后,假如我們想要添加完噪聲后樣本的信噪比為SNR(比如-2 dB,0 dB ...),那么,我們可以通過這兩者計(jì)算出噪聲的功率:
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
獲得噪聲的功率之后,我們可以先生成一個(gè)標(biāo)準(zhǔn)高斯分布(均值為0,標(biāo)準(zhǔn)差為1)的噪聲序列(和信號長度一樣),然后再通過轉(zhuǎn)換得到我們最終想要的高斯噪聲。在Python程序中,通過Numpy.random 的randn,我們可以生成一個(gè)標(biāo)準(zhǔn)高斯分布序列(在matlab 中也是如此,用 randn 函數(shù)產(chǎn)生標(biāo)準(zhǔn)正態(tài)分布)。接下來,我們用python 程序來說明獲得我們想要的噪聲的過程。
import numpy as np def gen_gaussian_noise(signal,SNR):""":param signal: 原始信號:param SNR: 添加噪聲的信噪比:return: 生成的噪聲"""noise=np.random.randn(*signal.shape) # *signal.shape 獲取樣本序列的尺寸noise=noise-np.mean(noise)signal_power=(1/signal.shape[0])*np.sum(np.power(signal,2))noise_variance=signal_power/np.power(10,(SNR/10))noise=(np.sqrt(noise_variance)/np.std(noise))*noisereturn noise我們用程序來驗(yàn)證一下,假設(shè)我們有一個(gè)樣本,樣本為正弦波形,總共包含2000個(gè)點(diǎn):
x=np.linspace(1,6,2000) signal=np.sin(x)我們在該樣本上添加高斯噪聲,使得添加噪聲后的樣本的信噪比為-2 dB,程序如下:
noise = gen_gaussian_noise(signal,-2)獲得我們想要的噪聲之后,合成含噪樣本也很簡單,直接將原始信號和噪聲相加即可:
noisy_signal=signal+noise至此,我們已經(jīng)合成了信噪比為 -2 dB 的含噪樣本。
1.2 驗(yàn)證噪聲樣本的信噪比
在上文中,我們已經(jīng)合成了信噪比為 -2 dB 的正弦信號,接下來我們來驗(yàn)證一下,合成信號的信噪比是否確實(shí)為 -2 dB:
def check_snr(signal,noise):""":param signal: 原始信號:param noise: 生成的高斯噪聲:return: 返回兩者的信噪比"""signal_power=(1/signal.shape[0])*np.sum(np.power(signal,2))# 0.5722037noise_power=(1/noise.shape[0])*np.sum(np.power(noise,2)) # 0.90688SNR=10*np.log10(signal_power/noise_power)return SNRSNR= check_snr(signal,noise) print (SNR) # 輸出 -1.999999999999991 dB,由于計(jì)算機(jī)數(shù)值計(jì)算的問題,存在極小的誤差。可以看出,生成的噪聲符合我們的要求。
?
2 為什么降噪研究采用高斯白噪聲?
關(guān)于這部分的問題,我覺得知乎上的?Bihan Wen 的回答非常具有參考價(jià)值,下文均引自他的回答,原鏈接如下:https://www.zhihu.com/question/67938028
謝邀。這個(gè)問題很好,我認(rèn)為做降噪的同學(xué)都應(yīng)該思考一下。
然而,我覺得已有的回答沒有答到這個(gè)問題的本質(zhì)。我認(rèn)為題主的問題,需要通過以下三個(gè)子問題來說明:
為什么要做仿真噪音synthetic noise的實(shí)驗(yàn)?在所有的synthetic noise里,為什么大家都用高斯白噪聲,而不太常用其他distribution的噪聲?基于synthetic noise,比如高斯噪音的算法,可以適用于真實(shí)噪音嗎?
以下回答,我盡量不引用論文,不安利自己的工作,先說結(jié)論,后說論據(jù),以方便閱讀。
問題一:Why synthetic noise?
先說結(jié)論:相對于real noise,用synthetic noise的好處是便于分析問題/設(shè)計(jì)算法,便于量化和評價(jià)算法效果。
便于對降噪問題的分析/算法的設(shè)計(jì):降噪的本質(zhì)是對數(shù)據(jù)本身的重建,以起到排除污染(corruption)的作用。這里面涉及到需要對(1)數(shù)據(jù),(2)污染(噪音)的模型和分析。數(shù)據(jù)的模型就是我們一般常用的那些,比如稀疏表達(dá)(sparse coding),統(tǒng)計(jì)(probabilistic),低秩(low-rankness),collaborative filtering之類的。這些都是基于一定的數(shù)學(xué)假設(shè)。說穿了,事實(shí)上沒不存在對數(shù)據(jù)100%精確的model,或者所謂的true model。再來說噪音模型,我們一般把noise這種污染定義為一個(gè)additive或者multiplicative的隨機(jī)變量。那么這個(gè)隨機(jī)變量的隨機(jī)分布是什么?如果知道了這個(gè),我們就可以設(shè)計(jì)出對應(yīng)的合理的算法。
那么如果是real noise,他是什么分布呢?沒有人知道,因?yàn)閞eal就意味著未知。噪音可以是unstructured的,也可以是structured的。real的數(shù)據(jù)里面的噪音,可以是consistent的,也可以是變動的。甚至一幅圖,一個(gè)視頻里的real noise在不同位置都是不一樣的。那這種情況下的問題分析就是極難的,或者說這個(gè)問題本身就是untrackable的,not well defined的。
所以科研或者工程設(shè)計(jì)里面,都會對這類問題做出合理的假設(shè),比如這里的:噪音是高斯白噪聲。基于這個(gè)假設(shè)再來分析問題。
便于量化和評價(jià)算法效果:評價(jià)一個(gè)降噪算法的效果,需要采用一定的評價(jià)標(biāo)準(zhǔn)(metric)。我們一般把評價(jià)標(biāo)準(zhǔn)分為客觀(objective)和主觀(subjective)的:
客觀標(biāo)準(zhǔn)很好理解:給我一個(gè)數(shù)學(xué)計(jì)算方式,算出這個(gè)降噪過后的數(shù)據(jù),到底有多好。這樣做清晰明了,一般沒有什么好爭議的。常見的這樣的metric有Peak Signal-to-Noise Ratio (PSNR),Mean Square Error(MSE),Structured Similarity(SSIM),等等。你經(jīng)常可以在降噪論文里面看到這三個(gè)家伙的身影。他們這些metric的絕對數(shù)值的高低,直觀地反應(yīng)方法效果的好壞。
雖然我知道也有一些工作,試著propose一些不需要ground truth的objective quality metric,但最常用的這類經(jīng)典metric無一例外地需要圖片的無噪音真實(shí)值(ground truth)作為參考。如果你是使用仿真噪音,你自然是有g(shù)round truth的。但如果是真實(shí)噪音,你確一般不知道ground truth是什么。
所以一般對于真實(shí)噪音的降噪實(shí)驗(yàn),我們都只好算法一些subjective的metric:讓人眼來辨認(rèn)降噪出來的圖效果是否好。這不同的人,可能對圖的喜好也會不一樣,這樣就經(jīng)常會產(chǎn)生評價(jià)的個(gè)體差異,產(chǎn)生爭議。就算想要組織一大批人來做測試,成本會很高,不利于科研的高效性。
問題二:Why Gaussian noise?
先說結(jié)論:相比于其他的synthetic noise distribution,高斯噪音確實(shí)有他的合理性。在真實(shí)噪音的噪音源特別復(fù)雜的時(shí)候,高斯噪音可能算是最好的對真實(shí)噪音的模擬。
其實(shí)不光是深度學(xué)習(xí)的降噪算法,傳統(tǒng)方法(好吧,自從有了深度學(xué)習(xí)以后,什么sparse coding,GMM,low-rank,collaborative filtering都變成傳統(tǒng)方法了...)也大多喜歡用高斯白噪聲來做仿真實(shí)驗(yàn)。那么大家不約而同地都玩兒高斯噪音可能有背后的原因。我覺得這個(gè)可能才是題主最關(guān)心的問題。
那這里的答案就是,采用高斯噪音,是為了更好地模擬未知的真實(shí)噪音:在真實(shí)環(huán)境中,噪音往往不是由單一源頭造成的,而是很多不同來源的噪音復(fù)合體。假設(shè),我們把真實(shí)噪音看成非常多不同概率分布的隨機(jī)變量的加合,并且每一個(gè)隨機(jī)變量都是獨(dú)立的,那么根據(jù)Central Limit Theorem,他們的normalized sum就隨著噪音源數(shù)量的上升,趨近于一個(gè)高斯分布。
基于這種假設(shè)來看,采用合成的高斯噪音,是在處理這種復(fù)雜,且不知道噪音分布為何的情況下,一個(gè)既簡單又不差的近似仿真。
問題三:Can it work for real noise?
先說結(jié)論:在高斯噪音試驗(yàn)下效果的算法,不一定在真實(shí)噪音下效果也同樣地好。這個(gè)要看真實(shí)噪音具體長啥樣,還要看算法本身的設(shè)計(jì)是否對噪音分布有一定的魯棒性。
在搞清楚了問題一和二之后,相信問題三應(yīng)該就很好理解了:因?yàn)镚aussian noise只是對real noise的一個(gè)近似和仿真,沒有任何的保證說,設(shè)計(jì)的算法在處理real noise的時(shí)候就一定要表現(xiàn)得同樣得好。但由于問題二我們講了,Gaussian noise test有一定的合理性,所以這類算法在real noise的情況下都會有一定的降噪功用。
最近有一些新的數(shù)據(jù)庫,包括了真實(shí)噪音圖片以及他們捕捉到的ground truth。我認(rèn)為這類數(shù)據(jù)庫將會帶來一波專注于真實(shí)噪音除去的工作。
最后再來說說深度學(xué)習(xí),在降噪問題上的特殊性:
深度學(xué)習(xí)之類算法,模型本身是高度data-driven,而不是rule-based的。換句話說,深度學(xué)習(xí)算法的設(shè)計(jì),或者說網(wǎng)絡(luò)結(jié)構(gòu)的設(shè)計(jì),并不強(qiáng)烈依賴于噪音的概率分布。這對于降噪算法的generalization是很好的。
然而這并不是說,深度學(xué)習(xí)的降噪算法,是對所有噪音類型通吃的。深度學(xué)習(xí)算法一般需要supervised training。這樣在訓(xùn)練數(shù)據(jù)上的選擇,確實(shí)往往依賴于噪音的概率分布:如果我們要做Gaussian noise removal,那訓(xùn)練數(shù)據(jù)就應(yīng)該是添加了Gaussian noise的結(jié)果。那么如果我們要做真實(shí)噪音的denoising,要怎么準(zhǔn)備訓(xùn)練數(shù)據(jù)?你的訓(xùn)練數(shù)據(jù)的噪音分布,和你的測試數(shù)據(jù)是一樣的嗎?這些都沒有保證,或者說不一定說是consistent的。
但是我個(gè)人看法是,可能相對于傳統(tǒng)方法而言,深度學(xué)習(xí)算法在從一種特定噪音的處理,generalize到未知噪音,魯棒性應(yīng)該會更高。雖然沒有理論上的證明(深度學(xué)習(xí)上搞這種證明,臣妾確實(shí)辦不到...),我們近期的工作也證實(shí)了這一點(diǎn)。這一段都是私貨,如果有其他大神有對這個(gè)更好的看法,歡迎討論。
?
3、在樣本中添加真實(shí)的噪聲
假如你想在樣本中添加真實(shí)的噪聲,但是你又沒有條件做這樣的實(shí)驗(yàn),或者說由于噪聲的復(fù)雜性,你做的實(shí)驗(yàn)同行未必認(rèn)可。實(shí)際上,在工業(yè)界有標(biāo)準(zhǔn)的噪聲庫,比如NOISEX-92,其中帶有白噪聲、辦公室噪聲、工廠噪聲、汽車噪聲、坦克噪聲等等,在研究中也可以選用合適的噪聲疊加到信號中去,但是噪聲的采樣頻率與信號的采樣頻率往往不一致,需要采樣頻率的校準(zhǔn)。具體的方法請參考這篇文章。
總結(jié)
以上是生活随笔為你收集整理的如何在信号中添加指定信噪比的高斯白噪声,为何深度学习去噪研究采用高斯白噪声?的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十三章 RISC精简指令计算机
- 下一篇: 开关电源空载吱吱声_导致开关电源啸叫的六