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

news2024/9/30 1:39:41

大家好,我是微学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 = 0
    train_correct = 0
    train_loss_total = 0.0
    val_total = 0
    val_correct = 0
    val_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_total

    print(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数据集的算法和应用的涌现,进一步推动卫星图像分类技术的发展。

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

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

相关文章

Leetcode—6.N字形变换【中等】

2023每日刷题&#xff08;三十七&#xff09; Leetcode—6.N字形变换 算法思想 参考k神的题解 实现代码 class Solution { public:string convert(string s, int numRows) {if(numRows < 2) {return s;}vector<string> rows(numRows);int flag -1;int i 0;for(…

FreeSQL 基本使用

FreeSQL连接MySQL 安装 FeeSql相关库 FreeSql 基本库 FreeSql.DbContext FreeSql.Extensions.Linq linq语法扩展库 FreeSql.Provider.Mysql MySQL连接库 新建DbConent.cs public class Base{static string connstr "Data Source127.0.0.1;Port3306;User IDroot;Pa…

S32K144W深度睡眠的问题

电源芯片是一个9到60的宽压芯片。另带一个两轴加表&#xff0c;两个485。 10V正常工作时&#xff0c;电流为26mA 休眠后的电流&#xff0c;只有串口2进行了反初始化&#xff1a; u2_printf(“ENTER LOW-POWER SLEEPDEEP MODE. %d \r\n”,MCU_Freq); //LPUART_DRV_Deinit(INST…

赛桨在结构领域全新探索:机理驱动的无网格结构拓扑优化

自PaddleScience&#xff08;赛桨&#xff09; V1.0于2023年8月正式发布以来&#xff0c;其支持数据和机理驱动的AI for Science求解模式备受工程领域的欢迎。赛桨不仅提供了包括流体、结构、气象等多个领域的基础网络模型&#xff0c;还提供了丰富的生态共建案例。截至目前&am…

数组对象判重最佳实践

数组对象判重最佳实践 赶紧挣钱&#xff0c;回家过年… 1.问题回顾 deviceSelectedRow(row) {this.ElectricalPartList.push(row)}&#xff0c;在此方法中&#xff0c;ElectricalPartList需要多次push进去数据&#xff0c;但是row可能存在重复&#xff0c;如何判重呢&#xff…

easyrecovery免费版2024最新电脑数据恢复工具

easyrecovery免费版是一款操作简便且实用的数据恢复工具&#xff0c;easyrecovery绿色版可以用来恢复各种各样被删除的文件、视频、图片等&#xff1b;EasyRecovery功能非常全面&#xff0c;easyrecovery还可以支持SD卡数据恢复&#xff0c;TF卡等各种存储卡文件恢复(图片、视频…

GeoTrust通配符证书:保护您的网站安全

GeoTrust通配符 SSL证书是一种特殊的 SSL 证书类型&#xff0c;它可以同时为您的主域名及其所有子域提供安全保护。无论您有多少个不同的子域需要保障&#xff0c;都可以通过单一的 GeoTrust 通配符 SSL 证书轻松实现&#xff0c;极大地简化了管理流程并降低了成本。 此外&…

基于.net framework4.0框架下winform项目实现寄宿式web api

首先Nuget中下载包&#xff1a;Microsoft.AspNet.WebApi.SelfHost&#xff0c;如下&#xff1a; 注意版本哦&#xff0c;最高版本只能4.0.30506能用。 1.配置路由 public static class WebApiConfig{public static void Register(this HttpSelfHostConfiguration config){// …

【数据结构】树的基本概念 | 入门树以及二叉树必熟知

树的学习过程中&#xff0c;二叉树比较重要&#xff0c;但是在学习二叉树之前&#xff0c;得先需要了解到一些数的概念。 树的定义 树是一种非线性的数据结构&#xff0c;它是由 n&#xff08;n > 0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它…

兼顾陪读|自由职业者赴美国加州大学尔湾分校访学

I老师出国访学除了提升自己的科研水平外&#xff0c;主要目标还是以陪伴孩子上学为主。最终我们为其落实了排名还不错的加州大学尔湾分校的职位&#xff0c;这对于已多年脱离科研工作岗位&#xff0c;学术背景非常薄弱的I老师来说相当不易。 I老师背景&#xff1a; 申请类型&a…

需求分析BSA法

&#x1f449;BSA法&#xff08;Basic–Satisfier–Attractor&#xff09;是对客户需求进行优先级划分的需求分析方法。该模型体现了需求满足度和客户满意度之间的非线性关系。BSA法将客户需求分为3种类型&#xff0c;分别是基本型需求、满意型需求和兴奋型需求。下面将对每种需…

php一句话木马免杀

php一句话木马免杀 针对于php一句话木马做免杀&#xff1a; 利用php动态函数的特性&#xff0c;将危险函数拆分成字符&#xff0c;最终使用字符串拼接的方式&#xff0c;然后重新拼接&#xff0c;后加括号执行代码&#xff0c;并且可以使用花指令进行包装&#xff0c;如无限i…

2023“亚太杯”大学生数学建模竞赛

2023亚太杯数学建模C题 中国新能源电动汽车的发展趋势 解题思路、数据 该题并没有提供数据集&#xff0c;对所需数据进行收集整理是对题目进行求解的基础。在本题中&#xff0c;主要需要以下数据&#xff1a;新能源汽车历史销售量、新能汽车相关专利的历史数量、充电桩历史数…

Docker 安装 Apache

目录 拉取官方 Apache 镜像 查看本地镜像 列出正在运行的容器 运行 Apache 容器 创建一个 HTML 文件&#xff1a;index.html 访问 Apache 拉取官方 Apache 镜像 查找 Docker Hub 上的 httpd 镜像。 可以通过 Tags 查看其他版本的 httpd&#xff0c;默认是最新版本 httpd…

VUE项目部署过程中遇到的错误:POST http://124.60.11.183:9090/test/login 405 (Not Allowed)

我当初报了这个405错误&#xff0c;再网上查了半天&#xff0c;他们都说什么是nginx部署不支持post访问静态资源。 但后面我发现我是因为另一个原因才导致的无法访问。 我再vue中有使用devServer:{ proxy:{} }进行路由转发。 但是&#xff01;&#xff01; 在这个配置只…

「邀请函」开启“全”方位软件授权创新之旅

尊敬的各位创新者&#xff1a; 随着数字化时代的到来&#xff0c;软件授权license已成为了企业开拓市场、提升竞争力的关键环节。为了满足不断变化的市场需求也为了引领行业的创新与变革&#xff0c;我们带着2023年软件授权“全”面、“全”新的方案来了&#xff01;

【云原生 Prometheus篇】Prometheus的动态服务发现机制与认证配置

目录 一、Prometheus服务发现的方式1.1 基于文件的服务发现1.2 基于consul的服务发现1.3 基于 Kubernetes API 的服务发现1.3.1 简介1.3.2 基于Kurbernetes发现机制的部分配置参数 二、实例一&#xff1a;部署基于文件的服务发现2.1 创建用于服务发现的文件2.2 修改Prometheus的…

揭开病毒式内容的秘密:爆炸性在线增长的策略

介绍 病毒式内容的想法已经完全接管了巨大的互联网上的数字世界。我们都看过&#xff1a;那些吸引数百万人注意力的电影、文章或图片似乎像野火一样蔓延开来。然而&#xff0c;是什么导致内容传播开来&#xff1f;公司和个人如何发现互联网快速扩张的关键&#xff1f;在这篇文…

Java中的字符串String

目录 一、常用方法 1、字符串构造 2、String对象的比较 &#xff08;1&#xff09;、equals方法 &#xff08;2&#xff09;、compareTo方法 &#xff08;3&#xff09;、compareToIgnoreCase方法&#xff08;忽略大小写进行比较&#xff09; 3、字符串查找 4、转化 &…

云端导览,数字互动 | 拓世法宝AI数字人一体机助力全新旅游时代

《中国旅行消费趋势洞察白皮书&#xff08;2023版&#xff09;》显示&#xff0c;消费者旅行习惯已从“到此一游”变为“深度在地”&#xff0c;更强调在旅游中充实自我、学习新知识。 &#xff08;《中国旅行消费趋势洞察白皮书&#xff08;2023版》截图&#xff09; 从这些资…