1. 程式人生 > 實用技巧 >《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》論文閱讀

《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》論文閱讀

《HybridSN: Exploring 3-D–2-DCNN Feature Hierarchy for Hyperspectral Image Classification》論文閱讀

一、引言

  • 高光譜影象是立體資料,也有光譜維數,僅憑2D-CNN無法從光譜維度中提取出具有良好鑑別能力的feature maps。一個深度3D-CNN在計算上更加複雜,對於在許多光譜帶上具有相似紋理的類來說,單獨使用似乎表現得更差。
  • 混合CNN模型克服了之前模型的這些缺點,將3D-CNN和2D-CNN層組合到該模型中,充分利用光譜和空間特徵圖,以達到最大可能的精度

二、詳細內容

2.1 基礎知識掃盲

  • 單色光

    :單一波長(或頻率)的光,不能產生色散。

  • 複色光:幾種單色光合成的光。

  • 色散系統:複色光分解為單色光而形成光譜的現象。

  • 光譜(光學頻譜,spectrum):複色光經過色散系統(如稜鏡、光柵)分光後,被色散開的單色光按波長(或頻率)大小而依次排列的圖案。

  • 光柵:由大量等寬等間距的平行狹縫構成的光學器件。

  • 高光譜影象(Hyperspectral Image):在光譜的維度進行了細緻的分割,不僅僅是傳統的黑,白或者RGB的區別,而是在光譜維度上也有N個通道。例如:我們可以把400nm-1000nm分為300個通道,一次,通過高光譜裝置獲取的是一個數據立方,不僅有影象的資訊,並且在光譜維度上進行展開,結果不僅可以獲得影象上每個點的光譜資料,還可以獲得任意一個譜段的影像資訊。

  • 高光譜影象成像原理:空間中的一維資訊通過鏡頭和狹縫後,不同波長的光按照不同程度的彎散傳播,一維影象上的每個點,再通過光柵進行衍射分光,形成一個譜帶,照射到探測器上,探測器上的每個畫素位置和強度表徵光譜和強度。

  • HSI:數字影象模型,反映了人的視覺系統感知彩色的方式,以色調H(Hue)、飽和度S(Saturation)、亮度I(Intensity)三種基本特徵量來感知顏色。
    • 色調H(Hue):與光波的頻率有關,它表示人的感官對不同顏色的感受,也可以表示一定範圍的顏色;
    • 飽和度S(Saturation):表示顏色的純度,純光譜色是完全飽和的,加入白光會稀釋飽和度。飽和度越大,顏色看起來就越鮮豔。
    • 亮度I(Intensity):對應成像亮度和影象灰度,是顏色的明亮程度。

2.2 實現過程

  • 空間光譜高光譜資料立方體表示為:

    • I為原始輸入,M為寬度,N為高度,D為光譜帶數/深度
    • I中的每個HSI畫素包含D個光譜測度,形成一個one-hot向量
  • 然而, 高光譜畫素 exhibit the mixed land-cover classes(??), introducing the high intra-class variability and interclass similarity into I.(個人理解為,引入這兩個性質比較難辦)因此:

    1. 將主成分分析(PCA)應用於原始HSI資料(I)的光譜波段(將光譜波段從D減少到B,保持相同的空間維數),只減少了光譜波段,保留了對識別物體重要的空間資訊。

    2. 下式為處理後的資料立方體,其中X為PCA後的輸入,M為寬度,N為高度,B為主成分後的光譜帶數。

    3. 將HSI資料立方體劃分為重疊的三維小塊,小塊的truth label由中心畫素的label決定。

    4. 從X開始,建立以空間位置(α,β)為中心的三維相鄰塊,覆蓋了S×S的視窗或者是空間範圍和所有B光譜波段。

    5. 在(α,β)上的三維塊覆蓋了寬度從α-(S-1)/2到α+(S-1)/2,高度從β-(S-1)/2到β+(S-1)/2和所有的PCA簡化立體資料X的B光譜波段。

    6. 在二維卷積中,第j個特徵圖的i層中(x,y)位置的啟用值表示如公式(1)下:

      (其中φ是啟用函式,bi, j是第j個特徵圖的i層的偏差引數,dl−1是第(l−1)層特徵圖的數量和第i層j個特徵圖的數量,2γ+ 1是卷積核的寬度,2δ +1 是卷積核的高度,wi,j 為第i層j個特徵圖權重指數的值)

  • 在HSI資料模型中,利用三維核在輸入層的多個連續頻帶上生成卷積層的特徵圖,捕獲了光譜資訊;在三維卷積中,在第i層第j個特徵圖中(x,y)的啟用值記為Vx,y, Zi,j,如公式(2)所示:

  • 2η + 1 為卷積核沿光譜維數的深度,其他引數不變。

