Friday, March 23, 2018

AI從頭學(三六):FCN

AI從頭學(三六):FCN

2018/03/06

前言:

FCN 直接看論文的話,並不容易理解。但搭配網路上的文章與圖片(圖3a與圖5),則一目了然。

Summary:

FCN [1]-[4] 是將傳統 CNN 最後的全連接層改成卷積層,這樣不僅能讓輸入圖片不限定於固定尺寸,並且能夠對每個像素做分類 [5]-[10]。可參考其代碼實現 [11]-[14],與更新的 FCN 模型 [15]-[20]。最後是有關熱圖 (heatmap) 的簡單討論 [21]-[24]。

-----


Fig. 1a. 對每個像素進行分類 [1].

-----


Fig. 1b. 調色版 [11]。

-----

Outline

一、Semantic Segmentation
二、Convolution and Heatmap
三、Deconvolution
四、Flowchart of algorithm
五、Heatmap

-----

一、Semantic Segmentation

何謂像素分類?參考圖1,可以看到圖片的所有像素都被歸類於貓、狗、或背景。 這是用 FCN 做的。用 CNN,我們可以對整張圖片(的主要物件)做分類。那有沒有辦法對每個像素做分類呢?

用 CNN 做像素分類,有其方法上的難處(參考下面第三項),也就其計算上的難處(參考下面一二項)。像素塊比整個物體小很多,不具代表性。另外儲存跟計算量都很大。

「為什麼 CNN 對像素級別的分類很難?1. 存儲開銷很大。例如對每個像素使用的圖像塊的大小為 15×15,然後不斷滑動窗口,每次滑動的窗口給 CNN 進行判別分類,因此則所需的存儲空間根據滑動窗口的次數和大小急劇上升。2. 計算效率低下。相鄰的像素塊基本上是重複的,針對每個像素塊逐個計算卷積,這種計算也有很大程度上的重複。3. 像素塊大小的限制了感知區域的大小。通常像素塊的大小比整幅圖像的大小小很多,只能提取一些局部的特徵,從而導致分類的性能受到限制。」[8]

-----

二、Convolution and Heatmap

FCN,簡單說就是把 CNN 最後面的全連接層改成卷積層,在最後一個卷積層的 feature map(又稱 heatmap)上直接分類。

以圖2為例,上方的 CNN,由於最後是全連接層,所以輸入要固定大小,然後輸出是 1000 種物件的可能性(以圖1來說只有21種)。圖2下方的 FCN,則是將全連接層改為卷積層,這樣輸入就不限定大小,因為最後一層是 heatmap。圖中可以看到,貓的部份在分類為貓的 heatmap 上,值是比較高的。

「Heatmap 熱度圖使用顏色的深淺來表示數值的大小,通常會搭配 XY 兩軸的變量,所以使用一張圖就能表示三個維度的資訊。」[21]


Fig. 2. FCN 將 CNN 的全連接層改為卷積層 [1]。

-----

三、Deconvolution

要從圖2得到圖1a,我們只要把所有 heatmap 放大到原圖大小,然後看每個像素在哪個 heatmap 上的值最大,這個像素就可以歸類於那一類,譬如說貓。

當然直接放大32倍會導致結果有點粗糙, 所以先放大2倍,然後跟上一層的 heatmap 加總。再放大2倍,然後又跟上一層的 heatmap 加總。最後再放大8倍。這樣效果比較好。參考圖3跟圖4。

下文的轉置卷積,其實就是 deconvolution。

「最簡單的 FCN 前面是一個去掉全連接層的預訓練網絡,然後將去掉的全連接變為 1x1 的捲積,輸出和類別數據相同的通道數,比如 VOC 數據集是 21 分類,那麼輸出的通道數就是 21,然後最後接一個轉置卷積將結果變成輸入的形狀大小,最後在每個像素上做一個分類問題,使用交叉熵作為損失函數就可以了。」[12]

「當然這樣的模型是特別粗糙的,因為最後一步直接將圖片擴大了 32 倍,所以論文中有一個改進,就是將網絡中間的輸入聯合起來進行轉置卷積,這樣能夠依賴更多的信息,所以可以得到更好的結果,可以看看下面的圖示:」[12]

-----


Fig. 3a. Deconvolution 後跟上一層的 heatmap 加總,成為新的 heatmap [16]。

-----


Fig. 3b. 論文說明 [1]。

-----


Fig. 4. 不同尺度的 FCN [1]。

-----

至於為何從 32x、16x、到 8x 後就沒有繼續做,因為試驗結果沒有更好。

「對 CNN 的結果做處理,得到了dense prediction,而作者在試驗中發現,得到的分割結果比較粗糙,所以考慮加入更多前層的細節信息,也就是把倒數第幾層的輸出和最後的輸出做一個 fusion,實際上也就是加和。」[10]

「實驗表明,這樣的分割結果更細緻更準確。在逐層 fusion 的過程中,做到第三行再往下,結果又會變差,所以作者做到這裡就停了。」[10]

-----

四、Flowchart of algorithm

圖5是完整的演算法,可以參考剛剛的解釋跟下方的說明。其實看圖即可一目了然。

「之所以能做到這樣,是因為卷積層的輸出的結果是數據圖,而不是一個向量!經過反卷積後得到與原圖一樣大小的 1000(或21)層的熱圖,每一層代表一個類,然後觀察每個位置的像素,在哪一層它這個點對應的值最大,就認為這個像素點屬於這一層的類。就比如圖中點貓那個位置的點,在 tabby cat 這個類的熱圖上表現的值很高,所以認為那一坨像素點是屬於這個類的。從而這樣對每個像素點進行分類,最後輸出的就是分割好的圖像。」[7]

-----

「經過多次卷積和集中以後,得到的圖像越來越小,分辨率越來越低。其中圖像到 (H / 32) * (W / 32) 的時候圖片是最小的一層時,所產生圖叫做熱圖,熱圖就是我們最重要的高維特徵圖,得到高維特徵的熱圖之後就是最重要的一步也是最後的一步對原圖像進行採樣,把圖像進行放大幾次到原圖像的大小。」[8]

「相較於使用被轉化前的原始卷積神經網絡對所有 36 個位置進行迭代計算優化模型,然後再對 36 個位置做預測,使用轉化後的卷積神經網絡進行一次前向傳播計算要高效得多,因為 36 次計算都在共享計算資源。這一技巧在實踐中經常使用,通常將一張圖像尺寸變得更大,然後使用變換後的卷積神經網絡來對空間上很多不同位置進行評價得到分類評分,然後在求這些分值的平均值。」[8]

-----

「藍色:卷積層
綠色:Max Pooling 層
黃色:求和運算,使用逐數據相加,把三個不同深度的預測結果進行融合:較淺的結果更為精細,較深的結果更為 robust
灰色:裁剪,在融合之前,使用裁剪層統一兩者大小,最後裁剪成和輸入相同尺寸輸出
對於不同尺寸的輸入圖像,各層數據的尺寸(height,weight)相應變化,深度(channel)不變」 [8]

-----


Fig. 5. FCN 的流程圖 [8]。

-----
 
五、Heatmap

圖6是之前 ZFNet 的例子,(b) 是 heatmap。

把博美的 heatmap 還原後可以得到(c)博美。(d)然後除了中間不是博美外,其他為博美的機率很高。(e)可以看到本圖是博美,中間是網球。

中間的車、車輪、跟標籤則比較難以直接歸類。下方的阿富汗獵犬雖然在(e)的分類是對的,但是(d)可靠度並不高,而且(c)deconvolution之後是女士。


Fig. 6. Three test examples. (a)是輸入的圖片。(b)是熱圖:高強度的數值以紅色表示,低強度的數值則是以藍色來表示。(c)是利用 deconvolution 把 feature maps 還原成類似原圖。(d)是這個圖是「對」的圖的機率高不高。(e)是這個圖最可能是哪一種 [24]。

-----

結論:

經由最後全連接層改為卷積層,FCN 變為可以接受不同尺寸的圖片,並完成像素分類,是很巧妙的設計。

-----

References

一、論文

[1] Long, Jonathan, Evan Shelhamer, and Trevor Darrell. "Fully convolutional networks for semantic segmentation." Proceedings of the IEEE Conference on Computer Vision and Pattern Recognition. 2015.
https://www.cv-foundation.org/openaccess/content_cvpr_2015/app/2B_011.pdf 

[2] [译] 用于语义分割的全卷积网络FCN(UC Berkeley) - 简书
https://www.jianshu.com/p/91c5db272725

[3] Dai, Jifeng, et al. "R-FCN: Object detection via region-based fully convolutional networks." Advances in neural information processing systems. 2016.
http://papers.nips.cc/paper/6465-r-fcn-object-detection-via-region-based-fully-convolutional-networks.pdf 

[4] R-FCN论文翻译——中文版 _ SnailTyan
http://noahsnail.com/2018/01/22/2018-01-22-R-FCN%E8%AE%BA%E6%96%87%E7%BF%BB%E8%AF%91%E2%80%94%E2%80%94%E4%B8%AD%E6%96%87%E7%89%88/

二、導讀

[5] 论文阅读笔记:Fully Convolutional Networks for Semantic Segmentation - CSDN博客
http://blog.csdn.net/tangwei2014/article/details/46882257

[6] FCN论文阅读笔记
https://zhuanlan.zhihu.com/p/25984129

[7] 深度学习论文笔记(六)--- FCN-2015年(Fully Convolutional Networks for Semantic Segmentation) - 云+社区 - 腾讯云
https://cloud.tencent.com/developer/article/1008418

[8] Fully Convolutional Networks _ 简说
http://simtalk.cn/2016/11/01/Fully-Convolutional-Networks/

[9] FCN  Fully Convolutional Networks for Semantic Segmentation - Yangming’s Blog
http://www.yangmingwen.com/deep%20learning/FCN/

[10] Fully Convolutional Networks for Semantic Segmentation(全卷积网络FCN)-博客-云栖社区-阿里云
https://yq.aliyun.com/articles/232455

三、實現

[11] FCN学习 Semantic Segmentation
https://zhuanlan.zhihu.com/p/22976342

[12] FCN 的简单实现 _ Sherlock Blog
https://sherlockliao.github.io/2017/12/31/fcn/

[13] MatConvNet进行FCN语义分割 - Deep Studio
http://www.p-chao.com/2017-04-27/matconvnet%e8%bf%9b%e8%a1%8cfcn%e8%af%ad%e4%b9%89%e5%88%86%e5%89%b2/

[14] fcn模型訓練及測試 - 掃文資訊
https://hk.saowen.com/a/ab217f78220d97b6fb3556cd6ad93b4590f79e396a2e06c19bd83559f2533032

四、延伸

[15] Awesome Image Semantic Segmentation 圖像語義分割之導讀論文與工具包總匯 _ Learning by Hacking
https://data-sci.info/2017/07/13/awesome-image-semantic-segmentation-%E5%9C%96%E5%83%8F%E8%AA%9E%E7%BE%A9%E5%88%86%E5%89%B2%E4%B9%8B%E5%B0%8E%E8%AE%80%E8%AB%96%E6%96%87%E8%88%87%E5%B7%A5%E5%85%B7%E5%8C%85%E7%B8%BD%E5%8C%AF/

[16] 【总结】图像语义分割之FCN和CRF
https://zhuanlan.zhihu.com/p/22308032

[17] 從FCN到DeepLab - 掃文資訊
https://hk.saowen.com/a/226c2954cb867da0dbc8d9f911ade34e12817d59ad4cb125af5db3b0e2b2795a

[18] 从全卷积网络到大型卷积核:深度学习的语义分割全指南 _ 机器之心
https://www.jiqizhixin.com/articles/2017-07-14-10

[19] 多篇用DL做Semantic Segmentation的文章总结 - 菜鸡一枚 - 博客园
http://www.cnblogs.com/yymn/articles/5377340.html

[20] 基于深度学习的语义分割综述 _ 曹彬彬
http://www.binbincao.com/2017/07/07/Semantic-Segmentation-with-Deep-Learning/

五、補充

[21] 資料科學與R語言
https://yijutseng.github.io/DataScienceRBook/vis.html 

[22] Heat map - Wikipedia
https://en.wikipedia.org/wiki/Heat_map  

[23] ◎ ZFNet
Zeiler, Matthew D., and Rob Fergus. "Visualizing and understanding convolutional networks." European conference on computer vision. Springer, Cham, 2014.
https://arxiv.org/pdf/1311.2901.pdf

[24] AI從頭學(二七):ZFNet
http://hemingwang.blogspot.tw/2017/05/aikernel-visualizing.html

No comments: