當前位置:
首頁 > 知識 > 教你在真實圖像數據上應用線性濾波器

教你在真實圖像數據上應用線性濾波器

本文為 AI 研習社編譯的技術博客,原標題 Learning to perform linear filtering using natural image data,作者為 Josef Taher 。

翻譯 | 張澤坤 王霏 校對 | 餘杭 整理 | MY

卷積神經網路通常從訓練數據中學習有用的特徵。第一個卷積層學習到的特徵往往是視任務而定的一些訓練數據的基本元素。例如,在圖像數據中,學習到的特徵可以體現邊緣和斑點。在後續的網路層中,這些學習到的特徵可以表現更加抽象,更高級的特點。

將學習到的特徵以及它們隨時間的變化可視化,可以提供一些關於網路如何學習的有效信息。實際上,網路結構遠遠不僅是幾層網路那麼簡單,大量的卷積核使得直觀解釋和分析學習到的特徵變得十分困難。

然而,我們可以通過對照實驗證明卷積核的權重是如何隨著網路的學習而實時發展。由於網路應該學習到的特點已經被提前知道,即產生數據的過程和參數是被完全定義並且完全在我們的掌控之中,學習任務可以很容易的被確定。我們可以通過構建一個非常簡單的單層卷積網路並訓練它利用多種核進行線性濾波來實現上述過程。

在接下來的實驗中,我們在數據集上運用一種圖像處理和計算機視覺中常用的傳統邊緣檢測方式——Sobel 邊緣濾波,並訓練我們的模型進行類似的線性映射。我們也嘗試著利用比 Sobel 濾波器更大一些的核去學習一些形式更為普通和任意的濾波器。

這些可以幫我們感受神經網路中的卷積層如何對輸入數據進行操作,卷積核的權重在訓練中如何變化以及神經網路的訓練是如何被視為最小化問題的。

首先,我們必須用線性濾波器去處理圖像數據 X 來獲取原始圖像濾波後的結果 Y。線性濾波器操作可以被總結為如下形式:

對任何一組參數 (卷積核) 或我們所能想到的輸入數據,線性濾波器都具有良好定義的操作。

我們現在可以構造一個單層,單核的近似線性濾波的卷積神經網路。在線性濾波器和卷積神經網路這兩種方式中發生的計算除了我們要從數據中學習到的卷積核參數外是完全一樣的。

我們可以畫出如下的線性濾波器與卷積神經網路間的聯繫:

學習任務可以被轉化為最小化線性濾波器的輸出與卷積神經網路的輸出的均方誤差的最小化問題:

處理圖像數據的線性濾波器的參數被稱為卷積核。我們的實驗採用稱為 Sobel 運算元的 3 x 3 的卷積核來對圖像數據進行濾波,操作順序為先沿 x 方向再沿 y 方向。Sobel 運算元為:

我們使用基於 TensorFlow 的 Keras 框架實現這些實驗。


x 方向上的 Sobel 濾波器

首先,我們需要定義一組輔助函數來對圖像進行預處理。數據集被載入後,圖像被轉換成灰度形式,圖像強度範圍被歸一化然後對數據集中的每個圖像進行線性濾波。

