遥感图像地物覆盖分类,数据集制作-分类模型对比-分类保姆级教程

news2024/12/24 0:20:49

在遥感影像上人工制作分类数据集

1.新建shp文件
地理坐标系保持和影像一致,面类型
在这里插入图片描述
2.打开属性表
在这里插入图片描述
3.添加字段
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
这里分类6类,点击添加值添加
在这里插入图片描述
添加完毕
在这里插入图片描述
开始人工选地物类型,制作数据集
在这里插入图片描述

在这里插入图片描述

开始标注,标注的时候可以借助谷歌地图来看
在这里插入图片描述
标记足够多的样本
在这里插入图片描述
打开面转栅格工具
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
设置nodata值为15

采用python+gdal库制作数据集



import csv
import numpy as np
import rasterio
import pandas as pd


def readTif(fileName):
    try:
        dataset = rasterio.open(fileName)
        return dataset
    except rasterio.errors.RasterioIOError:
        print(f"文件 {fileName} 无法打开")
        return None


num_bands = 8
csv_head_name = [f'Band{i}' for i in range(1, num_bands + 1)] + ['Label', 'LabelName']
labels_name = {0: "水体", 1: "植被",2: "建筑",3: "裸地",4: "农田",5: "道路"}

ori_dataset = readTif(orgin_path)
label_dataset = readTif(sample_path)

if ori_dataset is not None and label_dataset is not None:
    label_matri = label_dataset.read(1)
    data_matri = ori_dataset.read()
    nodata_indices = np.where(label_matri != 15)  # 获取所有非 nodata 的索引


    # 准备数据
    data = []
    for i in range(nodata_indices[0].size):
        row, col = nodata_indices[0][i], nodata_indices[1][i]
        label = label_matri[row, col]
        band_values = data_matri[:, row, col].tolist()
        label_name = labels_name.get(label, 'Unknown')
        band_values.extend([label, label_name])
        data.append(band_values)

    df = pd.DataFrame(data, columns=csv_head_name)

    # 下采样多数类
    g = df.groupby('LabelName')
    df = g.apply(lambda x: x.sample(g.size().min())).reset_index(drop=True)
    #首先将所有数据读取到一个Pandas DataFrame中。然后,使用DataFrame的groupby方法按标签进行分组,并应用sample函数对每个类别进行随机抽样,抽样数等于所有类别中样本最少的那个。这样做可以确保每个类别在最终数据集中有相同数量的样本,从而达到类别平衡。首先将所有数据读取到一个Pandas DataFrame中。
    # 然后,使用DataFrame的groupby方法按标签进行分组,并应用sample函数对每个类别进行随机抽样,抽样数等于所有类别中样本最少的那个。这样做可以确保每个类别在最终数据集中有相同数量的样本,从而达到类别平衡。
    # 写入 CSV
    df.to_csv(csv_filename, index=False, encoding='utf_8_sig')
    print(f"已将数据写入 CSV 文件: {csv_filename}")

得到的表格如下
在这里插入图片描述

挑选分类模型



import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.model_selection import train_test_split, cross_val_score
from sklearn.metrics import confusion_matrix, accuracy_score
import numpy as np

# 读取CSV文件的路径
path = r"F:\datasets\ZY1E\不透水面提取\地物覆盖分类\labels.csv"

# 读取数据集
data = pd.read_csv(path)

# 划分数据与标签
x = data.iloc[:, 0:8]  # 假设前8列是数据
y = data['Label']  # 标签在'Label'列

# 划分训练集和测试集
train_data, test_data, train_label, test_label = train_test_split(x, y, random_state=1, train_size=0.7, test_size=0.3)

# 创建各种模型
models = {
    'Random Forest': RandomForestClassifier(n_estimators=100, bootstrap=True, max_features='sqrt'),
    'SVM': SVC(kernel='linear', C=1, decision_function_shape='ovr'),
    'Logistic Regression': LogisticRegression(max_iter=1000),
    'KNN': KNeighborsClassifier(n_neighbors=5)
}

