據(jù)集下載與預處理實戰(zhàn):從Indian Pines到GF-5的完整流程)
1. 高光譜數(shù)據(jù)集到底解決什么問題高光譜遙感這幾年從實驗室走向工程化的速度明顯加快尤其是農業(yè)估產、礦物填圖、水質監(jiān)測、偽裝識別這幾個方向幾乎每個項目立項后的第一件事就是找數(shù)據(jù)。但真正上手的人都知道公開數(shù)據(jù)集雖然不少可散落在各個課題組主頁、會議附件、網盤鏈接里有的鏈接早就失效有的下載下來發(fā)現(xiàn)波段順序對不上還有的連標簽文件都缺。我前后做過三個高光譜分類項目光是整理可用的數(shù)據(jù)集就花了將近兩周踩過的坑足夠寫一篇避坑指南。這篇文章要做的就是把目前主流且驗證可用的高光譜數(shù)據(jù)集做一次系統(tǒng)梳理同時把下載之后怎么用、怎么轉反射率、怎么切patch、怎么接分類網絡這些實操環(huán)節(jié)講透。適合剛進入遙感方向的研究生、做地物分類的算法工程師以及需要快速驗證想法的應用開發(fā)者。不管你是用MATLAB還是Python是做傳統(tǒng)機器學習還是深度學習這里面的內容都能直接抄作業(yè)。提示本文提到的所有數(shù)據(jù)集均為公開學術資源下載后請遵守各自的使用協(xié)議引用對應論文。2. 主流高光譜數(shù)據(jù)集全景梳理2.1 經典基準數(shù)據(jù)集從Indian Pines到Salinas高光譜分類領域有幾個“老牌”數(shù)據(jù)集幾乎每篇論文都會拿它們做對比實驗。Indian Pines是最早的一批1992年用AVIRIS傳感器在美國印第安納州一片農業(yè)區(qū)采集空間分辨率20米波段數(shù)220個去掉吸水波段后剩200個地物類別16類主要是玉米、大豆、小麥等農作物。這個數(shù)據(jù)集的特點是類別極不平衡有些類只有幾十個樣本訓練時容易過擬合所以很多論文會做樣本增強或者用注意力機制來緩解。Salinas是同一傳感器在加州Salinas Valley采集的空間分辨率3.7米波段數(shù)224個去掉壞波段后204個類別也是16類但樣本分布比Indian Pines均衡得多蔬菜、葡萄園、裸土這些類別的區(qū)分度更高。Pavia University用的是ROSIS傳感器意大利帕維亞大學城區(qū)域空間分辨率1.3米波段數(shù)115個去掉噪聲波段后103個9類地物包括瀝青、草地、樹木、金屬板等。這個數(shù)據(jù)集的空間細節(jié)更豐富適合做空譜聯(lián)合分類。這三個數(shù)據(jù)集在IEEE DataPort和Purdue大學的實驗室主頁上都有穩(wěn)定下載鏈接格式一般是.mat文件里面包含數(shù)據(jù)立方體和對應的ground truth標簽矩陣。下載后直接用scipy.io.loadmat讀取即可注意有些版本的數(shù)據(jù)立方體是uint16需要轉成float再做歸一化。2.2 國產高光譜數(shù)據(jù)GF-5與珠海一號國產衛(wèi)星數(shù)據(jù)這兩年的可用性提升很快。GF-5搭載的AHSI傳感器有330個波段光譜范圍覆蓋400到2500納米空間分辨率30米幅寬60公里。做蝕變信息提取時GF-5的短波紅外波段對羥基和碳酸鹽礦物的識別效果很好在ENVI里用光譜角制圖或者匹配濾波就能出初步結果。下載渠道一般通過中國資源衛(wèi)星應用中心申請部分樣例數(shù)據(jù)在開放平臺上可以直接獲取。珠海一號高光譜星座由多顆衛(wèi)星組成空間分辨率10米波段數(shù)32個雖然波段數(shù)比GF-5少但重訪周期短適合做時間序列分析。它的數(shù)據(jù)格式是GeoTIFF每個波段一個文件用GDAL或者rasterio讀取后堆疊成三維數(shù)組。需要注意的是珠海一號的輻射定標系數(shù)在元數(shù)據(jù)文件里轉反射率之前必須做輻射定標否則不同時相的數(shù)據(jù)沒法直接比較。2.3 深度學習專用數(shù)據(jù)集ICVL與HarvardICVL數(shù)據(jù)集原本是做光譜重建用的包含201個場景的高光譜圖像波段數(shù)31個波長范圍400到700納米空間分辨率1392乘1300。后來很多人拿它做分類和超分辨率的預訓練。這個數(shù)據(jù)集在ICVL項目主頁上提供下載格式是.mat每個文件包含一個reflectance立方體。轉反射率的時候要注意ICVL已經做過輻射定標直接除以白板參考就行。Harvard數(shù)據(jù)集包含50個場景波段數(shù)31個波長范圍420到720納米空間分辨率1392乘1040。它的特點是場景多樣有室內、室外、人臉、紙張等適合做跨域遷移學習。下載后需要自己切patch一般取32乘32或者64乘64重疊率設一半這樣能保證樣本量足夠。2.4 數(shù)據(jù)集對比速查表數(shù)據(jù)集傳感器波段數(shù)空間分辨率類別數(shù)適用任務Indian PinesAVIRIS20020m16分類、降維SalinasAVIRIS2043.7m16分類、空譜聯(lián)合Pavia UniversityROSIS1031.3m9分類、目標檢測GF-5AHSI33030m按需蝕變提取、水質珠海一號OHS3210m按需時間序列、農業(yè)ICVLSpecim311392x1300無光譜重建、預訓練HarvardSpecim311392x1040無遷移學習、重建這張表建議存下來選數(shù)據(jù)集的時候先看任務類型和空間分辨率是否匹配。做精細農業(yè)分類Pavia University和Salinas更合適做大范圍礦物填圖GF-5的波段覆蓋更有優(yōu)勢做光譜重建預訓練ICVL和Harvard的樣本量足夠。3. 下載之后怎么用從原始文件到可訓練數(shù)據(jù)3.1 數(shù)據(jù)讀取與格式轉換下載下來的文件格式主要有三種.mat、GeoTIFF和ENVI標準格式。.mat用Python讀取最方便一行代碼就能加載import scipy.io as sio data sio.loadmat(Indian_pines_corrected.mat) cube data[indian_pines_corrected] # 形狀 (145, 145, 200) gt sio.loadmat(Indian_pines_gt.mat)[indian_pines_gt]GeoTIFF用rasterio讀取注意波段順序。有些國產數(shù)據(jù)是BSQ格式存儲讀取后需要轉成BIP或者BIL否則按像素取光譜曲線時會出錯。ENVI格式用spectral庫讀取header文件里的interleave字段決定了內存布局data ignore value字段標記了無效像元這些細節(jié)不注意的話后面做歸一化會把背景值也算進去。注意讀取后先檢查數(shù)據(jù)范圍。如果最大值是65535說明是uint16需要除以65535轉成0到1如果最大值是1附近說明已經歸一化過不要再除。3.2 輻射定標與反射率轉換高光譜轉反射率是繞不開的一步。原始DN值受太陽高度角、大氣條件、傳感器增益影響直接拿來做分類不同時相的數(shù)據(jù)分布會漂移。標準流程是輻射定標得到輻亮度再大氣校正得到反射率。ENVI里的FLAASH模塊可以做大氣校正但參數(shù)多新手容易卡在氣溶膠模型選擇上。如果只是做算法驗證可以用簡化方法找一塊已知反射率的白板區(qū)域計算白板像元的平均DN值然后整幅影像除以這個值。公式是reflectance DN / mean(white_panel_DN)這個方法在ICVL和Harvard上夠用因為采集時已經放了白板。但GF-5和珠海一號的數(shù)據(jù)必須走完整的大氣校正流程否則短波紅外波段的反射率會偏高影響礦物指數(shù)計算。3.3 切patch與樣本增強深度學習模型需要固定尺寸的輸入所以要把大圖切成小patch。常用尺寸是32乘32或64乘64步長設成patch尺寸的一半這樣能保證邊緣樣本也被覆蓋到。切之前先做PCA降維把200個波段降到30個左右既能保留主要信息又能減少計算量。樣本增強在高光譜里特別重要因為標注樣本少。常用的方法有隨機翻轉、隨機旋轉90度、加高斯噪聲、波段隨機丟棄。我試過在Indian Pines上做五折增強把每類樣本擴到原來的8倍分類精度能提升3到5個百分點。但要注意增強后的樣本不能跨訓練集和驗證集否則會數(shù)據(jù)泄漏。import numpy as np from sklearn.decomposition import PCA def extract_patches(cube, gt, patch_size32, stride16): h, w, b cube.shape pca PCA(n_components30) cube_pca pca.fit_transform(cube.reshape(-1, b)).reshape(h, w, 30) patches, labels [], [] for i in range(0, h - patch_size 1, stride): for j in range(0, w - patch_size 1, stride): patch cube_pca[i:ipatch_size, j:jpatch_size, :] label gt[ipatch_size//2, jpatch_size//2] if label 0: patches.append(patch) labels.append(label) return np.array(patches), np.array(labels)這段代碼可以直接跑注意PCA要在整幅影像上擬合不能只在訓練集上擬合否則驗證集的分布會不一致。4. 典型應用場景與實操案例4.1 基于U-Net的遙感圖像語義分割U-Net在高光譜分割里用得很多尤其是做地物面積估算。輸入是降維后的patch輸出是每個像素的類別概率。編碼器用卷積加池化解碼器用反卷積加跳躍連接。損失函數(shù)用加權交叉熵權重按類別頻率的倒數(shù)設置這樣能緩解類別不平衡。訓練時batch size設16學習率1e-3用Adam優(yōu)化器跑100個epoch。在Pavia University上U-Net的總體精度能到95%以上Kappa系數(shù)0.93左右。推理階段用滑動窗口重疊率設一半最后取平均這樣能消除拼接處的接縫。4.2 基于YOLOv8的高光譜目標檢測YOLOv8原本是做RGB目標檢測的但把輸入通道改成高光譜波段數(shù)后也能用。關鍵是把高光譜數(shù)據(jù)轉成偽彩色圖像或者直接取前三個主成分當RGB。訓練自己的數(shù)據(jù)集時標注文件用YOLO格式每行是類別 x_center y_center width height坐標歸一化到0到1。數(shù)據(jù)增強用Mosaic和MixUp學習率用余弦退火從1e-2降到1e-4。在自建的農田地塊數(shù)據(jù)集上YOLOv8的mAP能到0.85左右。但要注意高光譜的波段數(shù)多直接輸入YOLOv8會導致計算量爆炸建議先用PCA降到3到5個波段或者用1x1卷積做波段選擇。4.3 基于隨機森林的傳統(tǒng)分類不是所有場景都需要深度學習。樣本量少、特征維度高的時候隨機森林反而更穩(wěn)。在Indian Pines上用原始光譜曲線加一階導數(shù)特征隨機森林的精度能到85%左右訓練時間不到一分鐘。參數(shù)調優(yōu)主要看樹的數(shù)量和最大深度樹的數(shù)量設500最大深度設20基本夠用。from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test train_test_split( features, labels, test_size0.3, random_state42 ) rf RandomForestClassifier(n_estimators500, max_depth20, n_jobs-1) rf.fit(X_train, y_train) print(rf.score(X_test, y_test))隨機森林的好處是可解釋性強能輸出特征重要性幫你判斷哪些波段對分類貢獻大。我試過在Salinas上做波段選擇用隨機森林的重要性排序取前50個波段精度只掉了1個百分點但計算量減少了一半。5. 常見問題與排查技巧實錄5.1 下載鏈接失效怎么辦公開數(shù)據(jù)集的鏈接失效是常態(tài)。我的經驗是先看論文的補充材料很多作者會把數(shù)據(jù)放在Google Drive或者Dropbox上如果失效去Kaggle或者IEEE DataPort搜同名數(shù)據(jù)集通常有人搬運再不行就發(fā)郵件給通訊作者學術圈里要數(shù)據(jù)一般都會給。提示下載大文件時用下載工具比如aria2或者IDM支持斷點續(xù)傳避免下到一半斷了重來。5.2 波段順序對不上怎么排查不同傳感器的波段順序不一樣AVIRIS是BIPROSIS是BIL國產數(shù)據(jù)有的是BSQ。讀取后先看header文件里的interleave字段或者用cube.shape判斷。如果形狀是(h, w, b)說明是BIP如果是(b, h, w)說明是BSQ需要轉置。轉置用np.transpose(cube, (1, 2, 0))。5.3 訓練時loss不下降怎么調高光譜分類loss不下降常見原因有三個學習率太大、數(shù)據(jù)沒歸一化、標簽有噪聲。先檢查數(shù)據(jù)范圍確保在0到1之間再把學習率降到1e-4試試如果還不行可視化幾個樣本的光譜曲線看看有沒有異常值。我遇到過標簽文件里背景值沒清零的情況導致模型把背景也當一類學loss一直震蕩。5.4 常見問題速查表問題現(xiàn)象可能原因解決方法下載鏈接打不開鏈接失效找Kaggle鏡像或聯(lián)系作者讀取后形狀不對存儲格式不同檢查interleave字段并轉置反射率大于1未做大氣校正走FLAASH或白板歸一化訓練loss震蕩學習率過大降到1e-4并加梯度裁剪驗證精度遠低于訓練過擬合加Dropout和數(shù)據(jù)增強推理結果有接縫滑動窗口重疊不足重疊率設50%并取平均5.5 獨家避坑技巧第一個技巧下載數(shù)據(jù)集后先做一次全量備份放在兩個不同的物理硬盤上。我吃過虧有一次硬盤壞了重新下載花了三天。第二個技巧用DVC或者Git LFS管理數(shù)據(jù)版本每次預處理后的數(shù)據(jù)都打標簽這樣實驗可復現(xiàn)。第三個技巧切patch之前先做壞波段剔除用np.isfinite檢查NaN用np.percentile檢查異常值否則訓練時會出現(xiàn)loss為NaN的情況。6. 數(shù)據(jù)集的擴展與二次開發(fā)6.1 自建數(shù)據(jù)集的標注流程公開數(shù)據(jù)集不夠用的時候自建是唯一出路。標注工具用LabelMe或者QGIS前者適合做像素級標注后者適合做地塊級矢量標注。標注完導出成GeoTIFF或者shapefile再用GDAL轉成模型需要的格式。標注時注意類別定義要清晰比如“農田”和“草地”的邊界要統(tǒng)一標準否則不同人標出來的結果不一致。6.2 多模態(tài)數(shù)據(jù)融合高光譜加LiDAR是現(xiàn)在比較熱的方向。LiDAR提供高程信息高光譜提供光譜信息兩者融合能提升分類精度。融合方法有早期融合和晚期融合早期融合是把LiDAR的強度和高程當成額外波段拼到高光譜立方體后面晚期融合是分別訓練兩個模型再投票。我試過在Pavia University上加模擬的LiDAR數(shù)據(jù)早期融合的精度比單模態(tài)高2個百分點。6.3 遷移學習與預訓練ICVL和Harvard的樣本量大適合做預訓練。先在ICVL上訓練一個自編碼器學到光譜的通用表示再把編碼器遷移到Indian Pines上做分類只需要少量標注樣本就能達到不錯的精度。這種方法在小樣本場景下特別有用比如做礦物填圖時標注樣本可能只有幾百個。import torch import torch.nn as nn class SpectralEncoder(nn.Module): def __init__(self, in_bands31, latent_dim64): super().__init__() self.encoder nn.Sequential( nn.Linear(in_bands, 128), nn.ReLU(), nn.Linear(128, latent_dim), nn.ReLU() ) def forward(self, x): return self.encoder(x)這個編碼器結構簡單但在ICVL上預訓練后遷移到其他數(shù)據(jù)集上效果不錯。關鍵是預訓練時用重構損失遷移時凍結編碼器只訓練分類頭。7. 工具鏈與效率提升7.1 Python生態(tài)核心庫處理高光譜數(shù)據(jù)Python生態(tài)里最常用的庫有scipy.io讀.matrasterio讀GeoTIFFspectral讀ENVIscikit-learn做降維和分類torch和tensorflow做深度學習。spectral庫雖然更新慢但讀ENVI格式很穩(wěn)建議裝0.22版本。rasterio讀大文件時用window參數(shù)做分塊讀取避免內存溢出。7.2 MATLAB用戶的快速上手MATLAB在高光譜領域依然有優(yōu)勢尤其是hyperspectral工具箱。讀數(shù)據(jù)用multibandread做PCA用pca分類用fitcecoc。MATLAB的優(yōu)點是矩陣操作快可視化方便缺點是深度學習生態(tài)不如Python。我的建議是預處理和傳統(tǒng)算法用MATLAB深度學習用Python兩者通過.mat文件交換數(shù)據(jù)。7.3 計算資源規(guī)劃高光譜數(shù)據(jù)量大Indian Pines的立方體是145乘145乘200約420萬個浮點數(shù)內存占用16MB左右。但GF-5的幅寬是60公里空間分辨率30米單景影像有2000乘2000個像素330個波段內存占用超過5GB。處理這種數(shù)據(jù)需要至少32GB內存GPU顯存建議8GB以上。如果資源不夠用分塊處理每次讀一個窗口處理完寫回磁盤。注意分塊處理時塊與塊之間要留重疊區(qū)域否則拼接后會有接縫。重疊寬度至少等于patch尺寸。8. 個人實操體會與后續(xù)方向我在實際項目里最大的體會是數(shù)據(jù)集的質量比算法的復雜度更重要。同樣一個U-Net在標注干凈的Salinas上能到95%在標注粗糙的自建數(shù)據(jù)上可能只有70%。所以拿到數(shù)據(jù)后先花時間做數(shù)據(jù)清洗和標注校驗比急著調模型參數(shù)劃算得多。另外高光譜轉反射率這一步不能省。我見過有人直接用DN值訓練在訓練集上精度很高換一景影像就崩了。反射率是物理量不同傳感器、不同時相的數(shù)據(jù)才有可比性。如果實在做不了大氣校正至少要做白板歸一化把量綱統(tǒng)一。后續(xù)如果要做擴展我建議往兩個方向走一是多模態(tài)融合把高光譜和SAR、LiDAR結合提升復雜場景下的分類魯棒性二是自監(jiān)督預訓練用大量無標注高光譜數(shù)據(jù)學表示再遷移到小樣本任務上。這兩個方向目前都有開源代碼可以參考上手門檻不算高。最后分享一個小技巧下載數(shù)據(jù)集時把下載鏈接、文件MD5、預處理腳本放在同一個文件夾里用README記錄每一步操作。這樣過幾個月再回頭看能快速復現(xiàn)實驗不用重新踩坑。