一文教你如何使用自動(dòng)編碼器進(jìn)行圖像去噪
介紹讓我們從理解術(shù)語(yǔ)“圖像去噪”的含義來(lái)開(kāi)始我們的討論,這也是我們的文章標(biāo)題——
圖像去噪是從圖像中去除噪聲的過(guò)程
圖像中存在的噪聲可能是由實(shí)際上難以處理的各種內(nèi)在或外在條件引起的。圖像去噪問(wèn)題是圖像處理和計(jì)算機(jī)視覺(jué)領(lǐng)域的一個(gè)非;镜奶魬(zhàn) 。因此,它在許多領(lǐng)域中發(fā)揮著重要作用,獲取原始圖像對(duì)于魯棒性能非常重要。
讓我們看看存在噪聲的圖像是什么樣子的:
帶有噪聲的圖像示例
因此,在本文中,我們將看到如何使用自動(dòng)編碼器或編碼器-解碼器網(wǎng)絡(luò)從帶有噪聲的圖像中去除噪聲。
在本文中,我將使用深度人工神經(jīng)網(wǎng)絡(luò)實(shí)現(xiàn)自動(dòng)編碼器。我的下一篇文章中,我還將針對(duì)相同的問(wèn)題陳述使用深度卷積神經(jīng)網(wǎng)絡(luò)來(lái)描述自動(dòng)編碼器。所以,試試這個(gè)項(xiàng)目,并在我的下一個(gè)教程中繼續(xù)關(guān)注我們。
現(xiàn)在,讓我們也看看去除噪聲后圖像的外觀:
對(duì)頑皮狗圖像進(jìn)行降噪之前和降噪之后
現(xiàn)在,讓我們通過(guò)了解一些關(guān)于自動(dòng)編碼器的基本概念來(lái)開(kāi)始我們的討論。
編碼器-解碼器網(wǎng)絡(luò)(自動(dòng)編碼器)概述自編碼器是一種無(wú)監(jiān)督的人工神經(jīng)網(wǎng)絡(luò),經(jīng)過(guò)訓(xùn)練可以將其輸入復(fù)制到輸出。對(duì)于圖像數(shù)據(jù),自動(dòng)編碼器將首先將圖像編碼為低維表示,然后將該表示解碼回圖像。編碼器-解碼器包含以下兩種結(jié)構(gòu):編碼器 - 該網(wǎng)絡(luò)將數(shù)據(jù)下采樣到較低的維度。解碼器 -該網(wǎng)絡(luò)從較低維度的表示中重建原始數(shù)據(jù)。較低維度(即編碼器網(wǎng)絡(luò)的輸出)表示通常稱為 潛在空間表示。關(guān)于自動(dòng)編碼器,我們必須記住的一件事是,它們只能壓縮與它們接受過(guò)訓(xùn)練的數(shù)據(jù)相似的數(shù)據(jù)。它們本質(zhì)上也是有損的,這意味著相對(duì)于原始輸入,輸出將降級(jí)。
它們通過(guò)反向傳播進(jìn)行類似于人工神經(jīng)網(wǎng)絡(luò)的訓(xùn)練。
讓我們開(kāi)始吧!!加載必要的庫(kù)
第一步是加載必要的 Python 庫(kù)。我們將導(dǎo)入諸如numpy 之類的庫(kù),用于優(yōu)化矩陣乘法,matplotlib用于數(shù)據(jù)可視化,例如繪制圖像。來(lái)自 Keras 的序列模型為我們提供了一個(gè)空的架構(gòu),根據(jù)我們的架構(gòu),我們將在其中添加幾個(gè)全連接層,Dense在我們的網(wǎng)絡(luò)中創(chuàng)建全連接層,直接從Keras導(dǎo)入MNIST數(shù)據(jù)集。
import numpy
import matplotlib.pyplot as plt
from keras.models import Sequential
from keras.layers import Dense
from keras.datasets import mnist
現(xiàn)在,我們完成了導(dǎo)入必要庫(kù)的第一步,讓我們繼續(xù)以 numpy 的形式加載數(shù)據(jù)集。
以 Numpy 格式加載數(shù)據(jù)集
在本文中,我們將使用 MNIST 數(shù)據(jù)集,這是一個(gè)簡(jiǎn)單的計(jì)算機(jī)視覺(jué)數(shù)據(jù)集。它由灰度形式的手寫數(shù)字圖像組成。它還包括每個(gè)圖像的標(biāo)簽,告訴我們它是哪個(gè)數(shù)字(即每個(gè)圖像的輸出)。這意味著我們手中有一個(gè)標(biāo)記數(shù)據(jù)可以使用。MNIST 數(shù)據(jù)集中的每個(gè)圖像都是 28 x 28 像素。
讓我們看看 MNIST 數(shù)據(jù)集中的一些圖像:
我們將把我們的 MNIST 數(shù)據(jù)分成兩部分:
訓(xùn)練數(shù)據(jù)集: 60,000 個(gè)數(shù)據(jù)點(diǎn)屬于訓(xùn)練數(shù)據(jù)集
測(cè)試數(shù)據(jù)集: 10,000 個(gè)數(shù)據(jù)點(diǎn)屬于測(cè)試數(shù)據(jù)集
(X_train, y_train), (X_test, y_test) = mnist.load_data()
輸出:
讓我們借助以下代碼行來(lái)看看我們的 NumPy 數(shù)組的形狀:
X_train.shape
輸出:
(60000, 28, 28)
上面的輸出表明我們有 60,000 張訓(xùn)練圖像,每張圖像由 28 x 28 像素組成。
X_test.shape
輸出:
(10000, 28, 28)
上面的輸出表明我們有 10,000 個(gè)測(cè)試圖像,每個(gè)圖像由 28 x 28 像素組成。將圖像繪制為灰度圖像現(xiàn)在,到上述部分,我們將加載完整的數(shù)據(jù)集,并將其分為訓(xùn)練集和測(cè)試集。因此,在本節(jié)中,我們將使用matplotlib庫(kù)繪制一些我們的數(shù)據(jù)集圖像,具體而言,我們使用的是matplotlib庫(kù)的 subplot 函數(shù)同時(shí)繪制多個(gè)圖像。
plt.subplot(221)
plt.imshow(X_train[0], cmap=plt.get_cmap('gray'))
plt.subplot(222)
plt.imshow(X_train[1], cmap=plt.get_cmap('gray'))
plt.subplot(223)
plt.imshow(X_train[2], cmap=plt.get_cmap('gray'))
plt.subplot(224)
plt.imshow(X_train[3], cmap=plt.get_cmap('gray'))
# show the plot
plt.show()
輸出:
格式化 Keras 數(shù)據(jù)我們可以將二維圖像數(shù)組展平為28×28=784 個(gè)數(shù)字的向量。只要我們?cè)趫D像之間保持一致,這與我們?nèi)绾握蛊疥嚵袩o(wú)關(guān)。從這個(gè)角度來(lái)看,MNIST 圖像只是784 維向量空間中的一堆點(diǎn) 。但數(shù)據(jù)應(yīng)始終采用“ (數(shù)據(jù)點(diǎn)數(shù),數(shù)據(jù)點(diǎn)維度)”格式。在這種情況下,訓(xùn)練數(shù)據(jù)的格式為60,000×784。
num_pixels = X_train.shape[1] * X_train.shape[2]
X_train = X_train.reshape(X_train.shape[0], num_pixels).a(chǎn)stype('float32')
X_test = X_test.reshape(X_test.shape[0], num_pixels).a(chǎn)stype('float32')
X_train = X_train / 255
X_test = X_test / 255
讓我們借助以下幾行代碼再次看看我們的 NumPy 數(shù)組的形狀:
X_train.shape
輸出:
(60000, 784)
X_test.shape
輸出:
(10000, 784)
給圖像添加噪點(diǎn)在解決問(wèn)題陳述時(shí),我們必須記住我們的目標(biāo)是制作一個(gè)能夠?qū)D像執(zhí)行噪聲去除的模型。為了能夠做到這一點(diǎn),我們將使用現(xiàn)有圖像并給它們添加隨機(jī)噪聲。在這里,我們將原始圖像作為輸入,我們將噪聲圖像作為輸出,我們的模型(即自動(dòng)編碼器)將學(xué)習(xí)干凈圖像和噪聲圖像之間的關(guān)系,并學(xué)習(xí)如何清理噪聲圖像。因此,讓我們創(chuàng)建 MNIST 數(shù)據(jù)集的噪聲版本,并將其作為解碼器網(wǎng)絡(luò)的輸入。我們首先定義一個(gè)噪聲因子,它是一個(gè)超參數(shù)。噪聲因子乘以均值為 0.0 且標(biāo)準(zhǔn)差為 1.0 的隨機(jī)矩陣。該矩陣將從正態(tài)(高斯)分布中抽取樣本。在添加噪聲時(shí),我們必須記住正態(tài)隨機(jī)數(shù)組的形狀與你將添加噪聲的數(shù)據(jù)的形狀類似。
noise_factor = 0.2
x_train_noisy = X_train + noise_factor * numpy.random.normal(loc=0.0, scale=1.0, size=X_train.shape)
x_test_noisy = X_test + noise_factor * numpy.random.normal(loc=0.0, scale=1.0, size=X_test.shape)
x_train_noisy = numpy.clip(x_train_noisy, 0., 1.)
x_test_noisy = numpy.clip(x_test_noisy, 0., 1.)
看到上面的代碼,你可能會(huì)想,這里為什么要用這個(gè)clip函數(shù)呢?為了確保我們最終的圖像數(shù)組項(xiàng)值在 0 到 1 的范圍內(nèi),我們可以使用**np.clip ** 方法。clip 是numpy的函數(shù),用于剪輯min - max范圍之外的值,并用指定的最小或最大值替換它們。
讓我們看看噪聲圖像是什么樣子的:
手寫數(shù)字的噪聲圖像定義編碼器-解碼器網(wǎng)絡(luò)它將有一個(gè) 784 個(gè)神經(jīng)元的輸入層,因?yàn)槲覀兊膱D像大小為 784,因?yàn)榇嬖?28 x 28 個(gè)像素(即我們有 784 個(gè)神經(jīng)元的輸入維度和輸出層)。
# create model
model = Sequential()
model.a(chǎn)dd(Dense(500, input_dim=num_pixels, activation='relu'))
model.a(chǎn)dd(Dense(300, activation='relu'))
model.a(chǎn)dd(Dense(100, activation='relu'))
model.a(chǎn)dd(Dense(300, activation='relu'))
model.a(chǎn)dd(Dense(500, activation='relu'))
model.a(chǎn)dd(Dense(784, activation='sigmoid'))
編譯模型一旦定義了模型,我們就必須編譯它。在編譯時(shí),我們提供要使用的損失函數(shù)、優(yōu)化器和任何指標(biāo)。對(duì)于我們的問(wèn)題陳述,我們將為我們的模型使用Adam 優(yōu)化器和均方誤差。
# Compile the model
model.compile(loss='mean_squared_error', optimizer='adam')
訓(xùn)練或擬合模型現(xiàn)在模型已準(zhǔn)備好接受訓(xùn)練。我們將向網(wǎng)絡(luò)提供訓(xùn)練數(shù)據(jù)。此外,我們將指定驗(yàn)證數(shù)據(jù),僅在其上驗(yàn)證模型。
# Training model
model.fit(x_train_noisy, X_train, validation_data=(x_test_noisy, X_test), epochs=2, batch_size=200)
輸出:
在這里,我們只運(yùn)行我們的模型兩個(gè)時(shí)期,但你可以根據(jù)你的問(wèn)題陳述更改此數(shù)字。你能想出當(dāng)我們改變時(shí)期數(shù)量時(shí)會(huì)發(fā)生什么嗎?請(qǐng)考慮一下,將在文章的最后解釋這一點(diǎn)。
評(píng)估模型最后,我們將在測(cè)試數(shù)據(jù)集上評(píng)估我們的訓(xùn)練模型,該數(shù)據(jù)集是我們?cè)诩虞d數(shù)據(jù)集的部分中創(chuàng)建的。
# Final evaluation of the model
pred = model.predict(x_test_noisy)
pred.shape
輸出:
(10000, 784)
X_test.shape
輸出:
(10000, 784)
X_test = numpy.reshape(X_test, (10000,28,28)) *255
pred = numpy.reshape(pred, (10000,28,28)) *255
x_test_noisy = numpy.reshape(x_test_noisy, (-1,28,28)) *255
plt.figure(figsize=(20, 4))
print("Test Images")
for i in range(10,20,1):
plt.subplot(2, 10, i+1)
plt.imshow(X_test[i,:,:], cmap='gray')
curr_lbl = y_test[i]
plt.title("(Label: " + str(curr_lbl) + ")")
plt.show()
plt.figure(figsize=(20, 4))
print("Test Images with Noise")
for i in range(10,20,1):
plt.subplot(2, 10, i+1)
plt.imshow(x_test_noisy[i,:,:], cmap='gray')
plt.show()
plt.figure(figsize=(20, 4))
print("Reconstruction of Noisy Test Images")
for i in range(10,20,1):
plt.subplot(2, 10, i+1)
plt.imshow(pred[i,:,:], cmap='gray')
plt.show()
輸出:
在上面的輸出中,圖像:
第一行是原始測(cè)試圖像,
第二行是嘈雜的圖像,
第三行用于清理(重建)圖像。
查看清理后的圖像如何與原始圖像相似。
但是如果你仔細(xì)觀察重建的圖像,那么它可能會(huì)顯得有些模糊。那么你能不能想出一些可能的原因! 為什么這些圖像在解碼器網(wǎng)絡(luò)的輸出中變得模糊。重建圖像中出現(xiàn)這種模糊的可能原因之一是在訓(xùn)練我們的模型時(shí)使用較少的 epoch。因此,現(xiàn)在你的任務(wù)是增加時(shí)期數(shù)的值,然后再次觀察這些圖像并與這些圖像進(jìn)行比較。
如果我們想在一張圖中總結(jié)整個(gè)過(guò)程,下圖是最好的。
我們的實(shí)現(xiàn)到此結(jié)束!
在本教程中,你已經(jīng)構(gòu)建了一個(gè)自動(dòng)編碼器模型,該模型可以成功清除之前從未見(jiàn)過(guò)的噪聲圖像(我們使用了測(cè)試數(shù)據(jù)集)。顯然,這些圖像中存在一些未恢復(fù)的失真。然而,如果你考慮噪聲圖像的變形程度,我們可以說(shuō)我們的模型在恢復(fù)失真圖像方面非常成功。
你可以考慮擴(kuò)展這個(gè)自動(dòng)編碼器并將其嵌入到照片增強(qiáng)應(yīng)用程序中,這可以增加照片的清晰度。

