当前位置: 首页 > news >正文

计算机视觉的应用19-基于pytorch框架搭建卷积神经网络CNN的卫星地图分类问题实战应用

大家好,我是微学AI,今天给大家介绍一下计算机视觉的应用19-基于pytorch框架搭建卷积神经网络CNN的卫星地图分类问题实战应用。随着遥感技术和卫星图像获取能力的快速发展,卫星图像分类任务成为了计算机视觉研究中一个重要的挑战。为了促进这一领域的研究进展,卫星图像分类问题数应运而生。本文将详细介绍遥感卫星图片分类项目,包括其背景、卫星图像分类数据集构建流程、数据集特点以及在卫星图像分类任务中的应用。
在这里插入图片描述

一、项目说明

随着城市化和环境监测需求的增加,卫星图像分类成为了很多应用场景中的核心任务。然而,由于数据集的有限性和复杂性,导致该任务的挑战性提高。为了解决这个问题,EuroSAT项目被启动,旨在创建一个大规模、多类别的卫星图像数据集,以推动卫星图像分类算法的发展。

二、数据集构建流程

EuroSAT数据集的构建过程主要分为以下几个步骤:
(1)数据采集:从欧洲空间局(ESA)的Sentinel-2卫星获取高分辨率的多光谱卫星图像。
(2)数据预处理:对采集到的原始图像进行预处理,包括遥感图像纠正、边缘对齐和亮度调整等。
(3)样本选择:根据地理标签和类别信息,选择合适的区域作为样本,并手动标注每个样本的类别标签。
(4)数据增强:通过旋转、平移、缩放等变换方式,对每个样本进行数据增强,扩充数据集规模和多样性。
(5)数据集划分:将数据集划分为训练集、验证集和测试集,保证数据集的随机性和可比性。

三、数据集特点

EuroSAT数据集具有以下显著特点:
(1)多类别:EuroSAT包含13个不同的土地覆盖类别,例如城市、森林、河流、田地等。
(2)高分辨率:所有图像都经过高分辨率处理,有助于提取更多细节和特征。
(3)多样性:数据集中包含了不同季节、不同天气条件下的卫星图像,增加了数据集的多样性。
(4)大规模:EuroSAT数据集共包含27,000张卫星图像,使得算法可以进行更全面的训练和评估。
在这里插入图片描述

四、卫星图像分类任务中的应用

EuroSAT数据集在卫星图像分类任务中具有广泛的应用,包括但不限于以下几个领域:
(1)土地覆盖变化监测:通过对卫星图像进行分类和分析,可以实时监测土地覆盖的变化情况,为城市规划、环境保护等提供支持。
(2)灾害监测与评估:通过对不同地区的卫星图像进行分类,可以及时发现并评估灾害事件,为救援工作提供有效指导。
(3)农业管理和产量预测:通过对农田卫星图像进行分类,可以监测农作物的生长情况,预测产量,优化农业管理策略。

五、遥感卫星地图数据加载

下面我将加载EuroSAT数据集(卫星图像分类数据集),EuroSAT数据集下载地址:https://madm.dfki.de/files/sentinel/EuroSAT.zip

import torch
import torch.nn as nn
import torch.optim as optim
import torchvision
import torchvision.transforms as transforms
import matplotlib.pyplot as plt
import numpy as np
from torch.utils.data import DataLoader
from torchvision.datasets import ImageFolder
import random
from torch.utils.data import Subset# 图片展示函数
def imshow(img):img = img / 2 + 0.5     # 反归一化npimg = img.numpy()plt.imshow(np.transpose(npimg, (1, 2, 0)))plt.show()# 定义图像转换操作
trans = transforms.Compose([transforms.Resize((64, 64)),transforms.ToTensor(),  # 转换为张量transforms.Normalize(mean=[0.5, 0.5, 0.5], std=[0.5, 0.5, 0.5])  # 归一化
])# 加载数据集
dataset = ImageFolder(root='./data/EuroSAT/2750', transform=trans)# 类别标签
classes = dataset.classes
print(len(classes))# 设置随机种子,确保每次划分结果一致
random.seed(42)# 计算划分的样本数量
dataset_len = len(dataset)
train_len = int(0.7 * dataset_len)
val_len = int(0.2 * dataset_len)
test_len = dataset_len - train_len - val_len# 创建索引列表
indices = list(range(dataset_len))
random.shuffle(indices)# 划分数据集
train_indices = indices[:train_len]
val_indices = indices[train_len:train_len+val_len]
test_indices = indices[train_len+val_len:]# 创建子集
train_dataset = Subset(dataset, train_indices)
val_dataset = Subset(dataset, val_indices)
test_dataset = Subset(dataset, test_indices)# 创建数据加载器
train_dataloader = DataLoader(train_dataset, batch_size=64, shuffle=True)
val_dataloader = DataLoader(val_dataset, batch_size=64, shuffle=False)
test_dataloader = DataLoader(test_dataset, batch_size=64, shuffle=False)

