第2章:环境搭建与工具链
说实话,每次带新人入门遥感深度学习,我最怕的就是环境搭建这一步。不是技术难,而是坑太多。我自己当年配环境就折腾了整整两天,最后发现是CUDA版本和PyTorch没对齐。嗯,这节课咱们就把这些坑一个个填平。
2.1 Anaconda环境配置
我个人习惯用Anaconda来管理Python环境。为什么?因为遥感项目依赖太乱了——有的库要Python 3.8,有的要3.10,用conda环境隔离最省心。
安装步骤其实很简单:
- 去官网下载Anaconda(选Python 3.9+版本)
- 一路默认安装,但记得勾选「Add Anaconda to my PATH」
- 打开终端验证:
conda --version
装完后第一件事,我建议你换国内镜像源。不然下载PyTorch那几百兆能等到你怀疑人生。
# 添加清华镜像源
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/
conda config --set show_channel_urls yes
# 创建专属环境
conda create -n rs_deep python=3.9
conda activate rs_deep
2.2 PyTorch安装与验证
PyTorch安装其实就一行命令,但版本选择有讲究。你想想看,遥感影像动不动就是几千乘几千像素,显存消耗巨大。所以我建议直接上CUDA 11.x + PyTorch 1.12以上版本,对超大影像的支持更好。
# CUDA 11.8版本(推荐)
conda install pytorch torchvision torchaudio cudatoolkit=11.8 -c pytorch -c nvidia
# 或者用pip(我个人更习惯)
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
装完一定要验证。我在项目中遇到过好几次「装完了但跑不起来」的情况,都是因为没验证就直接开干。
import torch
print("PyTorch版本:", torch.__version__)
print("CUDA是否可用:", torch.cuda.is_available())
print("GPU数量:", torch.cuda.device_count())
print("当前GPU:", torch.cuda.get_device_name(0) if torch.cuda.is_available() else "无")
nvidia-smi,看右上角的CUDA Version。我曾经遇到过驱动是11.4,但装了12.0的PyTorch,结果死活认不到GPU。
2.3 GDAL安装——遥感人的痛
GDAL这玩意儿,说白了就是遥感界的「万能钥匙」。读取GeoTIFF、处理投影、坐标转换,都离不开它。但安装GDAL是我见过最折腾的事之一。
为什么难装?因为GDAL底层是C++写的,编译依赖特别多。直接用pip装经常报错。我踩过这个坑,后来学乖了——用conda装最稳。
# 推荐方式:用conda
conda install gdal
# 如果conda不行,试试这个
pip install gdal==3.4.3
# 验证
from osgeo import gdal
print("GDAL版本:", gdal.__version__)
# 读取遥感影像
dataset = gdal.Open("your_image.tif")
print("影像大小:", dataset.RasterXSize, "x", dataset.RasterYSize)
print("波段数:", dataset.RasterCount)
2.4 CUDA与cuDNN配置
CUDA是NVIDIA的并行计算平台,cuDNN是深度学习的加速库。说白了,没有它们,你的GPU就是个摆设。
配置步骤:
- 检查驱动:
nvidia-smi看驱动版本和最高支持的CUDA版本 - 安装CUDA Toolkit:去NVIDIA官网下载对应版本
- 安装cuDNN:需要注册NVIDIA开发者账号,下载后解压到CUDA目录
这里有个坑——很多人以为装了CUDA Toolkit就完事了。其实cuDNN也要手动配置。我曾经漏了这一步,训练速度慢得像蜗牛,排查了半天才发现是cuDNN没装。
# 验证CUDA
nvcc --version
# 验证cuDNN(Linux/Mac)
cat /usr/local/cuda/include/cudnn_version.h | grep CUDNN_MAJOR -A 2
# Windows下
type "C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v11.8\include\cudnn_version.h" | findstr CUDNN_MAJOR
| PyTorch版本 | CUDA版本 | cuDNN版本 |
|---|---|---|
| 1.12.x | 11.6 / 11.7 | 8.4.x |
| 1.13.x | 11.7 / 11.8 | 8.5.x |
| 2.0.x | 11.8 / 12.1 | 8.9.x |
2.5 遥感数据读取与可视化基础
环境搭好了,咱们来试试真家伙。遥感影像和普通图片不一样——它通常有多个波段,而且每个像素值代表的是地物反射率,不是RGB颜色。
读取影像我一般用GDAL + numpy的组合:
import numpy as np
from osgeo import gdal
import matplotlib.pyplot as plt
# 读取影像
dataset = gdal.Open("sentinel2_image.tif")
band1 = dataset.GetRasterBand(1).ReadAsArray() # 蓝光波段
band2 = dataset.GetRasterBand(2).ReadAsArray() # 绿光波段
band3 = dataset.GetRasterBand(3).ReadAsArray() # 红光波段
band4 = dataset.GetRasterBand(4).ReadAsArray() # 近红外波段
# 合成真彩色影像(RGB)
rgb = np.stack([band3, band2, band1], axis=2)
# 归一化显示
rgb_normalized = (rgb - rgb.min()) / (rgb.max() - rgb.min())
plt.figure(figsize=(10, 10))
plt.imshow(rgb_normalized)
plt.title("Sentinel-2 真彩色影像")
plt.axis('off')
plt.show()
可视化的时候还有个常见问题——影像值范围太大。原始DN值可能是0-10000,直接显示就是一片白。所以一定要做归一化或者拉伸。我个人习惯用2%线性拉伸:
def linear_stretch(array, percent=2):
"""2%线性拉伸"""
p_low = np.percentile(array, percent)
p_high = np.percentile(array, 100 - percent)
stretched = np.clip((array - p_low) / (p_high - p_low), 0, 1)
return stretched
# 对每个波段做拉伸
rgb_stretched = np.stack([
linear_stretch(band3), # R
linear_stretch(band2), # G
linear_stretch(band1) # B
], axis=2)
plt.imshow(rgb_stretched)
plt.title("2%线性拉伸后的影像")
plt.show()
嗯,到这里环境就全部搭好了。你可能会问:「为什么不用TensorFlow?」我个人觉得PyTorch在遥感领域更灵活,尤其是处理超大影像时的自定义数据加载器,写起来比TF顺手得多。当然这只是个人偏好,你用顺手哪个都行。
环境搭建这块,说白了就是「版本对齐」四个字。PyTorch版本、CUDA版本、cuDNN版本、GDAL版本,任何一个对不上,后面都得返工。我建议你把版本号记下来,或者像我一样写个环境配置文件,下次直接一键重建。