發(fā)表評(píng)論
請(qǐng)輸入評(píng)論內(nèi)容...
請(qǐng)輸入評(píng)論/評(píng)論長(zhǎng)度6~500個(gè)字
最新活動(dòng)更多
-
3月27日立即報(bào)名>> 【工程師系列】汽車電子技術(shù)在線大會(huì)
-
4月30日立即下載>> 【村田汽車】汽車E/E架構(gòu)革新中,新智能座艙挑戰(zhàn)的解決方案
-
5月15-17日立即預(yù)約>> 【線下巡回】2025年STM32峰會(huì)
-
即日-5.15立即報(bào)名>>> 【在線會(huì)議】安森美Hyperlux™ ID系列引領(lǐng)iToF技術(shù)革新
-
5月15日立即下載>> 【白皮書】精確和高效地表征3000V/20A功率器件應(yīng)用指南
-
5月16日立即參評(píng) >> 【評(píng)選啟動(dòng)】維科杯·OFweek 2025(第十屆)人工智能行業(yè)年度評(píng)選
推薦專題
- 1 UALink規(guī)范發(fā)布:挑戰(zhàn)英偉達(dá)AI統(tǒng)治的開(kāi)始
- 2 北電數(shù)智主辦酒仙橋論壇,探索AI產(chǎn)業(yè)發(fā)展新路徑
- 3 降薪、加班、裁員三重暴擊,“AI四小龍”已折戟兩家
- 4 “AI寒武紀(jì)”爆發(fā)至今,五類新物種登上歷史舞臺(tái)
- 5 國(guó)產(chǎn)智駕迎戰(zhàn)特斯拉FSD,AI含量差幾何?
- 6 光計(jì)算迎來(lái)商業(yè)化突破,但落地仍需時(shí)間
- 7 東陽(yáng)光:2024年扭虧、一季度凈利大增,液冷疊加具身智能打開(kāi)成長(zhǎng)空間
- 8 地平線自動(dòng)駕駛方案解讀
- 9 封殺AI“照騙”,“淘寶們”終于不忍了?
- 10 優(yōu)必選:營(yíng)收大增主靠小件,虧損繼續(xù)又逢關(guān)稅,能否乘機(jī)器人東風(fēng)翻身?