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.rhkb.cn/news/233404.html

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

相关文章

数环通12月产品更新:新增数据表相关功能、优化编辑器,15+应用进行更新

为了满足用户不断增长的需求&#xff0c;我们持续努力提升产品的功能和性能&#xff0c;以更好地支持用户的工作。 数环通12月的最新产品更新已经正式发布&#xff0c;带来了一系列强大的功能&#xff0c;以提升您的工作效率和系统的可靠性。 更新快速预览 新增&优化功能&a…

小梅哥Xilinx FPGA学习笔记20——无源蜂鸣器驱动设计与验证(音乐发生器设计)

目录 一&#xff1a;章节导读 二&#xff1a;无源蜂鸣器驱动原理 三&#xff1a;PWM 发生器模块设计 3.1 PWM 发生器模块框图 3.2 PWM 发生器模块接口功能描述 3.3 PWM波生成设计文件代码 3.4 测试仿真文件 3.5 测试仿真结果 3.6 板级调试与验证之顶层文件设计 四&am…

【Project】TPC-Online Module (manuscript_2024-01-07)

PRD正文 一、概述 本模块实现隧道点云数据的线上汇总和可视化。用户可以通过注册和登录功能进行身份验证&#xff0c;然后上传原始隧道点云数据和经过处理的数据到后台服务器。该模块提供数据查询、筛选和可视化等操作&#xff0c;同时支持对指定里程的分段显示和点云颜色更改…

系列十一、(三)Sentinel控制台

一、Sentinel控制台 二、实时监控 2.1、概述 实时监控&#xff0c;顾名思义是用来实时监控的&#xff0c;具体监控的是接口请求通过的QPS和拒绝的QPS&#xff0c;默认情况下没有访问记录&#xff0c;所以看不到任何记录&#xff0c;需要访问接口才会有记录。另外需要注意&…

C++ 模板进阶

目录 一、非类型模板参数 二、模板的特化 1、函数模板特化 2、类模板特化 全特化 偏特化 3、例题 三、模板分离编译 1、定义 2、解决方法 3、模板总结 一、非类型模板参数 模板参数分类类型形参与非类型形参。 类型形参即&#xff1a;出现在模板参数列表中&#xf…

662. 二叉树最大宽度

题目 给你一棵二叉树的根节点 root &#xff0c;返回树的 最大宽度 。 树的 最大宽度 是所有层中最大的 宽度 。 每一层的 宽度 被定义为该层最左和最右的非空节点&#xff08;即&#xff0c;两个端点&#xff09;之间的长度。将这个二叉树视作与满二叉树结构相同&#xff0…

【Python学习】Python学习5-条件语句

目录 【Python学习】Python学习5-条件语句 前言if语句if语句判断条件简单的语句组参考 文章所属专区 Python学习 前言 本章节主要说明Python的条件语句&#xff0c;Python条件语句是通过一条或多条语句的执行结果&#xff08;True或者False&#xff09;来决定执行的代码块。 …

日志服务管理和inode号

一、系统日志管理 1.1系统日志的介绍 在现实生活中&#xff0c;记录日志也非常重要&#xff0c;比如银行的转账记录&#xff0c;飞机上的黑盒子&#xff0c;那么将系统和应用发生的事件记录至日志中&#xff0c;以助于排错和分析使用 日志记录的内容包括&#xff1a; 历史事…

设计模式② :交给子类

文章目录 一、前言二、Template Method 模式1. 介绍2. 应用3. 总结 三、Factory Method 模式1. 介绍2. 应用3. 总结 参考内容 一、前言 有时候不想动脑子&#xff0c;就懒得看源码又不像浪费时间所以会看看书&#xff0c;但是又记不住&#xff0c;所以决定开始写"抄书&qu…

代码随想录算法训练营day6|242.有效的字母异位词、349.两个数组的交集、202.快乐数

哈希表理论基础 建议&#xff1a;大家要了解哈希表的内部实现原理&#xff0c;哈希函数&#xff0c;哈希碰撞&#xff0c;以及常见哈希表的区别&#xff0c;数组&#xff0c;set 和map。 什么时候想到用哈希法&#xff0c;当我们遇到了要快速判断一个元素是否出现集合里的时…

