前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Google Earth Engine(Tensorflow深度学习)

Google Earth Engine(Tensorflow深度学习)

作者头像
GIS与遥感开发平台
发布于 2022-04-29 00:45:04
发布于 2022-04-29 00:45:04
2.5K00
代码可运行
举报
运行总次数:0
代码可运行

本次我们讲一下如何利用colab训练深度学习(Tensorflow)模型,并上传到Google云平台上面。然后我们再通过GEE进行调用,这样我们在GEE上面运行自己的深度学习模型了。

不仅可以进行使用卷积神经网络,还可以用深度学习做一些回归的训练。

我们本次需要使用到的除了GEE的在线平台,还有colab(之前讲过如何使用),还要在谷歌云平台建立自己的工程(project)及工程下面的存储空间(storage bucket)。

本期的内容会比较长,代码也会稍微困难一些。官方文档对其中一些代码解释的也不是很清楚,但是我们主要是通过这个代码理解整个模型训练的流程。那些模型处理的过程我们也不用太关心。

01

colab训练模型

首先还是授权:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from google.colab import auth
auth.authenticate_user()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
import ee
ee.Authenticate()
ee.Initialize()

定义我们常用的变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#导入Tensorflow的包
import tensorflow as tf
#提前预设一些变量
#把谷歌云平台里面你的工程名输入进去
PROJECT = 'boyguo'
#设置Cloud Storage bucket,会把你的训练数据和测试数据存储进去 
OUTPUT_BUCKET = 'xiaoguo1'
# 使用Landsat-8数据作为训练
L8SR = ee.ImageCollection('LANDSAT/LC08/C01/T1_SR')
# 只选择其中一部分波段进行使用
BANDS = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7']
# 这个跟我们上期使用的数据一样,都是三种地物类型
LABEL_DATA = ee.FeatureCollection('projects/google/demo_landcover_labels')
# 我们预测的的属性
LABEL = 'landcover'
# 总共分为三类
N_CLASSES = 3
# 把波段名和最后的标签名提前设置好
FEATURE_NAMES = list(BANDS)
FEATURE_NAMES.append(LABEL)
#这里把存储的训练数据和测试数据提前设置好
TRAIN_FILE_PREFIX = 'Training_demo'
TEST_FILE_PREFIX = 'Testing_demo'
file_extension = '.tfrecord.gz'
TRAIN_FILE_PATH = 'gs://' + OUTPUT_BUCKET + '/' + TRAIN_FILE_PREFIX + file_extension
TEST_FILE_PATH = 'gs://' + OUTPUT_BUCKET + '/' + TEST_FILE_PREFIX + file_extension

获取Landsat-8数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 定义去云的函数
def maskL8sr(image):
  cloudShadowBitMask = ee.Number(2).pow(3).int()
  cloudsBitMask = ee.Number(2).pow(5).int()
  qa = image.select('pixel_qa')
  mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0).And(
    qa.bitwiseAnd(cloudsBitMask).eq(0))
  return image.updateMask(mask).select(BANDS).divide(10000)
# 对数据做个中值合成
image = L8SR.filterDate('2018-01-01', '2018-12-31').map(maskL8sr).median()

提取训练数据和测试数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#提取Landsat-8数据,并把数据分为训练数据和测试数据
sample = image.sampleRegions(
  collection=LABEL_DATA, properties=[LABEL], scale=30).randomColumn()
#百分之70的训练数据,百分之30的测试数据
training = sample.filter(ee.Filter.lt('random', 0.7))
testing = sample.filter(ee.Filter.gte('random', 0.7))

把数据传到云平台上

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 把数据传到云平台上
training_task = ee.batch.Export.table.toCloudStorage(
  collection=training,
  description='Training Export',
  fileNamePrefix=TRAIN_FILE_PREFIX,
  bucket=OUTPUT_BUCKET,
  fileFormat='TFRecord',
  selectors=FEATURE_NAMES)


