通过requirems.txt安装所需的第三方库
├─config.py 项目设置 ├─detect_change.py 进行本地变化识别、语义分割 ├─get_model_performance.py 根据验证数据验证当前模型的准确率 ├─train_and_validate.py 训练并验证模型 ├─export.py 导出onnx模型 ├─start_server.py 开启wsgi服务器,接收前段传输的参数
├─remotesensing_alg 传统遥感算法 | ├─cut_images.py 根据图斑数据从遥感影像中裁剪对应图斑的影像 | ├─fast_glcm.py 快速灰度共生矩阵计算模块 | ├─init.py
├─utils 辅助函数 | ├─augment_semantic_segment_image.py 语义分割图像数据增强,同时加入了计算的纹理信息 | ├─counter.py 训练时统计训练时各种模型评估参数的状态的类 | ├─datasets.py 自定义pytorch数据集 | ├─gdal_utils.py 使用gdal模块编写的一些处理遥感图像的函数 | ├─pipeline.py 模型整体定义、训练、验证pipeline类 | ├─polygon_utils.py 使用geojson模块编写的一些处理shp文件的函数 | ├─transfer_style.py 包含遥感图像风格变换代码 | ├─visualize_result.py 对地貌识别结果进行可视化展示代码 | ├─init.py | ├─calculate_acc.py 计算模型准确率 | ├─crf.py dense crf代码 | ├─detect_change_to_block.py 将变化识别结果进行网格化代码 | ├─conn_mysql.py 连接mysql数据库写入结果 | ├─minio_store.py 连接minio文件数据库,将识别结果进行上传 | ├─output_onnx.py 将pytorch模型导出为onnx模型 | ├─segment_semantic.py 语义分割代码,进行膨胀预测 | ├─detect_change_server_func.py 使用api进行语义分割时使用的一些处理函数 | ├─zip_utils.py 将指定文件压缩为zip文件或者将zip文件解压
├─models | ├─unet.py 构建neseted unet模型 | ├─init.py
自动获取指定文件夹下不同年份的遥感图像,并按照区域id进行遥感图像分辨率调整以及遥感图像对齐,结果存入 ./real_data/processed_data 之中
python ./utils/gdal_utils.py
根据本地文件中的shp文件读取多边形标签,将矢量数据转换为栅格数据,并存入 ./real_data/semantic_mask 之中。
python ./ utils/polygon_utils.py
模型结构图如下:
数据增强方法如下图所示:
使用以下命令进行模型训练
python train_and_validate.py
以下为该程序可选参数,可以按需进行使用:
optional arguments:
-h, --help show this help message and exit
--device DEVICE 确认训练模型使用的机器
--console-output CONSOLE_OUTPUT
在控制台打印程序运行结果
--epochs EPOCHS
--data DATA 数据存储路径
--label LABEL 标签存储路径
--image-size IMAGE_SIZE [IMAGE_SIZE ...]
[图片宽, 图片高]
--fp16 FP16 是否使用半精度训练,默认为True
--model-name MODEL_NAME
训练使用的骨干网络模型名称
--batch-size BATCH_SIZE
训练一批的图片数量
--model-save-path MODEL_SAVE_PATH
模型保存路径,同时会在同目录生成一个相同名称的yaml文件保存模型各种参数变量。
--ohem OHEM 是否使用在线难例挖掘
--update-polygon 是否更新训练标签
--ignore-background IGNORE_BACKGROUND
训练时是否忽视背景类
--train-size TRAIN_SIZE
训练划分数据量
--val-size VAL_SIZE 验证划分数据量
--num-workers NUM_WORKERS
数据读取时使用的线程数量
根据训练的模型保存地址会同时生成对应的模型信息,信息包含如下内容:
OHEM loss: true
batch_size: 10
device: cuda
epochs: 100
fp16training: true
ignore background: false
image_size:
- 512
- 512
index to label:
'01': "\u79CD\u690D\u690D\u88AB"
'03': "\u6797\u8349\u8986\u76D6"
'05': "\u623F\u5C4B\u5EFA\u7B51\uFF08\u533A\uFF09"
'06': "\u94C1\u8DEF\u4E0E\u9053\u8DEF"
'07': "\u6784\u7B51\u7269"
08: "\u4EBA\u5DE5\u5806\u6398\u5730"
09: "\u88F8\u571F"
'10': "\u6C34\u57DF"
model_name: efficientnet-b1
num_classes: 9
save_path: ./output/ss_eff_b1.pth
模型以及模型信息保存在 ./output 之中。
python get_model_performance.py
输出结果:
计算出的acc, precision, recall, f1-score值图存放在 ./output/out_picture/ 中
同时会在控制台输出iou,miou 以及 fwiou 值,如下所示:
各类iou值为: [0.53414416 0.60477744 0.67254459 0.71330089 0.32688211 0.28998783 0 0.61927597]
平均iou值为: 0.4701141229616601
加权fwiou值为: 0.5995258460006233
其中大部分地貌场景的acc值都超过0.9,房屋、铁路道路的f1-score超过0.8,林草、房屋、铁路道路、水域的iou值超过0.6。
变化识别流程图如下:
使用以下程序进行变化识别检测。
python detect_change.py
以下为该程序可选参数,可以按需进行使用:
optional arguments:
-h, --help show this help message and exit
--device DEVICE 确认训练模型使用的机器
--console-output CONSOLE_OUTPUT
在控制台打印程序运行结果
--model-info-path MODEL_INFO_PATH
需要使用的模型信息文件存储路径
--target-path TARGET_PATH
需要进行预测的图像存储路径
--output-path OUTPUT_PATH
输出结果存储路径
--change-threshold CHANGE_THRESHOLD
最后网格化判断网格是否变化的阈值,即如果网格中像素比例超过该阈值则判定该网格为变化区域。
--block-size BLOCK_SIZE
变化区域网格化的大小。
--mode MODE 程序运行模式,包括detect-change、segment-semantic、detect-change-shp
提供要进行地貌语义分割的图像文件夹名,程序会自动分割大幅遥感图像为瓦片图,并对每个瓦片图进行识别,在拼接时丢弃每张瓦片图的边缘 预测不准确的部分,结果栅格数据保存在 ./output/semantic_result/tif 中, 矢量数据保存在 ./output/semantic_result/shp 中。
python detect_change.py --mode segment_semantic
语义分割结果样例图:
针对指定文件夹下的预处理对齐好的遥感图像文件进行变化识别,命名文件遵循以下规则:
年份_地区id1_地区id2.tif
不需要先进行地貌语义分割,直接根据文件夹下的图像文件,先进行语义分割,然后根据分割结果识别变化区域。
输出结果为分块化的变化区域图像如下图所示: