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