六、基于pytorch框架的遥感卫星地图分类模型构建

class CNNnet(nn.Module):def __init__(self):super(CNNnet, self).__init__()self.conv1 = nn.Conv2d(3,32,3,1)self.conv2 = nn.Conv2d(32,32,3,1)self.pool = nn.MaxPool2d(2,2)self.relu = nn.ReLU()self.dropout = nn.Dropout(0.25)self.fc =nn.Linear(6272,len(classes))def forward(self,x):x =self.conv1(x)x =self.pool(x)x =self.conv2(x)x = self.pool(x)x = self.relu(x)x = self.dropout(x)x =x.view(x.size(0),-1)x=self.fc(x)return x

七、模型训练

models =CNNnet()
optimizer = torch.optim.Adam(models.parameters(),lr=0.001)
criterion = nn.CrossEntropyLoss()for epoch in range(10):train_total = 0train_correct = 0train_loss_total = 0.0val_total = 0val_correct = 0val_loss_total = 0.0# 训练集for datas, label in train_dataloader:optimizer.zero_grad()outs = models(datas)loss = criterion(outs, label)loss.backward()optimizer.step()_, pred = torch.max(outs, 1)train_total += label.size(0)train_correct += (pred == label).sum().item()train_loss_total += loss.item()train_loss_avg = train_loss_total / len(train_dataloader)train_acc = train_correct / train_total# 验证集models.eval()  # 设置为评估模式,不进行反向传播with torch.no_grad():for datas, label in val_dataloader:outs = models(datas)loss = criterion(outs, label)_, pred = torch.max(outs, 1)val_total += label.size(0)val_correct += (pred == label).sum().item()val_loss_total += loss.item()val_loss_avg = val_loss_total / len(val_dataloader)val_acc = val_correct / val_totalprint(f"Epoch: {epoch+1}")print(f"Train Loss: {train_loss_avg}, Train Accuracy: {train_acc}")print(f"Validation Loss: {val_loss_avg}, Validation Accuracy: {val_acc}")

八、模型保存与加载

这里我们采用torch.jit方式进行存储,直接保存Torch Script 格式

torch.jit.save(torch.jit.script(models), 'model.pt')
loaded_model = torch.jit.load('model.pt')

以上torch.jit.save 是 PyTorch 中用于将模型保存为 Torch Script 格式的函数。Torch Script 是一种中间表示法,它可以将 PyTorch 模型序列化并保存到磁盘上,以便后续在不需要原始模型定义的情况下加载和执行模型。

models 是已经训练好的模型实,torch.jit.script 用于将模型转换为 Torch Script 形式,这样它就可以被保存到磁盘并加载回来进行预测。

‘model.pt’ 是要保存模型的文件路径和名称。你可以根据需要更改文件名和路径。

采用torch.jit.save(torch.jit.script(models), ‘model.pt’) 的作用是将经过转换为 Torch Script 的模型保存到名为 ‘model.pt’ 的文件中。

运行结果:

Epoch: 1
Train Loss: 1.0448811401587885, Train Accuracy: 0.6264550264550265
Validation Loss: 0.7070850253105163, Validation Accuracy: 0.7627777777777778
Epoch: 2
Train Loss: 0.692695257228774, Train Accuracy: 0.7563492063492063
Validation Loss: 0.6866358742994421, Validation Accuracy: 0.7483333333333333
Epoch: 3
Train Loss: 0.5860184832803301, Train Accuracy: 0.7971428571428572
Validation Loss: 0.5635017317884109, Validation Accuracy: 0.8048148148148148
Epoch: 4
Train Loss: 0.537103551213403, Train Accuracy: 0.8129100529100529
Validation Loss: 0.5531797622933107, Validation Accuracy: 0.8101851851851852
Epoch: 5
Train Loss: 0.4707282580233909, Train Accuracy: 0.8357671957671957
Validation Loss: 0.5103719413280488, Validation Accuracy: 0.8185185185185185
Epoch: 6
Train Loss: 0.4517604966421385, Train Accuracy: 0.8439682539682539
Validation Loss: 0.5074160200708052, Validation Accuracy: 0.8285185185185185
Epoch: 7
Train Loss: 0.4016518093444206, Train Accuracy: 0.8625925925925926
Validation Loss: 0.5236595521954929, Validation Accuracy: 0.8137037037037037
Epoch: 8
Train Loss: 0.37693205440567956, Train Accuracy: 0.8712698412698413
Validation Loss: 0.5407256515587078, Validation Accuracy: 0.8312962962962963
Epoch: 9
Train Loss: 0.33328121374487074, Train Accuracy: 0.8876190476190476
Validation Loss: 0.5358928382396698, Validation Accuracy: 0.8262962962962963
Epoch: 10
Train Loss: 0.31978219168613087, Train Accuracy: 0.8924867724867724
Validation Loss: 0.525197943168528, Validation Accuracy: 0.8322222222222222

