吹爆!遥感高光谱分类(Python)

目录

一、数据集下载

二、安装包

三、数据处理

四、模型训练

五、模型推理

六、踩坑记录


一、数据集下载

Hyperspectral Remote Sensing Scenes - Grupo de Inteligencia Computacional (GIC) (ehu.eus)

Installing SPy --- Spectral Python 0.21 documentation

二、安装包

Spectral Python (SPy)是一个用于处理高光谱图像数据的纯Python模块。它具有读取、显示、操作和分类高光谱图像的功能。

Spectral安装:

官网链接:

Installing SPy --- Spectral Python 0.21 documentation

安装命令:

复制代码
pip install spectral   

三、数据处理

加载数据、统计元素个数、光谱图显示、重构需要用到的类、标准化数据并存储

复制代码
import matplotlib.pyplot as plt  
import numpy as np
from scipy.io import loadmat
import spectral
import cv2
import pandas as pd
from sklearn import preprocessing

print("OpenCV version:", cv2.__version__)
print("Spectral version:", spectral.__version__)

input_image = loadmat(r'C:\xxxxxxxxxxxxxxxxxxxxxxx/KSC.mat')['KSC']  #数据
output_image = loadmat(r'C:\xxxxxxxxxxxxxxxxxxxxxx/KSC_gt.mat')['KSC_gt']#标签

dict_k = {}
for i in range(output_image.shape[0]):
    for j in range(output_image.shape[1]):
        #if output_image[i][j] in [m for m in range(1,17)]:
        if output_image[i][j] in [1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,12,13]:
            if output_image[i][j] not in dict_k:
                dict_k[output_image[i][j]]=0
            dict_k[output_image[i][j]] +=1
            
print (dict_k)
#print (reduce(lambda x,y:x+y,dict_k.values()))


ksc_color =np.array([[255,255,255],
     [184,40,99],
     [74,77,145],
     [35,102,193],
     [238,110,105],
     [117,249,76],
     [114,251,253],
     [126,196,59],
     [234,65,247],
     [141,79,77],
     [183,40,99],
     [0,39,245],
     [90,196,111],
        ])

ground_truth = spectral.imshow(classes = output_image.astype(int),figsize =(9,9),colors=ksc_color)

cv2.imshow('1',output_image)  #没有实质性的作用,解决spectral.imshow闪退问题
cv2.waitKey(0)


# 除掉 0 这个非分类的类,把所有需要分类的元素提取出来
need_label = np.zeros([output_image.shape[0],output_image.shape[1]])
for i in range(output_image.shape[0]):
    for j in range(output_image.shape[1]):
        if output_image[i][j] != 0:
            need_label[i][j] = output_image[i][j]
        
            
new_datawithlabel_list = []
for i in range(output_image.shape[0]):
    for j in range(output_image.shape[1]):
        if need_label[i][j] != 0:
            c2l = list(input_image[i][j])
            c2l.append(need_label[i][j])
            new_datawithlabel_list.append(c2l)

new_datawithlabel_array = np.array(new_datawithlabel_list)  
data_D = preprocessing.StandardScaler().fit_transform(new_datawithlabel_array[:,:-1])
data_L = new_datawithlabel_array[:,-1]

new = np.column_stack((data_D,data_L))
new_ = pd.DataFrame(new)
new_.to_csv(r'C:xxxxxxxx/KSC.csv',header=False,index=False)# 将结果存档后续处理

四、模型训练

复制代码
import joblib
from sklearn.model_selection import KFold
from sklearn.model_selection import train_test_split
import numpy as np
from sklearn.svm import SVC
from sklearn import metrics
from sklearn import preprocessing
import pandas as pd


# 导入数据集切割训练与测试数据
data = pd.read_csv(r'C:xxxxxxxxxxxxx/KSC.csv',header=None)
data = data.values
data_D = data[:,:-1]
data_L = data[:,-1]
data_train, data_test, label_train, label_test = train_test_split(data_D,data_L,test_size=0.5)


# 模型训练与拟合
clf = SVC(kernel='rbf',gamma=0.125,C=16)
clf.fit(data_train,label_train)
pred = clf.predict(data_test)
accuracy = metrics.accuracy_score(label_test, pred)*100
print (accuracy)


# 存储结果学习模型,方便之后的调用
joblib.dump(clf, "KSC_MODEL.m")

五、模型推理

复制代码
import matplotlib.pyplot as plt  
import numpy as np
from scipy.io import loadmat
import spectral
import joblib
from sklearn import metrics
import cv2

# KSC
input_image = loadmat(r'C:\xxxxxxxxxxx/KSC.mat')['KSC']
output_image = loadmat(r'C:\xxxxxxxxxx/KSC_gt.mat')['KSC_gt']


testdata = np.genfromtxt(r'C:\xxxxxxxx/KSC.csv',delimiter=',')
data_test = testdata[:,:-1]
label_test = testdata[:,-1]

clf = joblib.load("KSC_MODEL.m")

predict_label = clf.predict(data_test)
accuracy = metrics.accuracy_score(label_test, predict_label)*100

print (accuracy) # 97.1022836308


# 将预测的结果匹配到图像中
new_show = np.zeros((output_image.shape[0],output_image.shape[1]))
k = 0
for i in range(output_image.shape[0]):
    for j in range(output_image.shape[1]):
        if output_image[i][j] != 0 :
            new_show[i][j] = predict_label[k]
            k +=1 
            

# 展示地物
ground_truth = spectral.imshow(classes = output_image.astype(int),figsize =(9,9))
ground_predict = spectral.imshow(classes = new_show.astype(int), figsize =(9,9))

cv2.imshow('1',output_image)
cv2.waitKey(0)

六、踩坑记录

(1)问题描述:spectral.imshow(img)时,图像一闪而过 ,并且spectral好像没有类似CV2waitKey方法。所以无法暂停。

C:\Users\admin\AppData\Roaming\Python\Python38\site-packages\spectral\graphics\spypylab.py:796: UserWarning: Failed to create RectangleSelector object. Interactive pixel class labeling will be unavailable.

warnings.warn(msg)

解决方法:借助CV2的waitKey

在ground_truth = spectral.imshow(classes = output_image.astype(int),figsize =(9,9),colors=ksc_color)下加入cv图像显示

cv2.imshow('1',output_image)

cv2.waitKey(0)

(2)问题描述:AttributeError: module 'spectral' has no attribute 'preprocessing'

解决方法:

导入该模块

from sklearn import preprocessing

(3)问题描述:AttributeError: 'DataFrame' object has no attribute 'as_matrix'

解决方法:as_matrix()属性已被淘汰,所以DataFrame对象没有as_matrix属性

解决方法:将 as_matrix() 改为 values

示例如下:

将:

data = data.as_matrix()

改为:

data = data.values

相关推荐
故事挺秃然12 分钟前
NLP模型优化
人工智能·自然语言处理·nlp
嵌入式-老费16 分钟前
Easyx图形库应用(python+opencv的图形库开发)
开发语言·python·opencv
文火冰糖的硅基工坊21 分钟前
[人工智能-大模型-78]:模型层技术 - 深度神经网络的网络架构的演进,这不仅是一条技术路线图,更是一部 “机器如何逐步逼近人类认知方式” 的进化史诗。
人工智能·架构·dnn
IT古董22 分钟前
【第六章:项目实战之推荐/广告系统】3.精排算法-(2)精排算法模型精讲: DNN、deepFM、ESMM、PLE、MMOE算法精讲与实现- DNN 精排模型
人工智能·神经网络·dnn
IT古董23 分钟前
【第六章:项目实战之推荐/广告系统】3.精排算法-(2)精排算法模型精讲: DNN、deepFM、ESMM、PLE、MMOE算法精讲与实现- PLE 模型
人工智能·神经网络·dnn
Serverless 社区28 分钟前
吉利汽车携手阿里云函数计算,打造新一代 AI 座舱推理引擎
人工智能·阿里云·汽车
m0_64880493_江哥36 分钟前
Python实现随机选播视频的示例代码
前端·python·音视频
网上邻居YY41 分钟前
Arcgis表格数据导入+可视化--小白教程(以景观多样性指数为例)
图像处理·计算机视觉·arcgis·excel转表
没有梦想的咸鱼185-1037-16631 小时前
AI大模型支持下的:ArcGIS数据处理、空间分析、可视化及多案例综合应用
人工智能·arcgis·chatgpt·数据分析
青春不败 177-3266-05201 小时前
AI+ArcGIS:数据处理、空间分析、可视化前沿技术应
人工智能·arcgis·gis·生态学·可视化·数据处理