當前位置:
首頁 > 知識 > 語義分割和轉置卷積

語義分割和轉置卷積

雷鋒網按:本文為雷鋒字幕組編譯的技術博客,原標題 Semantic Segmentation and Transposed Convolution,作者為 Ujjwal Saxena。

翻譯 | 趙朋飛 程思婕 整理 | 凡江

插播一則小廣告:NLP領域的C位課程,斯坦福CS224n正在AI慕課學院持續更新中,無限次免費觀看!

使用 FCN8 識別可移動區域

分割對圖像分析是必不可少的。語義分割描述了每個像素與類別標記的關聯過程,(例如:花朵、人物、道路、天空、海洋、或者汽車)。

圖像來源:Mathworks

眾多語義分割方法中,很多領域都有很大的潛力。這些領域包括自主駕駛、工業鍋爐檢驗、熱圖等,衛星圖中的地形劃分,醫學影像分析。基於個人興趣,我也做了從葉子中檢測植物疾病的研究。包括將紋理或葉片從實際疾病標記中分離出來。這也促進了疾病檢測過程的簡化並提高了精度。

但語義分割到底是什麼呢 ?

語義分割是指在像素層面去理解圖像,即,我們想給圖像中的每個像素分配一個對象類。例如,查看下面的圖片。

輸入圖像

語義分割

在上面的圖片中,只有 3 種類別,人、自行車和其他事物。FCN 可以被訓練來識別道路、植物以及天空。VOC2012 和 MSCOCO 是語義分割領域最重要的數據集。

2014 年,來自伯克利的 Long 等人提出的全卷積網路 (FCN),促使 CNN 架構在沒有全連接層的情況下在密集預測領域普遍應用。這使得分割圖可以生成任何大小的圖像,而且與之前使用的補丁分類方法相比,也要快得多。幾乎所有後來的關於語義分割的頂級方法都採用了這種模式。

除了完全連接的層,使用 CNN 進行語義分割的另一個主要問題是池化層。池層增加了視圖的範圍,並且能夠在丟棄「where」信息的同時聚合上下文。然而,語義分割需要精確的類別分布信息,因此,需要保留空間信息。在文獻中有兩種不同的體系結構來解決這個問題。

第一種是編碼器-解碼器架構。編碼器使用池化層逐漸減少空間維度,解碼器逐步恢復對象細節和空間維度信息。通常在編碼器和解碼器之間有快捷連接,用於更好地幫助解碼器恢復對象細節。

第二種方法沒有在這裡討論。

當我在研究轉置卷積中填充差異的時候,我發現關於一些關於 SAME 和 VALID 填充的很有趣的事情。需要理解的最重要的事情是,在 Valid 填充時,濾波器 Kernel 的大小不會超出輸入圖像的尺寸,對於卷積和轉置卷積都是如此。類似,Same 填充核可以超出圖像維度。

讓我們更多的討論下 Valid 填充。當增加 kernel 步長時,輸入圖像會在像素之間填充。如果步長是 2,會在現有行列之間再分別增加一行和一列。如果步長是 1,不會做任何填充。

Stride:1, kernel:3x3

Stride:2, kernel:3x3

保持 k 不變,增加步長減少重疊。這種重疊指的是由相鄰的內核行為計算的公共區域。讓我們想像一下相反的效果。

Stride:2, kernel:4x4

因此,填充的輸入圖像取決於步長:

Ip_d= (I-1)*s

s=步長,I= 輸入維度,Ip_d 填充輸入維度

輸出圖像維度取決於填充輸入圖像維度和核大小,如下:

O_d= Ip_d+ k;

O_d= (I-1)*s+k; k 是核大小

這個方程是正確的,無論核大小是大於或小於步長的,都可以在這裡進行驗證。然而,我的同事 Keshav Aggarwal 在玩 tensorflow 的一些代碼時,得到了一個更好的等式。如下:

O_d = I * s+ max(k?—?s, 0);所有變數和上面的公式相同

我建議你稍微玩一下代碼。

Same Padding 很簡單但相當神秘。Same padding 通常在圖像邊界之外填充空的行和列。在正常的卷積過程中,即使填充是相同的,Kernel 可以用上面提到的步長掃描完整圖像,實際上也不會在輸入圖像上填充任何東西。然而,如果由於 Kernel 大小和步長值而漏掉一些行或列,則添加一些額外的列和行來覆蓋整個圖像。

這不是轉置卷積的情況。輸出圖像維度不依賴於過濾器的內核大小,而是根據步長的倍數增加。

O_d= I_d*s;

s=步長,I_d= 輸入維度,O_d 填充輸入維度

在這個案例中,輸出維度由系統預先計算,然後圖像在應用過濾器來維護輸出維度之前,在外部被填充,去卷積之後,維度結果和計算的一樣。優先考慮給圖像增加列,圖像兩側增加的列要一致。如果不一致,那麼額外的列就會被添加到圖像右側。

那麼如何採用這些濾波器對圖像進行上採樣呢?

這很簡單,因為現在我們有了方程。假設我們想把圖像放大到原來的兩倍。

對 Same 填充來說,你可以設置 Kernel 任何合適的值,並且步長設置為 2。

對 Valid 填充,你可以將 Kernel 和步長都設置為 2。

然而,這些濾波器的性能是一個實驗領域。我發現這裡的 Same padding 比 Valid padding 更優秀。設置 kernel 值為一個偶數值不是好的實踐,但是如果你想使用 Valid padding 將圖片放大 2 倍,似乎沒有別的辦法。

你訪問我的 Github 查看一些做過的項目,如果需要查看我更多的文章可以訪問我的 medium 賬號或 WordPress。

CCF-GAIR 2018 在即,

AI 研習社送福利了!


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

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


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

如何使用 Keras 實現無監督聚類
微軟發布的可視化圖像/視頻標記工具 VoTT

TAG:AI研習社 |