深度学习在卫星遥感图像分类中的应用
【实战项目】基于 PyTorch 的卫星遥感图像分类系统:从环境搭建到部署优化(附完整代码 + GUI 界面 + 多模型对比)
下载链接:基于深度学习的卫星遥感图像分类系统(训练测试代码完整版,已完成训练,可直接使用)(亲测好用)资源-CSDN下载
前言:为什么要做卫星遥感图像分类?
在当今 “空天地一体化” 监测的大背景下,卫星遥感技术已成为国土规划、环境监测、灾害应急、农业估产等领域的核心支撑。而遥感图像分类作为遥感数据解译的关键环节,其目标是将遥感图像中的每个像素或区域映射到特定的地物类别(如耕地、建筑、森林、机场等),为后续的决策分析提供结构化数据。
传统的遥感分类方法(如 SVM、随机森林)依赖人工设计特征(如纹理、光谱指数),不仅耗时耗力,还难以应对高分辨率遥感图像中复杂的地物特征。随着深度学习的发展,基于 CNN 的图像分类技术凭借强大的自动特征提取能力,在遥感领域实现了精度的跨越式提升。
本文将带大家从零搭建一个基于 PyTorch 的卫星遥感图像分类系统,不仅包含 ResNet、VGG 等经典模型的实现,还开发了可视化 GUI 界面,支持 “一键训练 - 实时可视化 - 结果分析” 全流程,即使是新手也能快速上手。文末附完整代码和避坑指南,可直接用于课程设计、毕业设计或实际项目开发!
一、项目整体架构:技术栈与核心功能
在开始编码前,我们先明确项目的技术选型和架构设计 —— 好的架构能让后续开发事半功倍,也便于后期扩展。
1.1 技术栈选型理由
模块 | 技术选型 | 选型理由 |
---|---|---|
深度学习框架 | PyTorch | 动态计算图便于调试,生态丰富(预训练模型多),对初学者友好,支持 GPU 加速 |
数据处理 | OpenCV、PIL、NumPy | OpenCV 擅长遥感图像(.tif 格式)读取,PIL 处理图像变换,NumPy 做数值计算 |
可视化 | Matplotlib、Seaborn | 绘制损失曲线、混淆矩阵,支持实时更新;Seaborn 美化图表,提升可读性 |
GUI 界面 | Tkinter | Python 内置库,无需额外安装,轻量高效,适合快速搭建桌面应用 |
评估指标 | Scikit-learn | 提供 precision、recall、f1-score、混淆矩阵等开箱即用的评估工具 |
1.2 系统核心功能模块
本系统并非简单的 “模型训练脚本”,而是一个完整的 “数据 - 训练 - 可视化 - 部署” 闭环工具,核心功能分为 5 大模块:
- 数据管理模块:支持遥感图像加载(.tif 格式)、自动划分训练 / 测试集、数据增强(适配遥感图像特性);
- 模型管理模块:集成 ResNet18/ResNet50/VGG16 三种经典模型,支持预训练权重加载、冻结 / 微调策略;
- 训练控制模块:实时调整训练参数(epoch、batch size、学习率),支持断点续训、最佳模型自动保存;
- 可视化模块:训练过程中实时绘制损失曲线 / 准确率曲线,测试后生成混淆矩阵、分类报告;
- GUI 交互模块:图形化界面替代命令行操作,支持 “选择数据集 - 启动训练 - 查看结果” 全流程可视化操作。
二、环境搭建:手把手避坑指南(Windows/Linux/Mac 通用)
环境配置是很多新手的 “第一道坎”,尤其是 PyTorch 与 CUDA 的版本匹配问题。本节将分系统给出详细步骤,确保大家一次配置成功。
2.1 基础环境要求
- 操作系统:Windows 10+/Linux(Ubuntu 18.04+/CentOS 7+)/MacOS 12+
- Python 版本:3.7~3.9(注意:Python 3.10 + 对部分老版本依赖兼容性较差,建议优先选 3.8)
- GPU 要求(可选):NVIDIA 显卡(支持 CUDA 10.2/11.3/11.6,显存≥4G);无 GPU 则用 CPU 训练(速度较慢,适合小模型测试)
2.2 Windows 系统环境配置步骤
步骤 1:安装 Python 与 Git
- 下载 Python 3.8:从Python 官网下载(勾选 “Add Python 3.8 to PATH”,避免手动配置环境变量);
- 验证 Python 安装:打开 CMD,输入
python --version
,显示 “Python 3.8.10” 即成功; - 安装 Git:从Git 官网下载,默认下一步安装,CMD 输入
git --version
验证。
步骤 2:创建虚拟环境(避免依赖冲突)
虚拟环境是 Python 项目的 “标配”,能隔离不同项目的依赖版本(比如 A 项目用 PyTorch 1.10,B 项目用 PyTorch 2.0)。
- 打开 CMD,进入任意工作目录(如
D:\Projects
):bash
cd D:\Projects
- 创建虚拟环境(命名为
remote_sensing_env
):bash
python -m venv remote_sensing_env
- 激活虚拟环境:
bash
激活成功后,CMD 前缀会显示# 注意:路径要和你创建的虚拟环境一致 remote_sensing_env\Scripts\activate
(remote_sensing_env)
。
步骤 3:安装 PyTorch(含 CUDA 支持)
PyTorch 的安装必须匹配 CUDA 版本,否则无法使用 GPU 加速。
-
查看 GPU 支持的 CUDA 版本:
- 右键桌面→NVIDIA 控制面板→帮助→系统信息→组件→查看 “NVIDIA CUDA” 后的版本(如 “11.6”);
- 若没有 NVIDIA 显卡,直接安装 CPU 版本。
-
安装 PyTorch:
- 打开PyTorch 官网,根据 CUDA 版本选择命令(以 CUDA 11.6 为例):
bash
# CUDA 11.6版本(建议用国内源加速) pip3 install torch==1.12.1+cu116 torchvision==0.13.1+cu116 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu116# CPU版本(无GPU时用) pip3 install torch==1.12.1+cpu torchvision==0.13.1+cpu torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cpu
- 验证 PyTorch 是否支持 GPU:
bash
python >>> import torch >>> print(torch.cuda.is_available()) # 输出True表示GPU可用,False表示不可用
- 打开PyTorch 官网,根据 CUDA 版本选择命令(以 CUDA 11.6 为例):
步骤 4:安装项目依赖
- 克隆项目代码(假设项目地址为
https://github.com/xxx/RemoteSensingClassification.git
,替换为实际地址):bash
git clone https://github.com/xxx/RemoteSensingClassification.git cd RemoteSensingClassification
- 安装依赖(
requirements.txt
内容见下文):bash
# 用国内源(阿里云)加速安装,避免超时 pip install -r requirements.txt -i https://mirrors.aliyun.com/pypi/simple/
2.3 Linux(Ubuntu)系统环境配置
Linux 环境主要差异在 CUDA 安装和虚拟环境激活,其他步骤与 Windows 类似:
- 安装 Python 3.8:
bash
sudo apt update sudo apt install python3.8 python3.8-venv python3.8-pip
- 创建并激活虚拟环境:
bash
python3.8 -m venv remote_sensing_env source remote_sensing_env/bin/activate # Linux激活命令
- 安装 CUDA(以 11.6 为例):
- 参考NVIDIA 官网,或用命令行安装:
bash
sudo apt install nvidia-driver-515 # 对应CUDA 11.6的驱动版本 wget https://developer.download.nvidia.com/compute/cuda/11.6.0/local_installers/cuda_11.6.0_510.39.01_linux.run sudo sh cuda_11.6.0_510.39.01_linux.run
- 配置 CUDA 环境变量:
bash
echo 'export PATH=/usr/local/cuda-11.6/bin:$PATH' >> ~/.bashrc echo 'export LD_LIBRARY_PATH=/usr/local/cuda-11.6/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc source ~/.bashrc
- 参考NVIDIA 官网,或用命令行安装:
- 后续安装 PyTorch 和依赖与 Windows 一致。
2.4 MacOS 系统环境配置(含 M 芯片)
MacOS(尤其是 M1/M2 芯片)不支持 NVIDIA CUDA,只能用 CPU 或 MPS(Metal 加速)训练:
- 安装 Python 3.8:用Homebrew安装:
bash
brew install python@3.8
- 创建虚拟环境:
bash
python3.8 -m venv remote_sensing_env source remote_sensing_env/bin/activate
- 安装 PyTorch(支持 MPS 加速):
bash
pip install torch==2.0.0 torchvision==0.15.1 torchaudio==2.0.1 -i https://mirrors.aliyun.com/pypi/simple/
- 验证 MPS 加速:
bash
python >>> import torch >>> print(torch.backends.mps.is_available()) # 输出True表示MPS可用
2.5 requirements.txt
完整依赖清单
txt
# 基础数据处理
numpy==1.23.5
pandas==1.5.3
opencv-python==4.6.0.66
Pillow==9.4.0
scikit-image==0.19.3# 深度学习框架
torch==1.12.1
torchvision==0.13.1# 可视化工具
matplotlib==3.6.3
seaborn==0.12.2
tqdm==4.64.1 # 显示训练进度条# 评估与工具
scikit-learn==1.2.2
joblib==1.2.0 # 保存模型
python-dotenv==1.0.0 # 环境变量管理# GUI界面
tkinter==0.1.0 # Python3.8自带,若缺失可安装
三、数据集深度解析:UC Merced Land Use 数据集
选择合适的数据集是模型训练的前提。本项目选用UC Merced Land Use 数据集—— 遥感图像分类领域的 “入门标杆数据集”,由加州大学默塞德分校发布,适合验证模型性能。
3.1 数据集背景与特点
- 发布机构:加州大学默塞德分校(University of California, Merced)
- 数据来源:美国地质调查局(USGS)的高分辨率卫星图像(分辨率 1 英尺 / 像素,约 0.3 米)
- 数据集规模:21 个地物类别,每个类别 100 张图像,共 2100 张图像
- 图像规格:256×256 像素,3 通道(RGB),.tif 格式(遥感图像常用格式)
- 类别列表:涵盖农业、交通、建筑、自然景观等典型地物,具体如下:
plaintext
agricultural(农业用地)、airplane(机场)、baseballdiamond(棒球场)、beach(海滩)、buildings(建筑群)、 chaparral(灌木丛)、denseresidential(高密度住宅)、forest(森林)、freeway(高速公路)、golfcourse(高尔夫球场)、 harbor(港口)、intersection(十字路口)、mediumresidential(中密度住宅)、mobilehomepark(移动房屋公园)、 overpass(立交桥)、parkinglot(停车场)、river(河流)、runway(跑道)、sparseresidential(低密度住宅)、 storagetanks(储油罐)、tenniscourt(网球场)
3.2 数据集结构与预处理
3.2.1 数据集目录结构
项目中已整理好数据集,目录结构如下(无需手动调整,直接使用):
plaintext
UCMerced_LandUse/├── agricultural/ # 农业用地类别(100张.tif)│ ├── agricultural00.tif│ ├── agricultural01.tif│ └── ...├── airplane/ # 机场类别(100张.tif)├── ...(共21个类别文件夹)└── train_test_split.txt # 预划分的训练/测试集索引(可选)
3.2.2 数据预处理核心步骤
遥感图像的预处理直接影响模型性能,本项目在data_utils.py
中实现了 3 个关键步骤:
-
图像格式转换与读取:
- 遥感图像常用.tif 格式,OpenCV 的
cv2.imread()
默认读取 BGR 通道,需转换为 RGB(与模型输入一致); - 代码实现:
python
运行
import cv2 import numpy as npdef read_tif_image(path):"""读取.tif格式遥感图像,转换为RGB通道"""img = cv2.imread(path, cv2.IMREAD_COLOR) # 读取BGR格式img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) # 转换为RGBimg = np.array(img, dtype=np.float32) # 转为float32,避免溢出return img
- 遥感图像常用.tif 格式,OpenCV 的
-
图像归一化:
- 预训练模型(如 ResNet、VGG)在 ImageNet 数据集上训练时,使用了固定的均值和标准差,因此需对遥感图像做相同归一化:
python
运行
def normalize_image(img):"""归一化:基于ImageNet均值和标准差"""mean = np.array([0.485, 0.456, 0.406]) # ImageNet均值std = np.array([0.229, 0.224, 0.225]) # ImageNet标准差img = (img / 255.0 - mean) / std # 先归一化到[0,1],再减均值除标准差return img.transpose(2, 0, 1) # 转换为CHW格式(PyTorch要求)
- 预训练模型(如 ResNet、VGG)在 ImageNet 数据集上训练时,使用了固定的均值和标准差,因此需对遥感图像做相同归一化:
-
数据增强(适配遥感图像特性):
-
遥感图像的地物特征具有 “旋转不变性”(如机场、网球场旋转后仍可识别),但 “尺度不变性” 较弱(如小面积建筑易与其他类别混淆),因此设计以下增强策略:
增强操作 参数设置 目的 随机裁剪 从 256×256 裁为 224×224 适配预训练模型输入尺寸,增强模型对局部特征的敏感性 随机水平翻转 概率 0.5 增加样本多样性,避免模型对左右方向的依赖 随机垂直翻转 概率 0.3 遥感图像中垂直方向不影响分类(如河流上下翻转仍为河流) 随机旋转 ±15 度,填充黑色 适应遥感图像中地物的任意方向,避免模型对角度的过拟合 亮度 / 对比度调整 亮度 ±0.2,对比度 ±0.1 模拟不同光照条件下的遥感图像(如阴天、晴天),提升模型鲁棒性 -
代码实现(
data_utils.py
中的RemoteSensingDataset
类):python
运行
from torch.utils.data import Dataset import random import cv2class RemoteSensingDataset(Dataset):def __init__(self, image_paths, labels, is_train=True):self.image_paths = image_pathsself.labels = labelsself.is_train = is_train # 区分训练/测试集(测试集不增强)def __len__(self):return len(self.image_paths)def __getitem__(self, idx):# 1. 读取图像img_path = self.image_paths[idx]img = read_tif_image(img_path)label = self.labels[idx]# 2. 训练集数据增强if self.is_train:# 随机裁剪(256→224)h, w = img.shape[:2]crop_size = 224top = random.randint(0, h - crop_size)left = random.randint(0, w - crop_size)img = img[top:top+crop_size, left:left+crop_size, :]# 随机水平翻转if random.random() > 0.5:img = cv2.flip(img, 1)# 随机垂直翻转if random.random() > 0.7:img = cv2.flip(img, 0)# 随机旋转(±15度)angle = random.randint(-15, 15)h, w = img.shape[:2]M = cv2.getRotationMatrix2D((w/2, h/2), angle, 1)img = cv2.warpAffine(img, M, (w, h), borderMode=cv2.BORDER_CONSTANT, borderValue=(0,0,0))# 亮度调整if random.random() > 0.5:brightness = random.uniform(0.8, 1.2)img = img * brightnessimg = np.clip(img, 0, 255) # 防止像素值溢出# 3. 测试集仅裁剪中心区域(避免随机误差)else:h, w = img.shape[:2]crop_size = 224top = (h - crop_size) // 2left = (w - crop_size) // 2img = img[top:top+crop_size, left:left+crop_size, :]# 4. 归一化并转换为Tensorimg = normalize_image(img)img = torch.tensor(img, dtype=torch.float32)label = torch.tensor(label, dtype=torch.long)return img, label
-
3.3 训练 / 测试集划分
为保证实验的公平性,采用固定比例划分:训练集占 70%(1470 张),测试集占 30%(630 张),划分时确保每个类别的样本比例一致(即每个类别 70 张训练、30 张测试)。
划分代码(data_utils.py
中的split_train_test
函数):
python
运行
import os
from sklearn.model_selection import train_test_splitdef split_train_test(data_root, test_size=0.3, random_state=42):"""划分训练集和测试集"""# 1. 获取所有类别classes = os.listdir(data_root)classes.sort() # 保证类别顺序固定class_to_idx = {cls: idx for idx, cls in enumerate(classes)}# 2. 收集所有图像路径和标签image_paths = []labels = []for cls in classes:cls_dir = os.path.join(data_root, cls)for img_name in os.listdir(cls_dir):if img_name.endswith('.tif'):img_path = os.path.join(cls_dir, img_name)image_paths.append(img_path)labels.append(class_to_idx[cls])# 3. 按类别分层划分(stratify参数保证类别比例)train_paths, test_paths, train_labels, test_labels = train_test_split(image_paths, labels, test_size=test_size, random_state=random_state, stratify=labels)return train_paths, test_paths, train_labels, test_labels, class_to_idx
计算机科学与技术学院
课程设计任务书
设计题目 | 深度学习在卫星遥感图像分类中的应用 |
已知技术参数和设计要求 | 卫星遥感图像分类是地理信息系统(GIS)和环境监测中的重要技术。本设计要求构建一个基于深度学习的卫星遥感图像分类系统,能够自动识别卫星遥感图像中的不同地物类型,为城市规划、环境监测等提供数据支持。 设计要求:
|
设计内容与步骤 | 1. 学习深度学习基础和卫星遥感图像分类相关知识:了解深度学习的基本原理,特别是卷积神经网络(CNN)在图像分类中的应用,以及卫星遥感图像分类的基本要求。 2. 数据集的收集与预处理:下载并整理卫星遥感图像数据集,进行必要的预处理,如图像大小调整、归一化等。 3. 深度学习模型的设计与训练:设计并实现深度学习模型,使用数据集进行训练,并对模型进行调优。 4. 用户交互界面的设计与实现:设计并实现用户交互界面,使用户能够方便地上传卫星遥感图像并查看分类结果。 5. 系统集成与测试:将训练好的模型集成到用户界面中,进行系统测试,确保系统的稳定性和准确性。 6. 撰写课程设计说明书:详细记录整个设计过程,包括设计思路、实现方法、实验结果和结论。 |
设计工作计划与进度安排 |
2. 数据集的收集与预处理: 4小时 3. 深度学习模型的设计与训练: 10小时 4. 用户交互界面的设计与实现: 8小时 5. 系统集成与测试: 8小时 6. 课程设计说明书撰写: 10小时 |
设计考核要求 | 1.中期检查35% 2.演示答辩40% 3.课程设计说明书25% |
指导教师(签字): 教研室主任(签字):