当前位置: 首页 > news >正文

遥感影像图像分割-地物提取模型训练与大图直接推理流程

功能需求

目前常用的地物要素提取算法和流程还是参考视觉图像上的语义分割算法模型,主要原因是遥感影像大小不一,而且大的非常大,这样导致的问题就是训练时无法直接将完整大图读取到内存或显存中,再加上训练时模型参数随着像素大小的增大而增大,这样更大的加剧了显存的占用量,最终导致的结果就是可能一张显卡的显存都不够读取一张影像进行模型训练的。所以目前采用的手段基本都是先将遥感影像裁剪为相同尺寸大小,比如256x256、512x512、1024x1024等等,然后借鉴视觉图像的语义分割模型进行训练,训练好的模型也不能直接使用原始大图影像进行推理,因为输入到模型的大图会在初始阶段resize为模型需要的尺寸,比如上面说到的512x512,这样图像上的很多细节就消失了,与训练样本完全不是一个空间分辨率了。所以模型推理的时候也是先将遥感影像滑窗裁剪为小图,然后对这些小图进行预测,最后将预测的结果拼接为大图。这个过程因为涉及到大图裁剪为小图,小图又拼接为大图,这就会有多次数据读写到本地磁盘的过程,因此导致推理一张影像的时间比较长,那么有没有什么办法可以去掉中间小图数据读写到磁盘的过程呢?以及地物提取模型训练与大图直接推理的具体流程是怎么样的呢?下面将详细说明

解决思路

数据预处理

在这里插入图片描述

遥感影像数据预处理的流程如上图所示,主要包括下面几个步骤:

遥感影像获取

根据需求的不同我们获取不同的遥感影像,比如针对云检测任务,需要获取不同地区不同时间的含云影像,如下图所示:

在这里插入图片描述

类别矢量图斑标注

对于云检测任务,因为遥感影像过大,我们在arcgis上进行图斑标注。首先创建一个空白的矢量文件,然后启动编辑功能,根据影像中云边界勾绘云类别图斑,同时检查标注质量,查看是否有漏标或误标情况。

在这里插入图片描述

矢量图斑转栅格标签

因为语义分割模型都是基于图片数据进行模型训练,所以需要将矢量文件中的类别图斑转为栅格图片标签,转换方式可见这篇博客,转换后的结果如下图所示:

在这里插入图片描述

影像与标签同步裁剪

根据上面功能需求的说明,需要将原始影像和类别标签大图同步裁剪为小图,裁剪方式可见这篇博客,裁剪后的结果如下图所示:

在这里插入图片描述

这样用于模型训练的样本集就制作完成了。

模型训练

前面提到过遥感影像地物要素提取还是采用视觉图像中的语义分割算法,而语义分割算法种类很多,比如从最开始的FPN、PSPNet,到后面的DeepLabV3、DeepLabV3Plus,还有轻量化的Unet、Unet++、Linknet,以及基于Transformer结构的UPerNet、Segformer等前沿算法,网上开源的代码也很多,本人也搭建了一套包含多类语义分割算法的矿建,详细介绍见这篇博客。

影像推理

模型训练好后就需要对新的影像进行预测推理了,常用的方法就是先将遥感大图滑窗裁剪为和模型训练图片一样大的小图,将这些小图逐个输入到模型进行推理预测,得到预测结果后重新拼接为大图。前面说过这个方法因为有多次数据读写到本地磁盘的过程,所以增加了影像推理时间。下面讲一种避免读写落盘的方法:

当我们读取遥感大图时,先不要将全部数据读取到内存中,而是只读取影像的元数据信息,同时我们创建一个和原始遥感大图尺寸和地理坐标信息一致的空影像。然后进行滑窗裁剪图片,这时不是真的裁剪出小图,而是只记录每个小图的左上角坐标和尺寸,当进行模型推理时,根据每张小图的左上角坐标和尺寸实时的从遥感大图中裁剪出对应位置的小图,再将这张小图进行预测,预测的结果直接写入上面创建的那个空影像中,因为我们知道每张小图在大图中的具体位置和尺寸,所以每张小图可以准确的写入空影像对应的位置中,这样所有小图预测后就同步写入到空影像中了,而这个结果和原始影像大图具有相同的尺寸和地理坐标信息。

结果后处理

因为遥感行业特殊的任务需求,一般最后提交的结果是该类别的矢量图斑,也就是矢量文件,里面是每个类别对应的面矢量图斑。所以当得到与原始影像大小相同后的类别结果后,还需要对类别栅格图进行栅格转矢量,详细转换方法可见这篇博客。得到矢量文件后,也会根据不同地物类别的要求进行其他的后处理过程,如果基于建筑物的规则化处理,基于耕地任务的边界简化,或者基于道路任务的道路面矢量转道路中心线处理,这些在后面将进行逐一讲解。

在这里插入图片描述

整个地物要素提取的模型训练和推理流程大概就是这些了!!!

获取本博客全部代码资料或咨询交流见 博主首页→个人简介
1、本博客相关代码;
2、指导代码运行;
3、同类任务咨询交流;

http://www.lryc.cn/news/584659.html

相关文章:

  • AI翻唱——So-VITS-SVC
  • ARM环境上 openEuler扩展根盘并扩展到根分区中
  • MySQL数据库调优
  • C++ 中最短路算法的详细介绍(加强版)
  • 【养老机器人】核心技术
  • 深入拆解Spring核心思想之一:IoC
  • vue3中ref和reactive的使用、优化
  • 入门级别的Transformer模型介绍
  • Linux 内核日志中常见错误
  • 学习JNI 二
  • 机器学习1
  • Java线程池原理概述
  • Spring Boot:将应用部署到Kubernetes的完整指南
  • 什么?不知道 MyBatisPlus 多数据源(动态数据源)干什么的,怎么使用,看这篇文章就够了。
  • Windows安装DevEco Studio
  • 深入理解oracle ADG和RAC
  • 高并发导致重复key问题--org.springframework.dao.DuplicateKeyException
  • 企业电商平台搭建:ZKmall开源商城服务器部署与容灾方案
  • Java中实现线程安全的几种方式
  • 华为OD 周末爬山
  • 模块三:现代C++工程实践(4篇)第二篇《性能调优:Profile驱动优化与汇编级分析》
  • 关于k8s Kubernetes的10个面试题
  • 【牛客刷题】跳台阶(三种解法深度分析)
  • Java 21 核心技术:虚拟线程与结构化并发实战
  • Django专家成长路线知识点——AI教你学Django
  • Spring Boot + Javacv-platform:解锁音视频处理的多元场景
  • 处理Web请求路径参数
  • 小程序开发平台,自主开发小程序源码系统,多端适配,带完整的部署教程
  • GitHub上优秀的开源播放器项目介绍及优劣对比
  • PPT 倒计时工具:把控节奏,掌握时间,超简单超实用让演示游刃有余