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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

使用Python的turtle模块创建一幅哆啦A梦

1.1引言: 在Python中,turtle模块是一个非常有趣且强大的工具,它允许我们以一个可视化和互动的方式学习编程。通过调用各种命令,我们可以引导turtle画出一个指定的图形。在本博客中,我们将使用turtle模块来绘制一幅哆啦…

UML建模图文详解教程01——Enterprise Architect安装与使用

版权声明 本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl Enterprise Architect概述 官方网站:https://www.sparxsystems.cn/products/ea/;图示如下: Enterprise Architect是一个全功能的、基于…

IDEA中注释快捷键及模板

单行注释 将光标放置于要注释所在行,使用 Ctrl /, 添加行注释,再次使用,去掉行注释 若需要将多行进行单行注释,只需要选中要注释的多行,然后使用 Ctrl /, 添加行注释,再次使用&a…

【Linux】权限理解【文件权限以及目录权限详解、以及umsk程序掩码知识详解】

权限理解 一、Linux权限的概念二、su [用户名] : 切换用户三、Linux权限管理文件(一)文件访问者的分类(人)(二)文件类型和访问权限(事物属性)(1)第…

【开源】基于JAVA的在线课程教学系统

项目编号: S 014 ,文末获取源码。 \color{red}{项目编号:S014,文末获取源码。} 项目编号:S014,文末获取源码。 目录 一、摘要1.1 系统介绍1.2 项目录屏 二、研究内容2.1 课程类型管理模块2.2 课程管理模块2…

tp8 使用rabbitMQ

php8.0 使用 rabbitmq 要使用 3.6版本以上的&#xff0c; 并且还要开启 php.ini中的 socket 扩展 php think make:command SimpleMQProduce //创建一个生产者命令行 php think make:command SimpleMQConsumer //创建一个消费者命令行 生产者代码 <?php declare (strict_ty…

SpringBoot:异步任务基础与源码剖析

官网文档&#xff1a;How To Do Async in Spring | Baeldung。 Async注解 Spring框架基于Async注解提供了对异步执行流程的支持。 最简单的例子是&#xff1a;使用Async注解修饰一个方法&#xff0c;那么这个方法将在一个单独的线程中被执行&#xff0c;即&#xff1a;从同步执…

【无标题】文本超过一行隐藏,鼠标经过显示提示框

创建一个组件专门用来出来文字的 <template><div class"tooltip-wrap"><el-tooltipref"tlp":content"text"effect"dark":disabled"!tooltipFlag":placement"placement"popper-class"tooltip…

centos查看空间使用情况

查看磁盘使用空间 df -h 查看该目录下其他目录的大小 du -sh *

基于Python实现的一个命令行文本计数统计程序,可统计纯英文txt文本中的字符数,单词数,句子数,Python文件行数

项目简介 这是一个用 Python 编写的命令行文本计数统计程序。 基础功能&#xff1a;能正确统计导入的 纯英文txt文本 中的 字符数&#xff0c;单词数&#xff0c;句子数。扩展功能&#xff1a;能正确统计导入的 Python 文件中的代码行数&#xff0c;注释行数&#xff0c;空白…

pip安装python包到指定python版本下

python -m pip install 包名1.命令行进入到指定python安装目录。比如我电脑上有python3.8也有python3.9。准备给python3.9安装指定的包

nginx国密ssl测试

文章目录 文件准备编译部署nginx申请国密数字证书配置证书并测试 文件准备 下载文件并上传到服务器&#xff0c;这里使用centos 7.8 本文涉及的程序文件已打包可以直接下载。 点击下载 下载国密版openssl https://www.gmssl.cn/gmssl/index.jsp 下载稳定版nginx http://n…

【Python】tensorboard实时查看模型训练过程的方法示例

本文对tensorboard实时查看模型训练过程的方法进行实例详解&#xff0c;以帮助大家理解和使用。 步骤1&#xff1a;查看训练过程保存的文件中是否有这个文件&#xff0c;红框内的。 步骤2&#xff1a;如果有&#xff0c;则打开终端&#xff0c;激活安装过tensorboard的环境。…

20231122给RK3399的挖掘机开发板适配Android12

20231122给RK3399的挖掘机开发板适配Android12 2023/11/22 9:30 主要步骤&#xff1a; rootrootrootroot-X99-Turbo:~$ tar --use-compress-programpigz -xvpf rk356x_android12_220722.tgz rootrootrootroot-X99-Turbo:~$ cd rk_android12_220722/ rootrootrootroot-X99-Tur…

C++ 标准模板库:容器

1. list 容器 1.1 初始化&#xff0c;获取读取 #include <iostream> #include<list>using namespace std;void printList(const list<int>&L){for(list<int>::const_iterator it L.begin(); it ! L.end(); it){cout << *it <<"…

让国内AI模型解题:滑动窗口中找出最大值,文心一言,通义千问错误率100%,讯飞星火略胜一筹

最近&#xff0c;一些大厂陆续放出了自己的AI模型&#xff0c;处于日常的使用和准确度&#xff0c;我通过一道试题来看一下文心一言、讯飞星火和通义千万的回答结果 本道题是一道很经典的算法题&#xff0c;请在滑动窗口中找出最大值 文心一言 第一次给出答案 package main…

Cypress-浏览器操作篇

Cypress-浏览器操作篇 页面的前进与后退 后退 cy.go(back); cy.go(-1);前进 cy.go(forward); cy.go(1);页面刷新 cy.reload() cy.reload(forceReload) cy.reload(options) cy.reload(forceReload, options)**options&#xff1a;**只有 timeout 和 log forceReload 是否…

深入理解路由协议:从概念到实践

路由技术是Internet得以持续运转的关键所在&#xff0c;路由是极其有趣而又复杂的课题&#xff0c;永远的话题。 SO&#xff1a;这是一个解析路由协议的基础文章。 目录 前言路由的概念路由协议的分类数据包在网络中的路由过程理解路由表的结构路由器关键功能解析 前言 在互联…

Navicat 技术指引 | 适用于 GaussDB 的自动运行功能

Navicat Premium&#xff08;16.2.8 Windows版或以上&#xff09; 已支持对 GaussDB 主备版的管理和开发功能。它不仅具备轻松、便捷的可视化数据查看和编辑功能&#xff0c;还提供强大的高阶功能&#xff08;如模型、结构同步、协同合作、数据迁移等&#xff09;&#xff0c;这…

Linux反弹SHell与检测思路

免责声明 文章仅做经验分享用途,利用本文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,作者不为此承担任何责任,一旦造成后果请自行承担!!! 反弹shell payload在线生成 https://www.chinabaiker.com/Hack-Tools/ Online - Reverse Shell G…