testing_task = ee.batch.Export.table.toCloudStorage(
  collection=testing,
  description='Testing Export',
  fileNamePrefix=TEST_FILE_PREFIX,
  bucket=OUTPUT_BUCKET,
  fileFormat='TFRecord',
  selectors=FEATURE_NAMES)
# 任务开始
training_task.start()
testing_task.start()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#检查数据是否存储成功
print('Found training file.' if tf.io.gfile.exists(TRAIN_FILE_PATH) 
    else 'No training file found.')
print('Found testing file.' if tf.io.gfile.exists(TEST_FILE_PATH) 
    else 'No testing file found.')

解析数据

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
train_dataset = tf.data.TFRecordDataset([TRAIN_FILE_PATH, TEST_FILE_PATH],compression_type='GZIP')


columns = [
  tf.io.FixedLenFeature(shape=[1], dtype=tf.float32) for k in FEATURE_NAMES
]


# Dictionary with names as keys, features as values.
features_dict = dict(zip(FEATURE_NAMES, columns))


#定义解析数据的函数
def parse_tfrecord(example_proto):
  """The parsing function.


  Read a serialized example into the structure defined by FEATURES_DICT.


  Args:
    example_proto: a serialized Example.


  Returns:
    A tuple of the predictors dictionary and the LABEL, cast to an `int32`.
  """
  parsed_features = tf.io.parse_single_example(example_proto, features_dict)
  labels = parsed_features.pop(LABEL)
  return parsed_features, tf.cast(labels, tf.int32)


# Map the function over the dataset.
parsed_dataset = train_dataset.map(parse_tfrecord, num_parallel_calls=4)


# 数据转成元组.Make predictors 1x1xP and labels 1x1xN_CLASSES.
def to_tuple(inputs, label):
  return (tf.expand_dims(tf.transpose(list(inputs.values())), 1),
          tf.expand_dims(tf.one_hot(indices=label, depth=N_CLASSES), 1))


input_dataset = parsed_dataset.map(to_tuple)


input_dataset = input_dataset.shuffle(128).batch(8)

运行模型:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from tensorflow import keras
# 定义模型的结构
model = tf.keras.models.Sequential([
  tf.keras.layers.Input((None, None, len(BANDS),)),
  tf.keras.layers.Conv2D(64, (1,1), activation=tf.nn.relu),
  tf.keras.layers.Dropout(0.1),
  tf.keras.layers.Conv2D(N_CLASSES, (1,1), activation=tf.nn.softmax)
])
# 编译模型
model.compile(optimizer=tf.keras.optimizers.Adam(),
              loss='categorical_crossentropy',
              metrics=['accuracy'])
# 训练模型
model.fit(x=input_dataset, epochs=7)
#存储模型
MODEL_DIR = 'gs://' + OUTPUT_BUCKET + '/xiaoguo_model'
model.save(MODEL_DIR, save_format='tf')

对模型进行处理,使它可以上传到ai platform上面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from tensorflow.python.tools import saved_model_utils


meta_graph_def = saved_model_utils.get_meta_graph_def(MODEL_DIR, 'serve')
inputs = meta_graph_def.signature_def['serving_default'].inputs
outputs = meta_graph_def.signature_def['serving_default'].outputs


# Just get the first thing(s) from the serving signature def.  i.e. this
# model only has a single input and a single output.
input_name = None
for k,v in inputs.items():
  input_name = v.name
  break


output_name = None
for k,v in outputs.items():
  output_name = v.name
  break


# Make a dictionary that maps Earth Engine outputs and inputs to
# AI Platform inputs and outputs, respectively.
import json
input_dict = "'" + json.dumps({input_name: "array"}) + "'"
output_dict = "'" + json.dumps({output_name: "output"}) + "'"
# Put the EEified model next to the trained model directory.
EEIFIED_DIR = 'gs://' + OUTPUT_BUCKET + '/eeified_xiaoguo_model'


# You need to set the project before using the model prepare command.
!earthengine set_project {PROJECT}
!earthengine model prepare --source_dir {MODEL_DIR} --dest_dir {EEIFIED_DIR} --input {input_dict} --output {output_dict}

上传模型到ai platform上面

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
MODEL_NAME = 'xiaoguo_demo_model_3'
VERSION_NAME = 'v0'


!gcloud ai-platform models create {MODEL_NAME} --project {PROJECT}
!gcloud ai-platform versions create {VERSION_NAME} \
  --project {PROJECT} \
  --model {MODEL_NAME} \
  --origin {EEIFIED_DIR} \
  --framework "TENSORFLOW" \
  --runtime-version=2.1 \
  --python-version=3.7

02

利用GEE调用我们训练好的模型

我们模型已经训练好并且上传到Ai platform上面,接下来我们就可以通过GEE使用我们自定义的模型了。

直接上代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var table = ee.FeatureCollection("users/boyxiaozheng/feature/beijing");
var a=ee.Geometry.Point(-75.6,40.02);
var BANDS = ['B2', 'B3', 'B4', 'B5', 'B6', 'B7'];

var maks_cloud=function(image){
  var cloudShadowBitMask = (1 << 3);
  var cloudsBitMask = (1 << 5);
  var qa = image.select('pixel_qa');
  var mask = qa.bitwiseAnd(cloudShadowBitMask).eq(0)
                          .and(qa.bitwiseAnd(cloudsBitMask).eq(0));
  var img=image.updateMask(mask).select(BANDS).divide(10000);
  return img;
}

var image = ee.ImageCollection("LANDSAT/LC08/C01/T1_SR")
                        .filterDate('2018-06-01', '2018-10-31')
                        .filterBounds(table)
                        .map(maks_cloud).median().float();
//加载我们刚才训练好的模型
var model = ee.Model.fromAiPlatformPredictor({
    projectName:'boyguo',
    modelName:'xiaoguo_demo_model_3',
    version:'v0',
    // 可以为任意的大小
    inputTileSize:[8, 8],
    proj:ee.Projection('EPSG:4326').atScale(30),
    fixInputProj:true,
    // Note the names here need to match what you specified in the
    // output dictionary you passed to the EEifier.
    outputBands:{'output': {
        'type': ee.PixelType.float(),
        'dimensions': 1
      }
    }
    });
//对图像进行预测
var predictions = model.predictImage(image.toArray());
//输出的数组每个元素含有三种地物的概率,把这个转为一个三维数组
var probabilities = predictions.arrayFlatten([['bare', 'veg', 'water']]);
//把每个像元概率最高的地物输出并转为band
var label = predictions.arrayArgmax().arrayGet([0]).rename('label');

var label_vis = {
    'palette': ['red', 'green', 'blue'],
    'min': 0, 'max': 2

}
//这里使用我们自己的模型,显示应该比较慢,耐心等待即可
Map.centerObject(table,12);
Map.addLayer(label, label_vis);

结果:

本期我们的代码用到了好多Tensorflow的知识,小编也没有解释很清楚,毕竟一篇内容去介绍Tensorflow的语法实在是有些困难。大家可以结合网上一些Tensorflow的教程去看。

还有就是谷歌云平台也需要大家自己去申请。

大家还有什么想实现的功能,可以随时留言!

文中的python代码要分块运行,以免出错。ipynb文件分享给大家,链接如下

