本人的研究方向是基于深度学习方法的作物遥感识别。经查阅目前的相关教程资料后,发现深度学习的GEE教程几乎没有,所以开始动笔写下此片文章,给后面研究这个方向的人提供一点帮助吧。
为什么要写这份教程?
一、深度学习越来越重要了
二、Google Earth Engine(GEE)是重要的遥感信息处理工具
传统的遥感影像处理工具,如ENVI、Erdas Imagine、ArcGIS等,在传统遥感数据处理领域得到广泛应用。Google Earth Engine是由Google开发的,于2010年发布。)其是一个强大的云计算平台,旨在支持大规模地理空间数据的存储、处理、分析和可视化。它提供了丰富的遥感数据集和分析工具,使用户能够在云端高效地进行地理信息处理。
Google Earth Engine (GEE) 相较于传统工具有以下几个优势:
总之,GEE是一个功能强大、易于使用的地理信息处理平台,为我们提供了丰富的数据集、分析工具和社区支持,帮助我们高效地进行地理信息处理和分析。
三、Google Earth Engine(GEE)的深度学习教程很少
GEE的官方教程中多是机器学习的教程和案例代码,有关深度学习的教程和代码较少,只有如下几个:
但其仅有的教程在有些细节上解释的不够清楚,给初学者带来很多麻烦。
中文互联网上教程也不多,寥寥几篇,内容也不够丰富和全面。目前检索到的教程如下:
使用GEE平台做深度学习,首先我们要明白一个基础问题,GEE云平台本身不支持深度学习模型的训练,它仅支持经典机器学习算法和提供tensorflow深度模型预测的接口,我们应该将其视为一个数据预处理工具。
GEE使用深度学习方法做研究的基础流程是:
在线模型训练
本地模型训练
本教程是使用本地GPU进行模型训练,推理也是在本地进行的。GEE支持JS和python 2种客户端,本教程是使用的JS客户端。预计分为以下几个章节来撰写:
前置条件:GEE账号、GPU、本地python开发IDE、conda虚拟环境
所需条件:
Google Cloud Storage(GCS)是谷歌云平台(GCP)一部分, 这是一个云存储平台,旨在存储大型非结构化数据集。
我们需要在云存储创建储存桶,将GEE处理好的数据导出其中暂存。使用Python程序下载储存桶中的文件,保存本地。
1、购买付费的云存储服务
首先需要有一个谷歌账号,登录云平台,开始使用,每个新用户都免费获得 $300 赠金,在未来 90 天内试用 Google Cloud。但是账号认证需要付款信息验证,即绑定一张国外银行卡(不能使用中国银行卡、支付宝和微信付费)。
解决方案有两种:
必须搞定这个账号,不然数据是无法导出保存的。
2、创建存储桶
账号注册完成之后,应该需要创建一个项目,GCP中的一切都围绕着项目展开。 每个项目可以有多个存储桶,围绕它们构建Google Cloud Storage的架构。 每个存储桶可以包含任意数量的对象,可以是文件夹和/或文件。 创建存储桶时,会为其分配存储类别和地理位置。 这些设置可以在创建存储桶时指定,但以后不能更改。
存储桶具有特定的命名约定 ,必须严格遵守这些约定 ,否则GCP将不允许您创建存储桶。 存储桶名称在全球范围内是唯一的,因此需要以防止冲突的方式进行选择。 但是,删除的存储桶使用的名称可以重复使用。此外,将名称分配给存储桶后就无法更改。 如果要更改它,唯一的解决方案是使用所需名称创建一个新存储桶,将内容从前一个存储桶移动到新存储桶,然后删除前一个存储桶。
3、 Python GCS库安装
官方教程:Python client library | Google Cloud
为了方便下载云存储的文件,我们需要安装python对应的库
pip install google-cloud-storage
使用python程序访问储存桶文件需要对python客户端进行验证(即用户登录)
Google 的身份验证方法官方教程中提供了多种方法,我采用的方案是服务账号密钥,
如需创建服务账号密钥并将其提供给 ADC,请执行以下操作:
按照创建服务账号密钥中的说明,创建一个具有您的应用所需的角色的服务账号,并为该服务账号创建密钥。
或者教程可参考【GoogleDriveApi】创建Google凭据(OAuth2和Service Account)_获其中的Service Account凭据创建,导出得到json格式的凭据。
将环境变量 GOOGLE_APPLICATION_CREDENTIALS
设置为包含凭据的 JSON 文件的路径。例如下图:
4、 Python GCS库测试
from google.cloud import storage
import os
# 实例化 Storage 客户端
client = storage.Client()
# 指定存储桶名称
bucket_name = 'yqs'
# 指定文件夹名称
folder_name = 'predict'
# 得到指定存储桶的引用
bucket = client.get_bucket(bucket_name)
# 列出存储桶中的所有对象
for blob in bucket.list_blobs(prefix=folder_name):
print(blob.name)
如果可以正常打印的话代表你把这部分搞定了。
下面附上GCS的下载代码:
from google.cloud import storage
import os
def download_blob(bucket_name, source_blob_name, destination_file_name):
"""
下载 GCS 存储桶中指定的文件。
"""
# 初始化 GCS 客户端
storage_client = storage.Client()
# 获取指定的存储桶和文件
bucket = storage_client.bucket(bucket_name)
blob = bucket.blob(source_blob_name)
# 下载文件
blob.download_to_filename(destination_file_name)
print(f"File {source_blob_name} has been downloaded to {destination_file_name}.")
def download_folder(bucket_name, folder_name, destination_folder):
"""
下载 GCS 存储桶中指定文件夹下的所有文件。
"""
storage_client = storage.Client()
bucket = storage_client.bucket(bucket_name)
# 列出指定路径下的所有文件
blobs = bucket.list_blobs(prefix=folder_name)
for blob in blobs:
# 获取文件名
file_name = blob.name.split("/")[-1]
# 设置过滤规则,例如非gz格式的不下载
if file_name[-2:] != 'gz':
continue
# 检查目标文件夹中是否已经存在同名的文件,如果存在,则不再下载
if os.path.isfile(f"{destination_folder}/{file_name}"):
print(f"File {blob.name} already exists in {destination_folder}.")
else:
print(f"File {blob.name} is downloading to {destination_folder}/{file_name}.")
blob.download_to_filename(f"{destination_folder}/{file_name}")
print(f"File {blob.name} has been downloaded to {destination_folder}/{file_name}.")
# # 下载指定路径下的文件夹到本地文件夹
download_folder("yqs", "yangfangVal", "data/yangfang")
# 下载指定路径下的文件到本地
#download_blob("yqs", "yangfangVal/eval_patches_g0.tfrecord.gz", "data/yangfang/eval_patches_g0.tfrecord.gz")
通过这段代码可以批量下载存储桶中的文件,而不需要手动在浏览器一个一个下载。
首先罗列出所需下载的东西(window环境下):
提供作者的一个硬件配置及软件版本参考:
项目 | 内容 |
---|---|
中央处理器 | Intel? Xeon? Gold 6248R CPU @ 3.00GHz |
内存 | 192GB |
显卡 | NVIDIA Quadro P4000 |
操作系统 | Windows 10 |
CUDA | Cuda10.4 |
IDE | Jupyter Lab 3.6 |
软件平台及框架 | Python3.9、Tensorflow2.10、Keras2.10 |
至于这些环境的安装教程,网络上已经有太多了,本文不赘述:
提供参考: