1. 程式人生 > >MatConvNet提取FCN深度特徵 (轉載)

MatConvNet提取FCN深度特徵 (轉載)

MatConvNet提取FCN深度特徵

<div class="article-info-box">
    <div class="article-bar-top d-flex">
                                            <span class="time">2017年04月13日 18:53:50</span>
        <div class="float-right">
            <span class="read-count">閱讀數:3599</span>
                                        </div>
    </div>
</div>
<article>
    <div id="article_content" class="article_content clearfix csdn-tracking-statistics" data-pid="blog" data-mod="popu_307" data-dsm="post">
                <div class="markdown_views">
            <p><font face="宋體" size="3">  文中程式和深層次提取細節請點選<a href="https://github.com/DUTFangXiang/ExtractFCNFeature" rel="nofollow" target="_blank">https://github.com/DUTFangXiang/ExtractFCNFeature</a>瞭解。</font></p>

一、背景

  當前計算機視覺方向,隨著深度學習方法的發展與成熟,CNN已經在各大計算機視覺應用中取得優異的表現,尤其以檢測,分類,分割,識別中最為突出。但是重新設計和訓練一個深度網路是一個複雜的工作,所以有一批研究者採取另類的一種方法,也就是從當前已有網路中提取前卷積網路作為圖片的特徵,來替代傳統手工諸如RGB顏色,HOG,紋理,亮度等特徵,然後應用傳統無監督或者有監督學習方法結合深度特徵(Deep CNN features)做更深入的研究。例如ECCV2016上做顯著性目標檢測的文章《Kernelized Subspace Ranking for Saliency Detection》就是利用的這個思想,文中提取的是RCN特徵來表示每個候選目標。
  提取深度特徵的CNN網路無需重新學習,我們僅需在已訓練好CNN網路中提取不同卷積層串聯來當做圖片特徵即可。深度特徵由於結合了fine層和coarse層特徵資訊,可以讓模型做區域性的預測,並且尊重圖片的全域性結構。經過試驗發現,相比較傳統手工特徵,深度特徵應用在相同模型上能夠取得了更好的最終效果。

二、MatConvNet

  MatConvNet是Matlab工具包,可以為計算機視覺應用完成Convolutional Neural Networks (CNNs) 。它能夠讓你在Matlab中簡單高效地完成現有CNNs網路執行和學習。現在該工具包已相容許多已訓練好的影象分類,分割,人臉識別和文字檢測等CNNs網路。更加詳細的說明請查閱MatConvNet官網http://www.vlfeat.org/matconvnet/

二、FCN

  通常CNN網路在卷積層之後會接上若干個全連線層, 將卷積層產生的特徵圖(feature map)對映成一個固定長度的特徵向量。傳統的基於CNN的分割方法:為了對一個畫素分類,使用該畫素周圍的一個影象塊作為CNN的輸入用於訓練和預測。這種方法有幾個缺點:一是儲存開銷很大。例如對每個畫素使用的影象塊的大小為15x15,然後不斷滑動視窗,每次滑動的視窗給CNN進行判別分類,因此則所需的儲存空間根據滑動視窗的次數和大小急劇上升。二是計算效率低下。相鄰的畫素塊基本上是重複的,針對每個畫素塊逐個計算卷積,這種計算也有很大程度上的重複。三是畫素塊大小的限制了感知區域的大小。通常畫素塊的大小比整幅影象的大小小很多,只能提取一些區域性的特徵,從而導致分類的效能受到限制。
  而全卷積網路(FCN)則是從抽象的特徵中恢復出每個畫素所屬的類別,即從影象級別的分類進一步延伸到畫素級別的分類。FCN沒有對輸入一整張影象做任何預處理操作,整個過程是將一整張圖片送入到網路中端到端訓練。
  FCN網路第一次被Jonathan Long等人在Fully Convolutional Networks for Semantic Segmentation文章中提出,發表於2015年CVPR會議上。網路結構如下圖:


這裡寫圖片描述

三、FCN深度特徵提取

  FCN包含16層,為了獲取區域性到全域性的特徵表示,當一張圖片送入到FCN中,我們融合fine層的pool1以及coarse層的pool5作為圖片的特徵。這樣串聯的特徵就可以讓後面的模型能夠做區域性的預測,同時能夠遵守全域性的結構。


這裡寫圖片描述

  其中Extract_FCN_features資料夾中放置的是利用MatConvNet軟體包提取特徵的Matlab程式。當然,首先你需要下載已訓練好的FCN網路,請在http://www.vlfeat.org/matconvnet/pretrained/網站下載pascal-fcn8s-dag.mat檔案(下載地址是:http://www.vlfeat.org/matconvnet/models/beta18/,官網好像這個mat檔案有變化,用最新的無法獲得,老版mat是這個地址中獲取。),原深度網路是在語義分割庫上訓練,但是提取的特徵適用於大多數計算機視覺應用。然後在Extract_FCN_features資料夾中建立一個FCN資料夾,將下載好的mat檔案放置在FCN資料夾中。
  接著開啟main.m程式,修改下面的影象庫的檔案路徑imaFile就可以了,程式中預設圖片格式是bmp,如果是其他格式請自行修改。

這裡寫圖片描述

  當然,你也可以儲存其他層特徵,程式中第6和32對應的是原網路中pool1和pool5層。整個網路輸出的結果,你可以在最後通過輸出結果對應到原網路大小,從而儲存其他層的圖片特徵結果。
  另外一個Use_FCN_Feature資料夾是提取儲存的特徵,並且將其復原到原影象大小。由於圖片提取的特徵邊緣存在零填充成分,所以在最後特徵陣列中需要先將其剔除再復原到原影象大小。如下圖,是經試驗得出的每一層零填充成分的長度。

這裡寫圖片描述

  當然,整個過程已經完成,你只需要對應哪一層網路就行,程式自動會剔除然後復原到原影象大小。程式中還包含了將最終畫素特徵取均值對映到對應超畫素的程式,如果有超畫素特徵提取需求的請在對應部分去除註釋即可。

  個人學習記錄,由於能力和時間有限,如果有錯誤望讀者糾正,謝謝!