# 训练并评估模型
for name, model in models.items():
    try:
        model.fit(train_data, train_label.ravel())  # 训练模型
        train_pred = model.predict(train_data)
        test_pred = model.predict(test_data)
    except Exception as e:
        print(f"在模型 {name} 中发生错误: {str(e)}")
        continue

    print(f"\n{name}:")
    print("  训练集准确率:", accuracy_score(train_label, train_pred))
    print("  测试集准确率:", accuracy_score(test_label, test_pred))
    print("  交叉验证准确率:", np.mean(cross_val_score(model, x, y, cv=5)))
    print("  训练集混淆矩阵:\n", confusion_matrix(train_label, train_pred))
    print("  测试集混淆矩阵:\n", confusion_matrix(test_label, test_pred))

得到输出结果

Random Forest:
训练集准确率: 1.0
测试集准确率: 0.9258809234507898
交叉验证准确率: 0.9128402004972545
训练集混淆矩阵:
[[319 0 0 0 0 0]
[ 0 314 0 0 0 0]
[ 0 0 304 0 0 0]
[ 0 0 0 332 0 0]
[ 0 0 0 0 334 0]
[ 0 0 0 0 0 316]]
测试集混淆矩阵:
[[138 0 0 0 0 0]
[ 0 139 1 0 3 0]
[ 0 0 138 1 1 13]
[ 0 0 1 123 0 1]
[ 0 17 0 2 104 0]
[ 0 0 18 3 0 120]]

SVM:
训练集准确率: 0.7634184471078687
测试集准确率: 0.7800729040097205
交叉验证准确率: 0.7629439059737013
训练集混淆矩阵:
[[317 0 0 0 0 2]
[ 0 233 0 1 78 2]
[ 0 1 186 55 1 61]
[ 0 3 18 241 19 51]
[ 0 81 0 15 223 15]
[ 4 0 41 6 0 265]]
测试集混淆矩阵:
[[138 0 0 0 0 0]
[ 0 108 0 1 34 0]
[ 0 1 98 30 0 24]
[ 0 2 2 102 8 11]
[ 0 34 0 6 78 5]
[ 1 0 20 2 0 118]]

Logistic Regression:
训练集准确率: 0.7535174570088587
测试集准确率: 0.7533414337788579
交叉验证准确率: 0.7654939970483826
训练集混淆矩阵:
[[319 0 0 0 0 0]
[ 1 192 0 1 118 2]
[ 0 1 180 58 1 64]
[ 0 0 20 243 18 51]
[ 0 59 0 15 247 13]
[ 12 0 32 7 0 265]]
测试集混淆矩阵:
[[138 0 0 0 0 0]
[ 0 82 0 1 60 0]
[ 0 1 98 29 0 25]
[ 0 0 5 100 9 11]
[ 0 26 0 6 86 5]
[ 4 0 20 1 0 116]]

KNN:
训练集准确率: 0.9322563835330901
测试集准确率: 0.9015795868772782
交叉验证准确率: 0.90445468203635
训练集混淆矩阵:
[[318 0 0 0 0 1]
[ 0 292 1 0 21 0]
[ 0 0 255 20 1 28]
[ 0 0 0 326 0 6]
[ 0 25 0 1 308 0]
[ 0 0 20 6 0 290]]
测试集混淆矩阵:
[[137 0 0 0 0 1]
[ 0 128 1 3 11 0]
[ 0 0 127 5 1 20]
[ 0 0 0 123 0 2]
[ 0 19 0 1 103 0]
[ 0 0 13 3 1 124]]

Process finished with exit code 0

选择随机森林模型建模分类




import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import train_test_split, cross_val_score
import pickle
from sklearn.metrics import confusion_matrix
import numpy as np

# 读取CSV文件的路径


# 1.读取数据集
data = pd.read_csv(path)

# 2.划分数据与标签
x = data.iloc[:, 0:8]  # 假设前8列是数据
y = data['Label']  # 假设标签在'Label'列

# 3.划分训练集和测试集
train_data, test_data, train_label, test_label = train_test_split(x, y, random_state=1, train_size=0.7, test_size=0.3)

# 4.创建随机森林模型并训练
classifier = RandomForestClassifier(n_estimators=100, bootstrap=True, max_features='sqrt')
classifier.fit(train_data, train_label.ravel())  # ravel函数拉伸到一维

# 5.计算准确率
print("训练集准确率:", classifier.score(train_data, train_label))
print("测试集准确率:", classifier.score(test_data, test_label))

# 6.交叉验证
scores = cross_val_score(classifier, x, y, cv=5)  # 5折交叉验证
print("平均交叉验证准确率:", np.mean(scores))

# 7.特征重要性
feature_importances = pd.Series(classifier.feature_importances_, index=x.columns)
print("特征重要性:\n", feature_importances.sort_values(ascending=False))

# 8.混淆矩阵
train_pred = classifier.predict(train_data)
test_pred = classifier.predict(test_data)
print("训练集混淆矩阵:\n", confusion_matrix(train_label, train_pred))
print("测试集混淆矩阵:\n", confusion_matrix(test_label, test_pred))

# 9.保存模型
with open(SavePath, "wb") as file:
    pickle.dump(classifier, file)

训练集准确率: 1.0
测试集准确率: 0.9149453219927096
平均交叉验证准确率: 0.9146590350072461
特征重要性:
Band8 0.177021
Band4 0.145268
Band5 0.139987
Band1 0.132925
Band7 0.125840
Band3 0.103912
Band2 0.093239
Band6 0.081808
dtype: float64
训练集混淆矩阵:
[[319 0 0 0 0 0]
[ 0 314 0 0 0 0]
[ 0 0 304 0 0 0]
[ 0 0 0 332 0 0]
[ 0 0 0 0 334 0]
[ 0 0 0 0 0 316]]
测试集混淆矩阵:
[[138 0 0 0 0 0]
[ 0 140 1 0 2 0]
[ 0 0 134 1 1 17]
[ 0 0 0 123 0 2]
[ 0 16 0 2 105 0]
[ 0 0 21 7 0 113]]

遥感图像预测


import numpy as np
import gdal
import pickle
#读取tif数据集
def readTif(fileName):
    dataset = gdal.Open(fileName)
    if dataset == None:
        print(fileName+"文件无法打开")
    return dataset
#保存tif文件函数
def writeTiff(im_data,im_geotrans,im_proj,path):
    if 'int8' in im_data.dtype.name:
        datatype = gdal.GDT_Byte
    elif 'int16' in im_data.dtype.name:
        datatype = gdal.GDT_UInt16
    else:
        datatype = gdal.GDT_Float32
    if len(im_data.shape) == 3:
        im_bands, im_height, im_width = im_data.shape
    elif len(im_data.shape) == 2:
        im_data = np.array([im_data])
        im_bands, im_height, im_width = im_data.shape
    #创建文件
    driver = gdal.GetDriverByName("GTiff")
    dataset = driver.Create(path, int(im_width), int(im_height), int(im_bands), datatype)
    if(dataset!= None):
        dataset.SetGeoTransform(im_geotrans) #写入仿射变换参数
        dataset.SetProjection(im_proj) #写入投影
    for i in range(im_bands):
        dataset.GetRasterBand(i+1).WriteArray(im_data[i])
    del dataset



dataset = readTif(Landset_Path)
Tif_width = dataset.RasterXSize #栅格矩阵的列数
Tif_height = dataset.RasterYSize #栅格矩阵的行数
Tif_geotrans = dataset.GetGeoTransform()#获取仿射矩阵信息
Tif_proj = dataset.GetProjection()#获取投影信息
Landset_data = dataset.ReadAsArray(0,0,Tif_width,Tif_height)
#调用保存好的模型
#以读二进制的方式打开文件
file = open(RFpath, "rb")
#把模型从文件中读取出来
rf_model = pickle.load(file)
#关闭文件
file.close()
#用读入的模型进行预测
#  在与测试前要调整一下数据的格式
data = np.zeros((Landset_data.shape[0],Landset_data.shape[1]*Landset_data.shape[2]))
for i in range(Landset_data.shape[0]):
    data[i] = Landset_data[i].flatten()
data = data.swapaxes(0,1)
#  对调整好格式的数据进行预测
pred = rf_model.predict(data)
print("Unique predictions:", np.unique(pred))
print("Max prediction:", np.max(pred))
print("Min prediction:", np.min(pred))

