给机器学习新手:用QGIS 3.22快速搞定遥感影像切片,构建你的第一个卫星数据集
当机器学习遇上地理空间数据,许多开发者会陷入两难:既需要高质量的卫星影像作为训练素材,又对专业GIS工具望而生畏。本文将打破这种困境——你不需要成为GIS专家,只需掌握QGIS中三个核心操作,就能将遥感影像转化为可直接喂入模型的切片数据集。
与传统GIS教程不同,我们完全从机器学习视角出发:
- 把QGIS视为空间数据处理黑盒,只关注输入输出接口
- 所有参数设置直指后续PIL/OpenCV读取需求
- 重点解决插件安装、坐标匹配、批量导出等真实项目卡点
1. 环境配置:极简QGIS工作流搭建
1.1 安装与插件配置
从QGIS官网下载3.22 LTR版本(长期支持版更稳定)。首次启动后,按Ctrl+Alt+P打开插件管理器,搜索安装以下两个关键插件:
| 插件名称 | 作用 | 机器学习关联性 |
|---|---|---|
| QuickMapService | 快速接入在线卫星影像服务 | 获取高质量输入数据源 |
| Processing Toolbox | 提供批量处理功能 | 自动化切片流程 |
提示:若下载速度慢,可在插件管理器设置中更换镜像源为
https://plugins.qgis.org
安装完成后,在工具栏空白处右键勾选Processing Toolbox面板。此时你的界面应包含:
- 左侧图层管理器
- 中央地图显示区
- 右侧处理工具箱
1.2 坐标系统选择
机器学习项目最常见的坐标问题是:切片后的图片无法对齐真实地理位置。在QGIS右下角点击EPSG代码(默认可能是4326),建议改为:
- 3857:Web墨卡托投影,适合全球范围影像
- 32650:UTM 50N分区,适合中国东部地区
# 后续用Python读取时需保持坐标系一致 import rasterio from pyproj import CRS # 需与QGIS导出设置相同 target_crs = CRS.from_epsg(32650)2. 数据获取:五分钟接入卫星影像源
2.1 快速加载底图
点击Web→QuickMapServices→Search QMS,搜索并添加以下任一服务:
- Google Satellite(需代理)
- Bing Satellites
- 高德影像(国内直连)
注意:不同影像源分辨率差异显著。北京五环内区域各服务分辨率对比:
| 服务商 | 最高分辨率 | 更新频率 | 适用场景 |
|---|---|---|---|
| 0.5m | 1-3年 | 精细目标检测 | |
| Bing | 1m | 6-12个月 | 中等尺度分类 |
| 高德 | 2m | 不定期更新 | 快速原型验证 |
2.2 自定义感兴趣区域(ROI)
在工具栏选择:
图层→创建图层→新建Shapefile图层- 类型选
多边形,坐标系与项目一致 - 点击工具栏
切换编辑模式,用矩形工具框选目标区域
# 对应Python中的ROI坐标保存 import geopandas as gpd roi = gpd.read_file('study_area.shp') print(roi.total_bounds) # 输出[minx, miny, maxx, maxy]3. 网格生成:匹配模型输入尺寸
3.1 创建切片网格
通过矢量→研究工具→创建网格:
- 网格类型:矩形(多边形)
- 网格范围:选择上步创建的ROI图层
- 水平/垂直间距:根据模型输入尺寸设置
(如YOLOv5常用640x640,则间距=实际地面距离/像素)
关键技巧:在
高级参数中勾选将网格作为多边形输出,便于后续精确控制切片范围。
3.2 样式优化
右键网格图层选择属性→符号化:
- 填充样式设为
无画刷 - 边框颜色设置为醒目红色
- 宽度调整为0.3mm
此时效果应类似:
+-----+-----+-----+ | | | | +-----+-----+-----+ | | | | +-----+-----+-----+4. 批量导出:自动化切片流水线
4.1 布局配置
点击项目→新建打印布局,进行关键设置:
- 画布尺寸设为与模型输入相同的像素值(如640x640)
- 添加地图项并调整至充满画布
- 在
地图项属性中:- 比例锁定为1:1
- 勾选
受地图集控制 - 边距设为0
4.2 地图集生成
点击地图集→地图集设置:
- 覆盖图层:选择网格图层
- 排序表达式:按
$id升序确保可复现 - 输出文件名:使用表达式如
'tile_'||@atlas_featurenumber||'.png'
4.3 批量导出
在布局→导出中选择:
- 格式:PNG(无损)或JPG(高压缩)
- 分辨率:72dpi(屏幕显示)或300dpi(打印质量)
- 保存路径:建议按
/train/images/和/val/images/分类存储
# 导出后的典型目录结构 dataset/ ├── train/ │ ├── images/ # 切片图片 │ └── labels/ # 后续标注文件 └── val/ ├── images/ └── labels/5. 质量验证与常见问题排查
5.1 坐标偏移检查
用Python验证切片地理坐标:
import rasterio from rasterio.transform import from_origin # 假设切片为500mx500m transform = from_origin(minx, maxy, 500, 500) with rasterio.open('tile_001.png') as src: print(src.transform * (0, 0)) # 应返回网格左上角坐标5.2 高频报错解决方案
| 错误现象 | 可能原因 | 解决方案 |
|---|---|---|
| 切片全黑 | 地图项未关联到影像图层 | 在布局中重新绑定地图源 |
| 切片边缘缺失 | 边距设置过大 | 将地图项边距设为0 |
| 文件名不连续 | 地图集排序规则错误 | 按$id字段排序导出 |
| 图片无法用OpenCV读取 | 中文路径或特殊字符 | 改用全英文数字路径 |
在最近一个城市绿化识别项目中,这套流程帮助团队在2小时内完成了2000+张标准切片的准备。最实用的经验是:提前用QGIS的测量工具确认实际地面距离与像素比例,避免后期重新切片。比如发现1像素=0.8米时,将网格间距设为模型输入尺寸的0.8倍即可完美匹配。