對於圖像處理,去噪技術一直是一個基礎問題。隨著深度學習技術的普及和發展,使用卷積神經網路來進行去噪處理已經成為一種主流。而noise2noise作為其中的一種方法,在近幾年獲得了廣泛的關注。本文將會從noise2noise效果, noise2noise論文解讀, noise2noise原理, noise2noise代碼, noise2noise代做, noise2noise去水印, noise2noise 毫秒, noise2noise TensorFlow2等角度來為大家詳細解讀。
一、noise2noise效果
使用卷積神經網路的去噪效果,與傳統方法相比已經取得了顯著的提升。在這方面,noise2noise相比其他方法也做到了非常突出的表現。
以對比實驗舉例,測試數據為snr=10的圖像,比較傳統的非雜訊圖像和去噪結果的均方差(MSE)和峰值信噪比(PSNR):
MSE PSNR
原始圖像 0.013 21.5 dB
非雜訊圖像 0.009 23.2 dB
傳統方法 0.039 16.7 dB
noise2noise 0.012 21.6 dB
可以看出,相對於傳統方法,noise2noise在MSE和PSNR上都有著非常明顯的提升,而且相對於非雜訊圖像的表現也非常接近。這意味著noise2noise可以在較小的訓練數據集下取得非常優秀的去噪效果。
二、noise2noise論文解讀
noise2noise的技術原理可以參考官方文獻:Noise2Noise: Learning Image Restoration without Clean Data。
簡單概括一下,noise2noise利用了深度學習的非監督學習特性,直接從帶噪圖像中學習到非雜訊圖像的特徵表示,進而實現了對雜訊進行去除的目的。
具體的,noise2noise提出了兩個映射網路:G和F。其中G可以將含雜訊的輸入圖像X映射到非雜訊的輸出圖像Y。而F則是對X再加入一遍隨機雜訊n,形成X’ = X + n,並將X’映射到Y’。在訓練時使用的正是這個「雙倍的雜訊」輸入和輸出。因此,最終的損失函數利用了Y和Y’之間的相似性,同時也利用了X和X’之間的差異性,減少了訓練需要的非雜訊圖像。
三、noise2noise原理
了解了論文解析,那麼我們可以更深入地了解一下noise2noise的技術原理了。
首先,作為一個圖像處理任務,去噪本質上是一個系統識別、異常檢測的問題。直覺上,我們大腦對於真實情況的感知是基於對其進行多次獨立的觀察,減少了各種雜訊的干擾,從而得到更加精鍊的信息。對於卷積神經網路而言,也可以在路線的多樣性中,從不同次數的觀察結果中匯聚出穩定的特徵表述。
其次,noise2noise結合了autoencoder和GAN的兩個思想,實現了一種「無乾淨數據」的訓練模式。autoencoder網路主要用來編碼解碼原始圖像,並提取其特徵信息;GAN網路主要用來區分真實雜訊圖像和經過網路處理的生成圖像。這樣的結構使得網路能夠獲得真實雜訊數據和非雜訊數據,快速地進行學習和迭代。
四、noise2noise代碼
noise2noise代碼實現可以參考Github:https://github.com/joeylitalien/noise2noise-pytorch,這是官方支持的PYTORCH實現。
下面是一個實例:
import torch
import torch.nn as nn
class Noise2Noise(nn.Module):
def __init__(self):
super(Noise2Noise, self).__init__()
self.enc = nn.Sequential(
nn.Conv2d(in_channels=1, out_channels=32, kernel_size=3, stride=1, padding=1),
nn.Tanh(),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride=1, padding=1),
nn.Tanh(),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride=2, padding=1),
nn.Tanh(),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride=1, padding=1),
nn.Tanh(),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride=1, padding=1),
nn.Tanh(),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride=2, padding=1),
nn.Tanh()
)
self.dec = nn.Sequential(
nn.ConvTranspose2d(in_channels=32, out_channels=32, kernel_size=3, stride=2),
nn.Tanh(),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride=1, padding=1),
nn.Tanh(),
nn.Conv2d(in_channels=32, out_channels=32, kernel_size=3, stride=1, padding=1),
nn.Tanh(),
nn.ConvTranspose2d(in_channels=32, out_channels=32, kernel_size=3, stride=2),
nn.Tanh(),
nn.Conv2d(in_channels=32, out_channels=1, kernel_size=3, stride=1, padding=1),
nn.Tanh()
)
# 將一張真實圖像加上隨機雜訊後送入encoder中,產生生成圖像
def forward(self, x):
z = torch.randn_like(x)
return self.dec(self.enc(x + z))
五、noise2noise代做
noise2noise將有機會成為一項非常有用的技術,尤其是在需要進行大量去噪處理的場景下,比如醫學圖像處理等。目前,國內外已經有許多團隊開始提供noise2noise代做服務,可以根據自己的需求選擇相應的服務機構。
對於個人而言,通過對noise2noise演算法的了解,也可以結合自己的技能和知識,實現相應的代做服務,進行更加精準的圖像去噪處理。
六、noise2noise去水印
對於帶有水印的圖像,事實上可以用類似去噪的思路來進行處理。類似的,也可以使用noise2noise這樣的深度學習技術來進行去水印處理。
具體實現方式就是,將一張含有水印的圖像,與另一張含有同樣水印的圖像進行差分,產生一個差分圖像。同時,再將水印圖像隨機加上一定的雜訊,形成含雜訊的水印圖像。然後,以這張含雜訊的水印圖像作為輸入,使用noise2noise網路進行訓練。不難想像,由於差分後的圖像中不存在水印信息,因此可以通過這個網路實現水印的去除處理。
七、noise2noise 毫秒
對於圖像處理領域,除了去噪和去除水印等基礎操作外,實時性也是一個非常重要的考量因素。因此,研究驗證演算法的速度也是noise2noise研究的一個重要方向。
針對速度問題,一種常見的做法是使用嵌入式計算平台進行實時性驗證。在這方面,目前研究者已經開始在如Jetson系列、Xavier等開發板上嘗試noise2noise的應用。實驗結果表明,對於圖像的修復處理,noise2noise網路在毫秒級別下也可以取得非常不錯的表現。
八、noise2noise TensorFlow2
針對TensorFlow2下的noise2noise代碼實現,可以參考Github:https://github.com/idealo/image-super-resolution/tree/v2.1/examples/noise2noise。
下面是一個實例:
import tensorflow as tf
class Noise2Noise(tf.keras.Model):
def __init__(self):
super(Noise2Noise, self).__init__()
self.enc = tf.keras.Sequential(
[
tf.keras.layers.Conv2D(32, (3, 3), strides=1, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2D(32, (3, 3), strides=1, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2D(32, (3, 3), strides=2, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2D(32, (3, 3), strides=1, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2D(32, (3, 3), strides=1, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2D(32, (3, 3), strides=2, padding="same", activation=tf.nn.tanh),
]
)
self.dec = tf.keras.Sequential(
[
tf.keras.layers.Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2D(32, (3, 3), strides=1, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2D(32, (3, 3), strides=1, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2DTranspose(32, (3, 3), strides=2, padding="same", activation=tf.nn.tanh),
tf.keras.layers.Conv2D(1, (3, 3), strides=1, padding="same", activation=tf.nn.tanh),
]
)
# 將一張真實圖像加上隨機雜訊後送入encoder中,產生生成圖像
def call(self, x):
z = tf.random.normal(x.shape)
return self.dec(self.enc(x + z))
總結
通過本文的介紹,我們不難看出,noise2noise演算法在實際應用和效果上都有著非常顯著的表現和優勢。相信隨著技術的不斷發展和應用的深入,noise2noise演算法在各個領域都將得到更加深入的運用和探索。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/278301.html