#  同样地,我们对预测好的数据调整为我们图像的格式
pred = pred.reshape(Landset_data.shape[1],Landset_data.shape[2])
pred = pred.astype(np.uint8)
#  将结果写到tif图像里
writeTiff(pred,Tif_geotrans,Tif_proj,SavePath)

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1819526.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ISO17025认证是什么?怎么做?

ISO17025认证是一种国际通用的实验室质量管理体系认证,其目标是确保实验室的技术能力、管理水平以及测试结果的可靠性和准确性达到国际认可的标准。该认证由国际标准化组织(ISO)和国际电工委员会(IEC)联合发布&#xf…

代码随想录算法训练营第37天|● 56.合并区间● 738.单调递增的数字

合并区间 56. 合并区间 - 力扣&#xff08;LeetCode&#xff09; 按照左边界从小到大排序之后&#xff0c;如果 intervals[i][0] < intervals[i - 1][1] 即intervals[i]的左边界 < intervals[i - 1]的右边界&#xff0c;则一定有重叠。&#xff08;本题相邻区间也算重贴…

【JMeter接口测试工具】第二节.JMeter项目实战(下)【实战篇】

文章目录 前言一、接口弱压力测试二、高并发、高频率三、生成图形化报告总结 前言 一、接口弱压力测试 场景举例&#xff1a; 场景1:模拟半小时之内 1000 个用户访问服务器资源&#xff0c;要求平均响应时间在3000ms内&#xff0c;且错误率为0 实现步骤&#xff1a; 步骤一&am…

uniapp 展示地图,并获取当前位置信息(精确位置)

使用uniapp 提供的map标签 <map :keymapIndex class"container" :latitude"latitude" :longitude"longitude" ></map> 页面初始化的时候&#xff0c;获取当前的位置信息 created() {let that thisuni.getLocation({type: gcj02…

第三方软件测评公司可提供哪些测试服务类型?

第三方软件测评公司就是由软件研发方、需求方以外的检测单位承担的测试服务&#xff0c;第三方测评公司担任着一个中间公证人的角色&#xff0c;按照合同、相关标准获得公正的测试结论&#xff0c;客观评估软件产品质量&#xff0c;那么第三方软件测评公司可提供哪些测试服务类…

HTML列表和表格标签

目录 1.列表标签 1.1无序列表 1.2有序列表 1.3定义列表 2. 表格标签、 2.1表格标签的属性 2.2合并单元格 1.列表标签 1.1无序列表 <ul>: [type 属性&#xff1a; disc( 实心圆点 )( 默认 ) 、 circle( 空心圆圈 ) 、 square( 实心方块 )] <li>: 列表中…

服务器无法远程桌面连接,解决服务器进行无法远程桌面连接方法有哪些

当服务器无法建立远程桌面连接时&#xff0c;通常涉及多个层面的排查和修复。下面将详细列举一些专业的解决方法&#xff0c;以应对服务器远程桌面连接问题。 一、基础排查与验证 1. 确认网络连通性&#xff1a; - 使用ping命令检查客户端与服务器之间的网络连通性。 - …

3389端口修改工具,修改3389端口的操作

3389端口作为远程桌面协议&#xff08;RDP&#xff09;的默认端口&#xff0c;常常成为黑客攻击的目标。为了提高系统的安全性&#xff0c;修改3389端口成为一项重要的安全措施。本文将详细介绍如何使用3389端口修改工具进行专业操作&#xff0c;以确保系统的安全稳定。 一、备…

跟《经济学人》学英文:2024年6月8日这期:Part 01

本文是对《经济学人》杂志2024.6.8这期的英文学习。 Narendra Modi looks likely to serve a third term as India’s prime minister, after his Bharatiya Janata Party and its allies won a slim majority. The ruling alliance won 293 seats, compared with the opposi…

ios描述文件.mobileprovision 如何查看包含的设备 udid|IPA查看是否包含设备 UDID|轻松签查看证书是否包含自己设备 UDID

前言 之前蒲公英支持上传证书查看证书有效期和包含设备 【干货】IOS苹果P12证书有效性检测 及查看证书是否包含自己的设备 【干货】IOS苹果P12证书有效性检测 及查看证书是否包含自己的设备 - 路灯IT技术博客 - 后厂村路灯 如今蒲公英下架了该功能&#xff0c;已经没有证书检…

环境监控与管理平台

随着全球气候变化的日益严峻&#xff0c;环境监控与管理成为了当代社会不可或缺的重要任务。HiWoo Cloud平台&#xff0c;作为一款环境监控与管理平台&#xff0c;正以其卓越的性能、强大的功能和灵活的部署方式&#xff0c;为各行各业的环保事业提供强有力的技术支撑。 一、H…

Python写UI自动化--playwright(元素定位)

本篇详细分享playwright如何进行打断点、元素定位、填写输入框、点击等操作 目录 一、PyCharm打断点进行调试 二、浏览器开发者模式检查元素 三、通过CSS或XPath进行定位 四、输入框输入文本操作 五、点击操作 总结 一、PyCharm打断点进行调试 如图所示&#xff0c;我们…

高考志愿填报秘籍:大学篇

选择适合自己的大学和专业&#xff0c;对广大考生来说至关重要。从某种程度上来说&#xff0c;决定了考生未来所从事的行业和发展前景。为了帮助广大考生更加科学、合理地填报志愿&#xff0c;选择适合自己的大学和专业&#xff0c;本公众号将推出如何用AI填报高考志愿专栏文章…

vue-element-admin后台集成方案

官网&#xff1a;介绍 | vue-element-adminA magical vue adminhttps://panjiachen.github.io/vue-element-admin-site/zh/guide 1.git环境安装配置及简单操作 1.1git环境安装配置 git软件官网&#xff1a;Git - Downloads (git-scm.com)https://git-scm.com/downloads 下载…

python脚本实现arcgis离散型切片png格式十六进制名称转十进制名称

背景 Arcgis中离散型切片为png格式时,它的名称是十六进制格式的,而Arcgis不支持转为十进制格式的,所有需要自己写一个脚本来转换 效果 脚本 import osdef hex_to_dec(name):return str(int(name, 16))def

以bert为例,了解Lora是如何添加到模型中的

以bert为例,了解Lora是如何添加到模型中的 一.效果图1.torch.fx可视化A.添加前B.添加后 2.onnx可视化A.添加前B.添加后 3.tensorboard可视化A.添加前B.添加后 二.复现步骤1.生成配置文件(num_hidden_layers1)2.运行测试脚本 本文以bert为例,对比了添加Lora模块前后的网络结构图…

【Spine学习06】之IK约束绑定,制作人物待机动画,图表塞贝尔曲线优化动作

引入IK约束的概念&#xff1a; 约束目标父级 被约束骨骼子集 这样理解更好&#xff0c;约束目标可以控制被约束的两个骨骼运作 IK约束绑定过程中呢&#xff0c;如果直接绑定最下面的脚掌骨骼会发生偏移&#xff0c;所以在开始处理IK之前&#xff0c;需要先设置一个ROOT结点下的…

签到的二维码怎么制作?快速实现制作二维码签到的方法

现在很多活动会采用二维码的方式来做登记、报名、签到等&#xff0c;通过二维码可以快速获取用户信息&#xff0c;并且对于用户填写内容也提升了便利性&#xff0c;而且还能够节约成本&#xff0c;通过后台就可以查看用户登记的数据&#xff0c;方便后期的分析和信息管理。 想…

自监督分类网络:创新的端到端学习方法

现代人工智能的快速发展中&#xff0c;分类任务的高效解决方案一直备受关注。今天&#xff0c;我们向大家介绍一种名为Self-Classifier的全新自监督端到端分类学习方法。由Elad Amrani、Leonid Karlinsky和Alex Bronstein团队开发&#xff0c;Self-Classifier通过优化同一样本的…

【机器学习】QLoRA:基于PEFT亲手微调你的第一个AI大模型

目录 一、引言 二、量化与微调—原理剖析 2.1 为什么要量化微调? 2.2 量化&#xff08;Quantization&#xff09; 2.2.1 量化原理 2.2.2 量化代码 2.3 微调&#xff08;Fine-Tuning&#xff09; 2.3.1 LoRA 2.3.2 QLoRA 三、量化与微调—实战演练&#xff1a;以Qwen…