https://pan.bnu.edu.cn/l/I5106D

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2020-06-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 GIS与遥感开发平台 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Linux使用Docker部署类微信朋友圈项目Moments详细流程
今天分享一款极简朋友圈的开源项目——Moments,它省去了微信朋友圈里的烦人广告,省去了还需要选择屏蔽好友列表的麻烦,完全可以把这个极简朋友圈当作自己心情发泄的一个树洞。也可以发一些自己的日常生活,音乐分享等。
FGGIT
2024/10/15
1790
Linux使用Docker部署类微信朋友圈项目Moments详细流程
Python爬虫学习 爬取微信朋友圈
如果直接用 Charles 或 mitmproxy 来监听微信朋友圈的接口数据,这是无法实现爬取的,因为数据都是被加密的。而 Appium 不同,Appium 作为一个自动化测试工具可以直接模拟 App 的操作并可以获取当前所见的内容。所以只要 App 显示了内容,我们就可以用 Appium 抓取下来。
python学习教程
2020/07/02
2K0
Python爬虫学习之爬取微信朋友圈
如果直接用 Charles 或 mitmproxy 来监听微信朋友圈的接口数据,这是无法实现爬取的,因为数据都是被加密的。而 Appium 不同,Appium 作为一个自动化测试工具可以直接模拟 App 的操作并可以获取当前所见的内容。所以只要 App 显示了内容,我们就可以用 Appium 抓取下来。
Python研究者
2020/09/28
1.2K0
Python爬虫学习之爬取微信朋友圈
Python 爬取朋友圈最新方法!!
在几年前,互联网上曾经出现过一款生成朋友圈相册的产品。但是它的流程说起来很不互联网:
Python编程与实战
2021/08/25
4K0
Python 爬取朋友圈最新方法!!
Python 爬取朋友圈最新方法!!
在几年前,互联网上曾经出现过一款生成朋友圈相册的产品。但是它的流程说起来很不互联网:
yz_weixiao
2021/12/18
1.1K0
微信朋友圈如何自动点赞
我一直都不太喜欢给别人点赞,某一年(貌似是17年)微信出了一次朋友圈年报,那一整年我就点出去了几个赞,要知道当时我微信好友应该有300+。我觉得这是我不喜欢参与社交活动在网络世界的一种体现吧。不给别人点赞也没啥坏处,但你不评不赞,难免会让你和好友之间有些疏远,给别人点赞吧我又嫌麻烦,于是一直想着做个自动点赞的东西,今天基本实现了,虽然诸多不完整和诸多限制,但还是决定分享出来,主要是我觉得还挺好玩的。
全栈程序员站长
2022/08/19
6.4K0
微信朋友圈如何自动点赞
如何利用Python网络爬虫抓取微信朋友圈的动态(上)
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门。不过不要慌,小编在网上找到了第三方工具,它可以将朋友圈进行导出,之后便可以像我们正常爬虫网页一样进行抓取信息了。
Python进阶者
2018/08/03
1.8K0
如何利用Python网络爬虫抓取微信朋友圈的动态(上)
如何利用Python网络爬虫抓取微信朋友圈的动态
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门。不过不要慌,小编在网上找到了第三方工具,它可以将朋友圈进行导出,之后便可以像我们正常爬虫网页一样进行抓取信息了。
小小科
2018/07/31
2.2K0
如何利用Python网络爬虫抓取微信朋友圈的动态
微信朋友圈千亿访问量背后的技术挑战和实践总结
微信朋友圈包括图片和视频两套业务架构组成,朋友圈图片的特点是请求量大、消耗计算资源较多,视频则主要消耗带宽。
JackJiang
2018/08/29
1.9K1
如何利用Python网络爬虫抓取微信朋友圈的动态
今天小编给大家分享一下如何利用Python网络爬虫抓取微信朋友圈的动态信息,实际上如果单独的去爬取朋友圈的话,难度会非常大,因为微信没有提供向网易云音乐这样的API接口,所以很容易找不到门。不过不要慌,小编在网上找到了第三方工具,它可以将朋友圈进行导出,之后便可以像我们正常爬虫网页一样进行抓取信息了。
小小科
2018/08/17
1.4K0
如何利用Python网络爬虫抓取微信朋友圈的动态
Typecho主题推荐:重塑微信朋友圈风格主题
今天,给大家推荐一个重塑微信朋友圈风格主题,Icefox是一款精心设计的Typecho主题,灵感源自广受欢迎的微信朋友圈,给用户打造一个既熟悉又充满新鲜感的生活分享空间。
幻影龙王
2024/04/30
1K0
Typecho主题推荐:重塑微信朋友圈风格主题
独家揭秘微信朋友圈广告背后的技术
陈功
2017/07/27
4.2K2
独家揭秘微信朋友圈广告背后的技术
微信朋友圈又出新功能!网友:又要失去“朋友”了
4月8日晚间,微信官方宣布,即日起,朋友圈广告@好友评论互动能力全量开放,所有用户均可使用。记者了解到,广告主无须操作,所有朋友圈广告默认具备@好友评论互动的能力。用户收到朋友圈广告后,可以跟点赞、评论一样,在广告的评论区@好友与其进行互动。
半夜喝可乐
2019/04/25
6800
微信朋友圈又出新功能!网友:又要失去“朋友”了
微信朋友圈广告官网上线:我们一起,做些改变。
2015 年 1 月 21 日,微信朋友圈第一个广告上线,以崭新的角度开启广告主与用户接触及互动的新方式。 在两百多天的时间里,我们不断打破常规、推陈出新,致力于打磨每一个“更懂你”的广告,以更开放的心态拥抱变化和创新。回顾已经发布的广告,每一次推送都让受众眼前一亮。至今,我们已经累计服务来自 20 个不同行业的过百位广告主。 广告如何成为生活的一部分?这是我们始终在探索的课题。让用户喜欢广告,通过展现广告魅力,彰显品牌诉求及价值,这一点是微信朋友圈广告一直追求和坚持的立场。 2015 年 8
腾讯大讲堂
2018/02/12
1.1K0
微信朋友圈广告官网上线:我们一起,做些改变。
网络安全宣传周 - 利用钓鱼 WiFi 窃取微信朋友圈私人信息
随着智能手机的普及和社交媒体的广泛应用,人们在享受便捷的网络服务时,个人隐私信息也面临着越来越多的威胁。黑客利用钓鱼 WiFi 窃取用户微信朋友圈等私人信息的行为,给用户带来了极大的安全隐患。
Khan安全团队
2024/08/18
3330
微信朋友圈限时推广微视,腾讯对短视频志在必得?
近日,很多用户发布微信朋友圈时,都看到“用微视拍摄(推广)”的新菜单。在拍摄功能里,除了可以正常的拍照外,还能选择跳转到腾讯旗下的微视进行拍摄。如果用户没有下载微视,点击这个选项就会跳转到应用下载页面。
罗超频道
2019/07/17
9730
微信朋友圈限时推广微视,腾讯对短视频志在必得?
微信朋友圈分享接口使用总结
微信朋友圈分享接口是非常细节的,而且不好调试,所以在此总结一下,以帮助大家 首先应该遵循微信开发者文档介绍,用接口调试工具将你需要的接口的权限确定一下(这里得去申请接口权限)?然后将这个网址用手机端微信打开测试一下接口是否可用?http://203.195.235.76/jssdk/
全栈程序员站长
2022/09/02
2.9K0
微信朋友圈第 2 条广告开放,小程序朋友圈广告全量上线
作者:郑智文 & 尹非凡 知晓程序获行业人士爆料,微信很快将发布两个重磅新能力: 朋友圈广告第 2 条全量开放。 小程序朋友圈广告全量上线。 如果说小程序朋友圈广告更多的是商家的狂欢,是 58 万个小程序的大礼包;那么朋友圈第 2 条广告则非常直接地影响到了 10 亿微信用户的使用体验。 从 2015 年 1 月 21 日,朋友圈广告初次上线,3 年时间,微信终于在广告营收压力和商家需求的呼声中再退一步,加大开放朋友圈的广告权限。 朋友圈广告第 2 条开放,也就意味着用户从以前每天仅能接收到 1 条广告变
知晓君
2018/07/04
7770
原 微信授权和朋友圈分享
作者:汪娇娇 日期:2016.9.25 现在想想,微信这东西真是让人又爱又恨,刚接触的时候,简直毫无头绪,不过在后台的配合下,现在终于能八九不离十的将微信获取用户信息和分享朋友圈这两块弄得比较透彻,得
jojo
2018/05/03
3.9K0
原                                                                                微信授权和朋友圈分享
微信朋友圈:应对春节千亿访问量背后的故事
腾讯技术工程官方号
2017/11/30
2.6K0
微信朋友圈:应对春节千亿访问量背后的故事
推荐阅读
相关推荐
Linux使用Docker部署类微信朋友圈项目Moments详细流程
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验