Google Earth Engine(GEE)深度学习入门教程- GEE导出篇

GEE导出篇

官方教程:TFRecord 和地球引擎
Code_editor_diagram

在GEE的JS Code Editor中,我们按照我们的需要去处理对应的遥感影像,得到处理后Image影像。为了导出后读取数据,在导出前一定清楚每个波段的名称(不然没法读取)。深度学习数据集所需数据以为patch为单位,所以需要对整个遥感影像进行裁剪,我探索出来GEE能实现的裁剪方法的有2种滑窗裁剪、随机裁剪

随机裁剪:随机选择生成多个样点,然后裁剪样点周围的邻域,导出。用作构造数据集

滑窗裁剪:设定步幅和窗口大小,裁剪完整影像,导出。用作大范围推理验证

滑窗裁剪

TFRecord_diagram

导出有2个重要参数:patchSizekernelSize。patchSize 是指滑窗不重叠区域的大小,kernelSize是指滑窗重叠缓冲区的大小。例如:patchSize 为32,kernelSize为32,则导出的图像单个大小为64*64,中间的32*32为不重叠区域,边缘的16格像素为缓冲区大小。导出图像时,数据按通道、高度、宽度 (CHW) 排序。导出可以拆分为多个 TFRecord 文件,每个文件包含一个或多个 大小的 patches ,这是用户在导出中指定的。文件的大小(以字节为单位是用户在参数中指定的)。

代码如下:

