一个很简单的练习,对一个80个波段的高光谱遥感图像进行监督分类。
总体思路是:①在图片中选出训练集与测试集,训练出ELM模型,通过精度评价不断调整参数;②把全部图像加载到模型中,得到分类输出Y;③把Y还原成图像,与原图进行对比。
一、 获得训练集与测试集
①在ENVI/ROI中选出一些样本并进行分类
②将其输出,得到TXT形式的数据。
一共分了多少类,就输出多少次TXT,每次只输出一类。
③将数据导入matlab
这里可以先将所有数据导入matlab,再给所有数据标记类标1234,也可以先将数据导入Excel,对所有数据标记完类标1234后再导入matlab。
用代码data1=importdata('XX.TXT');
最后得到如图的数据。
81是因为80个波段+1个分类
④对数据进行预处理
对所有数据进行均值归一化处理:for i=1:size(dataset,2)-1;%减1是因为最后一列是类标 dataset(:,i)=(dataset(:,i)-min(dataset(:,i)))/(max(dataset(:,i))-min(dataset(:,i)))*2-1; end
这个预处理在黄广斌老师的主页有开源代码,下面用到的ELM代码也是黄老师主页上下载的开源代码。
二、 训练ELM模型
这个没啥技术含量,化身调参侠,去网上下好代码,调调参数Number_of_HiddenNeurons就OK,
三、把全部图像放入模型中
①导入全部图像数据
把TIFF文件拖入matlab,注意,一定要是TIFF文件。拖入后会看到如下提示,点击完成即可
这时候要注意,导入后得到了一个17853180的矩阵,为了方便处理,需要把这个矩阵拉成一个(178*531)*80的矩阵,temps=reshape(area,size(area,1)*size(area,2),size(area,3));
注意,这里得到的(178*531)*80矩阵是unit16型,即属于0~2^16-1的整数,整数!整数!!整数!!!导致在对这组数据进行均值归一化处理时结果会自动取整,从而出现错误。因此,要使用dataset=double(temps);
把它们变成double型(我在百度这个问题时,有大佬说double后可能会出现精度误差,我也没看太懂,好奇的宝宝们可以自己去查一下)。
②数据处理
直接上代码
temps=reshape(area,size(area,1)*size(area,2),size(area,3));
dataset=double(temps);
for i=1:size(dataset,2)
dataset(:,i)=(dataset(:,i)-min(dataset(:,i)))/(max(dataset(:,i))-min(dataset(:,i)))*2-1;
end
P=dataset;
%InputWeight与OutputWeight由调试后的模型得到
NumberofTrainingData=size(P',2);
ind=ones(1,NumberofTrainingData);
BiasMatrix=BiasofHiddenNeurons(:,ind);% 扩展BiasMatrix矩阵大小与H匹配
tempH=InputWeight*P';
tempH=tempH+BiasMatrix;
H = 1 ./ (1 + exp(-tempH));
Y=(H' * OutputWeight)';
predict=zeros(size(P,1),1);
for i = 1 : size(P,1);
[x,pre]=max(Y(:,i));
predict(i,1)=pre;
end
得到结果应该是一个(178*531)*1的矩阵。
如果把三维数据M✖N✖D挨个像素输入模型的话,得到的类标是M✖N的。为便于处理,实际输入的数据是(MN)✖D的,因此输出的类标是(MN)的,需要把这个(MN)的向量转换成M✖N的矩阵。把m✖n✖d变成mn✖d是为了方便处理,但它的意义没有变。最后的输出应该是M✖N✖1的形式,而不是MN✖1的形式。因此需要把上述矩阵转化成178✖531✖1的,具体代码为:Pre=reshape(predict,size(area,1),size(area,2));
四、还原图像
把Pre这个矩阵用matlab画出来即可