2.3 混合特徵學習框架hybrid feature learning framework

網路結構如圖所示(三個三維卷積【公式2】,一個二維卷積【公式1】,三個全連線層):

  • 三維卷積中,卷積核的尺寸為8×3×3×7×1、16×3×3×5×8、32×3×3×3×16(16個三維核,3×3×5維)
  • 二維卷積中,卷積核的尺寸為64×3×3×576(576為二維輸入特徵圖的數量)

2.4 實驗資料集

三種開源高光譜影象資料集,Indian Pines(IP), University of Pavia(UP) and Salinas Scene(SA)

  • IP影象空間維度為:145×145,波長範圍為400-2500nm,共有224個光譜波段
  • UP影象空間維度為:610×340,波長範圍430-860nm,共有103個光譜波段
  • SA影象空間維度為:512×217,波長範圍360-2500nm,共有224個光譜波段

2.5 實驗結果分析

作者使用了Overall Accuracy (OA), Average Accuracy (AA) and Kappa Coefficient (Kappa)三個評價指標來判斷HSI的分類效能。其中OA表示測試樣本總數中正確分類的樣本數;AA為分類分類準確率的平均值;和Kappa是一個統計測量的度量,它提供關於在地面真實地圖和分類地圖之間的一個強協議的相互資訊。

從表二可以看出,混合演算法在保持最小標準偏差的同時,在每個資料集上都優於所有的比較方法。

圖3顯示了混合網路在IP、UP和SA資料集上的HSI分類效能的混淆矩陣。

訓練集和驗證集100個epoch的準確性和損失收斂如圖4所示。可以看出,收斂時間約為50個epoch,這表明作者的方法收斂速度較快。

混合動力網路模型的計算效率體現在訓練和測試次數方面,如表3所示。

2.6 總結

這篇論文介紹了一種混合的3D和2D模型用於高光譜影象分類。本文提出的hybrid dsn模型是將空間光譜和光譜的互補資訊分別以三維卷積和二維卷積的形式結合在一起。在三個基準資料集上的實驗結果與最新方法進行了比較,驗證了該方法的優越性。該模型比3D-CNN模型的計算效率更高。在小的訓練資料上也顯示出了優越的效能。

三、程式碼練習

三維卷積部分:

  • conv1:(1, 30, 25, 25), 8個 7x3x3 的卷積核 ==>(8, 24, 23, 23)
  • conv2:(8, 24, 23, 23), 16個 5x3x3 的卷積核 ==>(16, 20, 21, 21)
  • conv3:(16, 20, 21, 21),32個 3x3x3 的卷積核 ==>(32, 18, 19, 19)

接下來要進行二維卷積,因此把前面的 32*18 reshape 一下,得到 (576, 19, 19)

二維卷積部分:
(576, 19, 19) 64個 3x3 的卷積核,得到 (64, 17, 17)

接下來是一個 flatten 操作,變為 18496 維的向量,

接下來依次為256,128節點的全連線層,都使用比例為0.4的 Dropout,

最後輸出為 16 個節點,是最終的分類類別數。

下面是 HybridSN 類的程式碼:

class HybridSN(nn.Module):
  def __init__(self):
    super(HybridSN, self).__init__()
    self.conv3d_1 = nn.Sequential(
        nn.Conv3d(1, 8, kernel_size=(7, 3, 3), stride=1, padding=0),
        nn.BatchNorm3d(8),
        nn.ReLU(inplace = True),
    )
    self.conv3d_2 = nn.Sequential(
        nn.Conv3d(8, 16, kernel_size=(5, 3, 3), stride=1, padding=0),
        nn.BatchNorm3d(16),
        nn.ReLU(inplace = True),
    ) 
    self.conv3d_3 = nn.Sequential(
        nn.Conv3d(16, 32, kernel_size=(3, 3, 3), stride=1, padding=0),
        nn.BatchNorm3d(32),
        nn.ReLU(inplace = True)
    )

    self.conv2d_4 = nn.Sequential(
        nn.Conv2d(576, 64, kernel_size=(3, 3), stride=1, padding=0),
        nn.BatchNorm2d(64),
        nn.ReLU(inplace = True),
    )
    self.fc1 = nn.Linear(18496,256)
    self.fc2 = nn.Linear(256,128)
    self.fc3 = nn.Linear(128,16)
    self.dropout = nn.Dropout(p = 0.4)

  def forward(self,x):
    out = self.conv3d_1(x)
    out = self.conv3d_2(out)
    out = self.conv3d_3(out)
    out = self.conv2d_4(out.reshape(out.shape[0],-1,19,19))
    out = out.reshape(out.shape[0],-1)
    out = F.relu(self.dropout(self.fc1(out)))
    out = F.relu(self.dropout(self.fc2(out)))
    out = self.fc3(out)
    return out