Export.image.toCloudStorage({image : image.toFloat(),         //保证所有层数据类型统一,导出Image影像description : desc,              //任务名称bucket : BUCKET,                 //存储桶名称fileNamePrefix : FOLDER + '/' + desc,      //保存的路径及文件名region : ee.Feature(savePolys.get(g)).geometry(),//范围矢量scale : 10,                     //分辨率fileFormat : 'TFRecord',        //格式maxPixels : 1e13,                      formatOptions : {'patchDimensions': [32,32], //核心区大小'kernelSize': [32,32],     //缓冲区'compressed': true,'maxFileSize': 104857600*10 //400M }});

导出结果:

image-20240108172111841

导出内容除了包含TFRecord格式的数据包之外,还有一个json格式文件,文件内部保存着影像的裁剪结果和地理位置信息,例如:

{"projection": {"crs": "EPSG:4326","affine": {"doubleMatrix": [8.983152841195215E-5, 0.0, 116.04113446753695, 0.0, -8.983152841195215E-5, 33.789500591456914]}},"patchDimensions": [32, 32],"patchesPerRow": 19,"totalPatches": 285
}

其中:crs为投影坐标系、doubleMatrix为地理仿射变换矩阵、patchDimensions为不重叠区域大小、patchesPerRow为裁剪区域内每行得到的样本数量、totalPatches为总的patch数量。这些信息都是为了将裁剪后的普通图像恢复为遥感影像。

随机裁剪

随机生成样点,然后裁剪样点周围的邻域,导出。主要用作构造数据集,扩充数据集的样本量。

因为本文的使用的预处理过程比较复杂,数据量比较大,直接对整幅影像导出会导致GEE用户内存溢出,所以本文对研究区进行区块划分

划分训练、验证、测试区域的代码分为以下几个步骤:

  1. 确定划分区域的左下角和右上角的经纬度坐标(corner1、corner2)
  2. 设定横向纵向划分块数:sliceN = 10
  3. 生成区块
  4. 使用ee.Filter.isContained去除不被包含在研究区的区块
  5. 按照6:2:2比例划分区块为训练、验证、测试区块
  6. 导出区块矢量为geometryLayer并保存到Map.drawingTools()中

在这里插入图片描述

//将研究区划分为多个区域,并按照6:2:2的比例划分训练、验证、测试区域,//!!!仅需执行一次,手动将区域格式变化为featureColectionvar roi = ee.FeatureCollection('TIGER/2018/States').filter(ee.Filter.eq('NAME', 'Illinois'));// 将研究区域按照 10*10 的大小进行分割,循环处理子区域var corner1 = [-91.70112615545109, 36.986063288694794]var corner2 = [-87.30659490545109, 42.60259690092805]var sliceN = 10;var slicePolysList = ee.List([])for (var x = corner1[0]; x < corner2[0]; x += (corner2[0]-corner1[0])/sliceN) {for (var y = corner1[1]; y < corner2[1]; y += (corner2[1]-corner1[1])/sliceN) {var x2 = x+(corner2[0]-corner1[0])/sliceNvar y2 = y+(corner2[1]-corner1[1])/sliceNvar area = ee.Geometry.Rectangle(x, y, x2, y2);slicePolysList = slicePolysList.add(ee.Feature(area))}}var slicePolys = ee.FeatureCollection(slicePolysList)   // 去除不被完全包含的区域.filter(ee.Filter.isContained({leftField: '.geo',rightValue: roi.geometry()})).randomColumn("random", 1)var trainPolys = slicePolys.filter(ee.Filter.rangeContains("random",0,0.6))var evalPolys = slicePolys.filter(ee.Filter.rangeContains("random",0.6,0.8))var testPolys = slicePolys.filter(ee.Filter.rangeContains("random",0.8,1))var geometryLayer = ui.Map.GeometryLayer({geometries: [trainPolys.geometry().getInfo()], name: 'trainPolys',color: 'green'});// 将 GeometryLayer 添加到地图Map.drawingTools().layers().add(geometryLayer);var geometryLayer = ui.Map.GeometryLayer({geometries: [evalPolys.geometry().getInfo()], name: 'evalPolys',color: 'red'});// 将 GeometryLayer 添加到地图Map.drawingTools().layers().add(geometryLayer);var geometryLayer = ui.Map.GeometryLayer({geometries: [testPolys.geometry().getInfo()], name: 'testPolys',color: 'blue'});// 将 GeometryLayer 添加到地图Map.drawingTools().layers().add(geometryLayer);

区块划分完成后,我们使用循环逐个区块随机采样并进行导出,单个样本大小为64*64。单次采样过多也会内存溢出,所以一个区块也要采样多次,每次采样少一点。

//此时需要让单次处理的区域尽可能小
//https://developers.google.com/earth-engine/guides/tf_examples
var BUCKET = 'yqs'
var FOLDER = 'yangfangVal'var TRAINING_BASE = 'training_patches'
var EVAL_BASE = 'eval_patches'
var TEST_BASE = 'test_patches'var BANDS  = ["B2","B3","B4","B5","B6","B7","B8","B8A","B11","B12"]
var RESPONSE = 'soya'
var FEATURES = BANDS.concat([RESPONSE])
print(FEATURES)var N = 160       //单个区域内的采样数量。
var n = 16      //单区域采样次数。增大n,可以减少单次采样的数量,防止出现Computed value is too large.错误 !但是导出速度会变慢
var KERNEL_SIZE = 64    //减小此值可以防止出现采样时出现 Computed value is too large. 128导出数据包太大了
var KERNEL_SHAPE = [KERNEL_SIZE, KERNEL_SIZE]
var list = ee.List.repeat(1, KERNEL_SIZE)
var lists = ee.List.repeat(list, KERNEL_SIZE)
var kernel = ee.Kernel.fixed(KERNEL_SIZE, KERNEL_SIZE, lists)trainPolys = trainPolys.toList(trainPolys.size());  // 将 FeatureCollection 转换为 FeatureList
evalPolys = evalPolys.toList(evalPolys.size());  
testPolys = testPolys.toList(testPolys.size());  var savePolys = testPolys
var BASE = TEST_BASE//TRAINING_BASE;//EVAL_BASE//TEST_BASE
//为了保证内存不溢出,在处理图片的时候尽可能处理较小块的区域
for (var g = 0; g < savePolys.size().getInfo(); g++) {var geomSample = ee.FeatureCollection([]); // 用于存储采样点的 FeatureCollection// 数据集标签的加载函数,请根据自己需求对应修改。var soya = CDLlib.getCDL()//影像预处理函数,请根据自己需求对应修改。var S2 = S2lib.getS2Image(BANDS,ee.Feature(savePolys.get(g)).geometry())var image = S2.addBands([soya]).rename(FEATURES)//给多个数据包命名var desc = BASE + '_g' + g.toString();print(image)var arrays = image.toFloat().neighborhoodToArray(kernel)for (var i = 0; i < n; i++) {var sample = arrays.sample({region: ee.Feature(savePolys.get(g)).geometry(),scale: 10,numPixels: N / n,seed: i,tileScale: 8});// print(sample.size())geomSample = geomSample.merge(sample); // 将采样点合并到 geomSample 中}// Map.addLayer(image,{bands: ['soya']},desc);//调试用// //print(geomSample.size())//调试用// Map.addLayer(ee.Feature(savePolys.get(g)).geometry().buffer(640),[],desc);//调试用var task = Export.table.toCloudStorage({collection: geomSample,description: desc,bucket: BUCKET,fileNamePrefix: FOLDER + '/' + desc,fileFormat: 'TFRecord',});
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/334803.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Centos7 手动更改系统时间

文章目录 1.更改系统时间2.写入系统时间3.查看是否写入成功 1.更改系统时间 date -s "2017-12-18 09:40:00"2.写入系统时间 hwclock -w3.查看是否写入成功 timedatectl

VMware复制粘贴共享文件夹

win和虚拟机之间&#xff0c;无法复制粘贴&#xff0c;共享文件夹的解决方案。 安装VMware tools 1&#xff0c;先检查虚拟机设置部分。共享文件夹已启用。复制粘贴已启用。 2&#xff0c;安装tools.选择重新安装VMware tools. (此图片为安装过的截图) 成功后会显示如图。…

解决word图片格式错乱、回车图片不跟着换行的问题

解决word图片格式错乱、回车图片不跟着换行的问题 1.解决方法。 先设置为嵌入型 但是设置的话会出现下面的问题。图片显示不全。 进一步设置对应的行间距&#xff0c;原先设置的是固定值&#xff0c;需要改为1.5倍行距的形式&#xff0c;也就是说不能设置成固定值就可以。

Nginx location 配置 - Part 2

接上文 链接: Nginx 简介和入门 - part1 上文 我们简单地在 nginx 创建了3个虚拟主机&#xff0c; 虽然这个3个主机都是用占用80端口 但是我们可以用不同的域名来实现区分访问3台虚拟主机。 但是&#xff0c; 实际项目上&#xff0c; 我们更加多地会使用location 配置而不是…

5分钟搭建开源运维监控工具Uptime Kuma并实现无公网IP远程访问

文章目录 **主要功能**一、前期准备本教程环境为&#xff1a;Centos7&#xff0c;可以跑Docker的系统都可以使用本教程安装。本教程使用Docker部署服务&#xff0c;如何安装Docker详见&#xff1a; 二、Docker部署Uptime Kuma三、实现公网查看网站监控四、使用固定公网地址访问…

SpringBoot 如何增强PageHelper入参的健壮性

PageHelper.startPage(int pageNum, int pageSize, boolean count) 参数为外部输入&#xff0c;故存在异常输入场景。比如 pageNum 和 pageSize 输入的值 负数 或者 0&#xff0c;所以引入PageUtils来对入参进行判断矫正&#xff0c;从而避免引入异常。 第1步&#xff1a;支持…

JAVA基础学习笔记-day15-File类与IO流

JAVA基础学习笔记-day15-File类与IO流 1. java.io.File类的使用1.1 概述1.2 构造器1.3 常用方法1、获取文件和目录基本信息2、列出目录的下一级3、File类的重命名功能4、判断功能的方法5、创建、删除功能 2. IO流原理及流的分类2.1 Java IO原理2.2 流的分类2.3 流的API 3. 节点…

【PostgreSQL在线创建索引(CIC)功能的锁分析以及使用注意】

前一篇文章提到了普通创建索引会阻塞DML操作 PostgreSQL创建索引的锁分析和使用注意 而PostgreSQL里可以使用create index concurrently 在线创建索引(CIC)功能&#xff0c;降低创建索引在表上申请的锁的级别&#xff0c;ShareUpdateExclusiveLock级别的锁和RowExclusiveLock…

框架技术与应用开发期末速成

spring Spring简介 Spring是个java企业级应用的开源开发框架。Spring主要用来开发web应用是一个轻量级的控制反转(IOC)和面向切面(AOP)的容器框架。 Spring体系结构 核心容器: Core模块 提供了框架的基本组成部分&#xff0c;包括TOC和依赖注入功能 Beans模块 提供 BeanFacto…

忆阻器芯片STELLAR权重更新算法(清华大学吴华强课题组)

参考文献&#xff08;清华大学吴华强课题组&#xff09; Zhang, Wenbin, et al. “Edge learning using a fully integrated neuro-inspired memristor chip.” Science 381.6663 (2023): 1205-1211. STELLAR更新算法原理 在权值更新阶段&#xff0c;只需根据输入、输出和误差…

扩展学习|数据融合助推商务智能与分析

文献来源&#xff1a;[1]李爱华,续维佳,石勇.基于数据融合的商务智能与分析架构研究[J].计算机科学,2022,49(12):185-194. 一、信息融合 &#xff08;一&#xff09;信息融合定义演变 早期信息融合的定义指出&#xff0c;其主要任务是综合分析若干传感器观测到的信息[9,…

[开源]万界星空开源MES系统,支持低代码大屏设计

一、开源系统概述&#xff1a; 万界星空科技免费MES、开源MES、商业开源MES、商业开源低代码MES、市面上最好的开源MES、MES源代码、免费MES、免费智能制造系统、免费排产系统、免费排班系统、免费质检系统、免费生产计划系统、精美的数据大屏。 二、开源协议&#xff1a; 使…