【React系列】React中的CSS

本文来自#React系列教程&#xff1a;https://mp.weixin.qq.com/mp/appmsgalbum?__bizMzg5MDAzNzkwNA&actiongetalbum&album_id1566025152667107329) 一. React中的css方案 1.1. react 中的 css 事实上&#xff0c;css 一直是 React 的痛点&#xff0c;也是被很多开发…

自动生成表结构screw

采用的组件 screw 操作流程&#xff1a; 1、新建springboot 项目 2、引入相关的依赖 <!-- screw核心 --><dependency><groupId>cn.smallbun.screw</groupId><artifactId>screw-core</artifactId><version>1.0.4</version><…

2023 年精选:每个 DevOps 团队都应该了解的 5 种微服务设计模式

微服务彻底改变了应用程序开发世界&#xff0c;将大型整体系统分解为更小、更易于管理的组件。这种架构风格的特点是独立、松散耦合的服务&#xff0c;带来了从可扩展性、模块化到更高的灵活性等众多优势。 DevOps 团队如何最好地利用这种方法来实现最高效率&#xff1f;答案在…

分布式基础概念

分布式基础概念 1 微服务 微服务架构风格&#xff0c;就像是把一个单独的应用程序开发为一套小服务&#xff0c;每个小服务运行在自己的进程中&#xff0c;并使用轻量级机制通信&#xff0c;通常是HTTP API。这些服务围绕业务能力来构建&#xff0c;并通过完全自动化部署机制…

ElasticSearch 集群搭建与状态监控cerebro

单机的elasticsearch做数据存储&#xff0c;必然面临两个问题:海量数据存储问题、单点故障问题。为了解决存储能力上上限问题就可以用到集群部署。 海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard)&#xff0c;存储到多个节点单点故障问题:将分片数据在不同节点备份 (r…

[每周一更]-(第82期):选购NAS中重要角色RAID

网络附加存储&#xff08;NAS&#xff09;在现代数字生活中扮演着至关重要的角色&#xff0c;而对于NAS的选择中&#xff0c;关注RAID的重要性更是不可忽视的。 数据存储和安全越来越受关注&#xff1b; 为什么要使用NAS&#xff1f; 集中式存储&#xff1a; NAS提供了一个集中…

【计算机病毒传播模型】报告:区块链在车联网中的应用

区块链在车联网中的应用 写在最前面题目 - 26 车联网安全汇报演讲稿-删减2后&#xff0c;最终版&#xff08;1469字版本&#xff09;汇报演讲稿-删减1后&#xff08;2555字版本&#xff09;汇报演讲稿-删减前&#xff08;3677字版本&#xff09;1 概述1.1 车联网1.2 区块链1.3 …

Linux离线安装MySQL(rpm)

目录 下载安装包安装MySQL检测安装结果服务启停MySQL用户设置 下载安装包 下载地址&#xff1a;https://downloads.mysql.com/archives/community/ 下载全量包如&#xff1a;(mysql-8.1.0-1.el7.x86_64.rpm-bundle.tar) 解压&#xff1a;tar -xzvf mysql-8.1.0-1.el7.x86_64.…

Docker学习与应用(四)-容器数据卷

1、容器数据卷 1&#xff09;什么是容器数据卷 docker的理念回顾 将应用和环境打包成一个镜像&#xff01; 数据&#xff1f;如果数据都在容器中&#xff0c;那么我们容器删除&#xff0c;数据就会丢失&#xff01;需求&#xff1a;数据可以持久化 MySQL&#xff0c;容器删…

docker kingbase

docker kingbase run 命令 docker run -tid \ -e ENABLE_CIyes \ -e NEED_STARTyes \ -e DB_MODEoracle \ -e DB_USERkingbase \ -e DB_PASSWORD123456 \ --privileged \ -p 4321:54321 \ -v /home/admin/SoftWare/volume/kingbase/userdata/data:/home/kingbase/userdata/da…