结论:
396698, Validation Accuracy: 0.8262962962962963
Epoch: 10
Train Loss: 0.31978219168613087, Train Accuracy: 0.8924867724867724
Validation Loss: 0.525197943168528, Validation Accuracy: 0.8322222222222222


# 九、结论:
本项目是基于遥感卫星地图分类数据集做的卫星图像分类任务,为卫星图像分类任务提供了一个重要的基准,推动了该领域的研究进展。其多样性、多类别和大规模的特点使得EuroSAT成为了一个广受关注的数据集。未来,我们可以期待更多基于EuroSAT数据集的算法和应用的涌现,进一步推动卫星图像分类技术的发展。

相关文章:

  • Python 使用XlsxWriter操作Excel
  • TCP知识点
  • C语言--每日选择题--Day24
  • ElasticSearch02
  • 局域网的网络ip不稳定问题
  • 【差旅游记】新疆哈密回王府印象
  • 唯创知音WT2605C-A001音频蓝牙语音芯片:小巧体积,高品质音频播放的创新
  • Grafana采用Nginx反向代理
  • 5. 链表
  • 语义SLAM论文、代码和数据集汇总
  • 体育网站的技术 SEO:完整指南
  • 练习九-利用状态机实现比较复杂的接口设计
  • 如何往excel中写子表?
  • 概率论与数理统计中常见的随机变量分布律、数学期望、方差及其介绍
  • Springboot+vue的客户关系管理系统(有报告),Javaee项目,springboot vue前后端分离项目
  • [NodeJS] 关于Buffer
  • 【译】理解JavaScript:new 关键字
  • CEF与代理
  • chrome扩展demo1-小时钟
  • JAVA并发编程--1.基础概念
  • log4j2输出到kafka
  • Promise面试题2实现异步串行执行
  • Rancher-k8s加速安装文档
  • React as a UI Runtime(五、列表)
  • supervisor 永不挂掉的进程 安装以及使用
  • 成为一名优秀的Developer的书单
  • 猴子数据域名防封接口降低小说被封的风险
  • 记一次用 NodeJs 实现模拟登录的思路
  • ​人工智能书单(数学基础篇)
  • ​香农与信息论三大定律
  • # 再次尝试 连接失败_无线WiFi无法连接到网络怎么办【解决方法】
  • #QT(串口助手-界面)
  • #我与Java虚拟机的故事#连载05:Java虚拟机的修炼之道
  • (03)光刻——半导体电路的绘制
  • (分布式缓存)Redis分片集群
  • (循环依赖问题)学习spring的第九天
  • (原创)boost.property_tree解析xml的帮助类以及中文解析问题的解决
  • .[hudsonL@cock.li].mkp勒索加密数据库完美恢复---惜分飞
  • .NET gRPC 和RESTful简单对比
  • .Net MVC4 上传大文件,并保存表单
  • .NET 动态调用WebService + WSE + UsernameToken
  • .NET 将混合了多个不同平台(Windows Mac Linux)的文件 目录的路径格式化成同一个平台下的路径
  • .net 使用ajax控件后如何调用前端脚本
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • .NET6实现破解Modbus poll点表配置文件
  • .Net程序帮助文档制作
  • .NET导入Excel数据
  • .vollhavhelp-V-XXXXXXXX勒索病毒的最新威胁:如何恢复您的数据?
  • /etc/sudoers (root权限管理)
  • @RestControllerAdvice异常统一处理类失效原因
  • @SuppressWarnings注解
  • [ vulhub漏洞复现篇 ] struts2远程代码执行漏洞 S2-005 (CVE-2010-1870)
  • [ 隧道技术 ] 反弹shell的集中常见方式(二)bash反弹shell
  • [AHOI2009]中国象棋 DP,递推,组合数
  • [Android] Implementation vs API dependency