城市和自然景觀類的數據來作為訓練和測試數據 - 數據集(Oliva, A. & Torralba, A. (2001).Modeling the Shape of the Scene: A Holistic Representation of the Spatial Envelope)(http://cvcl.mit.edu/Papers/IJCV01-Oliva-Torralba.pdf)由麻省理工學院麻省理工學院計算視覺認知實驗室收集整理。

原始的數據集包括八個類別的自然景觀的彩色圖像(解析度: 256 x 256)。我們從中選取街道,城市中心以及高層建築三個類別進行使用。這樣,我們就獲得了充足的固定大小的訓練集和測試集(764 個訓練集樣本和 192 個測試集樣本),因此訓練不會發生過擬合併且可以在更加合適的硬體和時間框架中完成。選定的三個分類是自然景觀(大量的人類建築物)中具有明顯邊緣的代表,便於我們比較結果。

接下來,我們可以可視化的觀察數據集中原始圖像、經過灰度轉換後的圖像以及 Sobel 濾波後的圖像:

原始圖像(左),灰度圖像(中間)以及在 x 方向上進行 Sobel 濾波後的圖像(右)。

我們僅對單通道圖像使用線性濾波器。實際上,這意味著模型被訓練成將灰度轉換後的圖像到 Sobel 過濾後的圖像的映射。

接下來,我們定義一個模型:單層,單核的線性激活的卷積網路。例如採用 identity 激活函數。卷積核的大小設定為 3 x 3,以便於與 Sobel 濾波器的尺寸兼容。

利用使用 Nesterov 動量的隨機梯度下降的優化器模型進行 100 輪的訓練。在每一輪中,卷積層的權重都被保存以便進一步的可視化。

在訓練結束後,我們可以畫出訓練和驗證的損失值來觀察訓練是否過擬合。

訓練過程中的訓練損失和驗證損失是平穩的,模型看上去似乎是收斂的。

每個輪次保存的權重以數值矩陣的方式呈現出來,矩陣中的數值代表了像素的灰度值。聲明了用於進行可視化的函數,並為每個輪次創建了可視化功能。

現在我們可以可視化每一個輪次,能夠為每一個輪次創建一個動圖,觀察權重是如何下降的。

模型的卷積層權重被訓練後,權重值收斂到接近 x 方向上的 Sobel 運算元。

在模型的學習過程中,通過動圖可以清晰的看到卷積核權重值組建收斂至 x 方向上的 Sobel 濾波器。前 10 到 15 個輪次的收斂很快,這之後,收斂率很快穩定下來。如果我們在本次實驗中使用了比線性濾波器更加複雜的學習任務,我們仍然能看到類似的行為。卷積核的值會收斂到最優的參數值從而能夠從數據中學習到有用的特徵。在本次實驗中,有用的特徵是由 Sobel 操作器提供的圖像 x 方向上的邊緣信息。我們能夠找到幾乎精準的,由第一手訓練數據產生的卷積核參數,大部分原因是因為我們設置的問題非常簡單。但是在現實問題中,這是極少可能發生的,因為訓練數據不是典型的從輸入到輸出的線性映射。

為了測試模型,我們可以對比模型的預測結果與 x 方向上的 Sobel 濾波器。

左邊是模型的輸出,右邊是同一幅圖像上,x 方向的 Sobel 濾波器的結果。

在圖的上方,我們可以同時觀察到模型的輸出和 x 方向上 Sobel 運算元的結果。通過觀察可以發現兩幅圖像看上去很相似。事實上,兩幅圖像在像素灰度值上僅能發現很細微的差異,因為訓練過的卷積核參數已經收斂到接近原始 Sobel 運算元的值了。


y 方向上的 Sobel 操作器

同樣的代碼也可以被用到與 y 方向的 Sobel 運算元進行線性濾波。我們要做的就是改變圖像濾波函數用 y 方向上的濾波取代 x 方向,再次載入和濾波訓練數據,同時用新數據訓練模型。

在下方圖中,我們可以觀察到,Sobel 濾波器現在更加強調圖像在豎直方向上的圖像灰度邊緣。

原始圖像(左側),灰度圖像(中間)和 y 方向上的 Sobel 濾波圖像(右側)

我們能夠再一次的觀察到卷積核的權重逐步趨向 y 方向的 Sobel 濾波器,隨著網路不斷的從訓練數據中學習。這個收斂行為與之前 x 方向的 Sobel 運算元非常接近。

模型訓練卷積層權重的過程,權重值收斂到接近於 y 方向上的 Sobel 運算元。

相類似的,下方的圖是在同一測試圖像上模型的輸出結果和 Sobel 濾波器的版本,有著相同的形狀。從人眼角度,不可能區分這兩個圖像的差別。

模型的輸出(左邊)和相同圖像 y 方向 Sobel 濾波器的結果(右邊)


笑臉濾波器

之前學習的 Sobel 濾波器非常的簡單,僅需要學習非常少量的參數。現在我們看一下我們能不能學習一個有著更大卷積核的濾波器。

這個濾波器核在接下來的實驗中將會被用在一個 32 x 32 像素的笑臉圖像上。這個濾波器被載入進來,訓練數據通過笑臉濾波器濾波灰度圖像得到。由於濾波核的尺寸很大,實質上核已經擴展到了圖像的外面。圖像的邊界通過補 0 操作抵消由於卷積操作導致的圖像解析度的降低。

歸一化的笑臉濾波器核

在下方圖中,我們可以看到一個濾波後的笑臉圖像與原始圖像以及灰度圖像的區別。

原始圖像(左側),灰度圖像(中間)笑臉濾波圖像(右側)。

我們的方法再次使用了一個簡單的層,單個核的卷積神經網路,其中激活函數也是一樣的。這次,我們設根據笑臉濾波器核的尺寸設置卷積核核的大小是 32 x 32。作為之前實驗的增強版本,我們用更加強大的 Adam 優化器替換隨機梯度下降優化器。

這個模型被訓練了 100 次,在每個輪次中卷積核參數都被保存了下來。訓練和驗證損失大概在 10 個輪次的時候就快速的收斂了,這之後在兩個損失變化中都只能看到很小的波動。

保存的卷積核權重值可以被可視化並組合成一個 gif 動圖。這個結果被高亮出來了:模型看上去很好的學習到了原始笑臉濾波器的核,從下面的 gif 圖中可以清晰的看出。在大約 10 輪迭代後,卷積核權重值相對較早的呈現出笑臉的形狀,但是核權重仍然包含較大的雜訊。隨著訓練的進行,雜訊慢慢的消失,相鄰的權重值之間互相變得更加穩定。

通過分析驗證集的損失和卷積核權重的可以完成一個重要的觀察。儘管在 10 輪迭代後驗證集的損失看上去很平穩,卷積核的權重仍然向原始的笑臉核逼近了足夠多的量。線性尺度的訓練和驗證集的損失曲線可能偶爾有一點誤導,因為在計算損失時,初始損失在後階段的改進中可能主導損失可視化的結果。

模型訓練卷積層權重的過程。權重值逐漸收斂到接近笑臉濾波器

現在我們已經有一個訓練好的模型,我們可以可視化,並在測試圖像上比較模型的輸出和笑臉濾波器的處理結果。在下面的圖像中,我們可以觀察到模型和笑臉濾波器在測試圖像上產生了一個類似笑臉的形狀。與 Sobel 濾波器濾波的圖像類似,模型產生的圖像也由從數據中學習到了 Sobel 濾波器的特性,區分笑臉濾波器濾波的圖像和模型輸出的圖像是非常難區分的。

模型的輸出(左側)和由笑臉濾波器在同一張圖像上得到的結果(右側)。


終言

我希望這三個線性濾波器的實驗走狗清晰的闡述卷積核的權重是如何由網路從數據訓練中得到的。此外,我希望你能夠捕捉到一些洞察力以便理解卷積核對輸入數據上的操作方式。實驗結果不適合推廣到卷積網路在圖像分類上的例子,但是作為一個優化問題仍然為理解卷積層背後的現象和學習提供了一個基礎。

如果你對在自己的電腦運行這個實驗感興趣,這裡是 github 上的鏈接路徑,包含了所有重複執行必須的內容:

https://github.com/vexcel/Keras-LearnLinearFilter .

https://towardsdatascience.com/learning-to-perform-linear-filtering-using-natural-image-data-db289d0b0457

想知道關於計算機視覺更多知識?


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 AI研習社 的精彩文章:

微軟發布的可視化圖像/視頻標記工具 VoTT
和AI 大牛共進晚餐的機會來了!

TAG:AI研習社 |