解锁多光谱图像数据集:从入门到精通的实战指南
1. 多光谱图像数据集入门指南第一次接触多光谱数据时我被那些五颜六色的波段图搞得晕头转向。记得当时为了搞明白WorldView-3卫星的8个波段分别代表什么整整花了两天时间查资料。现在回头看其实掌握多光谱数据并没有想象中那么难关键是要找到合适的学习路径。多光谱图像和普通RGB图像最大的区别在于信息维度。我们日常看到的照片只有红绿蓝三个通道而多光谱图像可能包含十几个甚至几十个波段。比如DFC2019数据集就包含了从可见光到近红外的多个光谱范围这些额外信息对于地物分类、环境监测等任务来说简直是宝藏。初学者最容易犯的错误就是直接拿多光谱数据当RGB图像处理。我刚开始就犯过这个错结果模型效果惨不忍睹。后来才发现不同波段之间往往存在强相关性需要先做波段选择或降维处理。这里推荐一个实用技巧先用PCA分析各波段的信息量再决定保留哪些波段。2. 主流数据集详解与获取2.1 DFC2019数据集实战这个数据集是我最推荐的入门选择原因很简单它既有完善的文档又有现成的baseline代码。数据集包含上海等多个城市的影像标注了6种地物类型。下载时要注意训练集和测试集是分开的总共约50GB。处理DFC2019时有个坑需要注意它的标注图像是用特定颜色编码的不能直接用作mask。官方提供的Python脚本可以帮你转换格式。我通常会用这个预处理代码import numpy as np def rgb_to_mask(rgb_image): color_map { (0, 0, 0): 0, # Unlabeled (0, 255, 0): 1, # Vegetation (0, 0, 255): 2, # Water (255, 255, 0): 3, # Road (255, 0, 255): 4, # Building (255, 255, 255): 5 # Bridge } mask np.zeros((rgb_image.shape[0], rgb_image.shape[1])) for rgb, idx in color_map.items(): mask[np.all(rgb_image np.array(rgb), axis-1)] idx return mask2.2 SpaceNet数据集的特殊之处SpaceNet系列最吸引人的是它的超高分辨率0.3米和丰富的标注类型。我特别推荐AOI_4_Shanghai这个子集它的建筑物标注非常精细。数据集包含全色、多光谱和融合后的图像总共8个波段。处理这类数据时要注意坐标系问题。SpaceNet使用WGS84坐标系而很多深度学习框架默认是像素坐标系。我建议先用GDAL读取数据确保地理信息不丢失gdalinfo MUL-PanSharpen/AOI_4_Shanghai_img100.tif3. 数据预处理技巧大全3.1 波段选择与融合不是所有波段都对特定任务有用。比如在做植被检测时近红外波段NIR就比可见光波段更重要。我常用的波段选择策略是先计算各波段的信噪比SNR再检查波段间相关性最后结合任务需求人工筛选对于WorldView-3数据我通常会保留以下波段海岸波段Coastal - 适合水域监测红边波段Red Edge - 植被生长状态近红外1NIR1 - 生物量估算3.2 数据增强的特殊技巧多光谱数据增强和RGB图像很不一样。你不能简单地对所有波段做同样的变换因为各波段间有严格的对应关系。我推荐使用albumentations库它支持多波段同步增强import albumentations as A transform A.Compose([ A.RandomRotate90(), A.Flip(), A.RandomBrightnessContrast(p0.5), A.GaussianBlur(p0.3) ], additional_targets{band2: image, band3: image})4. 实战项目农作物分类去年我用DeepGlobe数据集做过一个农作物分类项目效果还不错。这里分享下关键步骤数据准备下载训练集后先用我写的这个脚本检查数据完整性def check_dataset(root_dir): for img_file in Path(root_dir).glob(*_sat.jpg): mask_file img_file.with_name(img_file.name.replace(_sat.jpg, _mask.png)) if not mask_file.exists(): print(fMissing mask for {img_file})模型设计不要一上来就用复杂模型我建议先用简单的UNet试试。多光谱数据输入层要特别注意inputs Input((256, 256, 8)) # 对应8个波段 x Conv2D(64, 3, activationrelu, paddingsame)(inputs) # 后续UNet结构...训练技巧多光谱数据往往不平衡需要加权损失函数def weighted_crossentropy(y_true, y_pred): class_weights [0.1, 0.3, 0.2, 0.15, 0.15, 0.1] # 根据你的数据调整 y_true K.argmax(y_true, axis-1) weights K.gather(K.constant(class_weights), y_true) loss K.sparse_categorical_crossentropy(y_true, y_pred) return loss * weights5. 常见问题解决方案在Kaggle竞赛中我遇到过各种多光谱数据问题。这里总结几个典型场景问题1不同波段分辨率不一致WorldView-3的全色波段是0.3m分辨率而多光谱波段是1.24m。解决方案是使用pansharpening技术融合或统一resample到相同分辨率问题2大尺寸图像处理2448x2448的图像直接输入模型会OOM。我的做法是先用GDAL分块读取在线训练时随机裁剪小块预测时用滑动窗口from rasterio.windows import Window with rasterio.open(big_image.tif) as src: window Window(0, 0, 256, 256) chunk src.read(windowwindow)问题3标注质量不高特别是SpaceNet的建筑标注有时会有漏标。我开发了一个简单的检查工具def check_annotation(image, mask): fig, (ax1, ax2) plt.subplots(1, 2) ax1.imshow(image[..., [4,2,1]]) # 假彩色显示 ax2.imshow(mask) plt.show()6. 进阶技巧与优化当基本流程跑通后可以尝试这些优化方法波段组合优化通过统计分析找出最佳三波段组合from sklearn.decomposition import PCA pca PCA(n_components3) X_reshaped X.reshape(-1, X.shape[-1]) X_pca pca.fit_transform(X_reshaped)时序数据融合结合多时相数据提升精度多任务学习同时预测地物分类和高度信息我最近在一个项目中结合了DSM数据效果提升了约15%。关键代码结构如下def multi_task_model(): # 共享底层特征 base ResNet50(include_topFalse) # 分支1地物分类 x1 GlobalAveragePooling2D()(base.output) out1 Dense(6, activationsoftmax)(x1) # 分支2高度回归 x2 GlobalAveragePooling2D()(base.output) out2 Dense(1)(x2) return Model(inputsbase.input, outputs[out1, out2])7. 工具链推荐经过多个项目实践我总结出这套高效工具组合数据读取GDAL处理地理空间数据Rasterio更Pythonic的替代方案可视化EarthPy专业的多光谱可视化自己写的这个工具函数也很实用def plot_bands(image, bands[3,2,1], title): plt.figure(figsize(10,10)) plt.imshow(image[..., bands]) plt.title(title) plt.axis(off)模型训练Segmentation Models预训练模型库PyTorch Lightning简化训练流程部署工具ONNX跨平台模型导出TensorRTGPU加速推理这套工具组合帮我节省了大量时间特别是处理大型数据集时效率提升非常明显。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2514871.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!