本文由星球实验室的深度学习工程师/数据科学家Mansi Shah和商务拓展专员Lydia Lihui Zhang共同撰写。本文受到Jennifer Reiber Kyle的原创分析的启发。
结合Amazon SageMaker地理空间能力和星球实验室的卫星数据,可以用于农作物分割,对农业和可持续发展领域具有多种应用和潜在好处。2023年末,星球宣布与亚马逊(AWS)合作,通过Amazon SageMaker提供其地理空间数据。
农作物分割是将卫星图像分割成具有相似农作物特征的像素或分段区域的过程。在本文中,我们说明了如何使用分割机器学习(ML)模型来识别图像中的农作物区域和非农作物区域。
识别农作物区域是获取农业洞察力的核心步骤,丰富的地理空间数据与ML的结合可以带来驱动决策和行动的洞察。例如:
- 基于数据的农业决策 – 通过更好地理解农作物的空间情况,农民和其他农业利益相关者可以在整个季节中优化资源的利用,从水到肥料和其他化学品。这为减少浪费、改善可持续农业实践,并在最小化环境影响的同时提高生产率奠定了基础。
- 识别与气候相关的压力和趋势 – 随着气候变化继续影响全球温度和降雨模式,农作物分割可用于识别易受气候相关压力的地区,以制定气候适应策略。例如,可以使用卫星图像档案跟踪农作物种植区域的变化。这些变化可能是农田的实际大小和分布的变化。还可以根据卫星数据的不同光谱指数导出的土壤湿度、土壤温度和生物量的变化进行更深入的农作物健康分析。
- 评估和减轻损害 – 最后,农作物分割可以用于在自然灾害发生时快速准确地识别受损农作物的区域,从而有助于优先考虑救援工作。例如,洪水过后,可以使用高频卫星图像识别受水淹或被毁的农田区域,从而使救援组织能够更快地帮助受灾农民。
在本分析中,我们使用K最近邻(KNN)模型进行农作物分割,并将这些结果与农业区域的实地真实图像进行比较。我们的结果表明,与2015年的实地真实分类数据相比,KNN模型的分类更准确地代表了2017年农田的状态。这些结果证明了星球高频率地理空间图像的强大能力。农田经常变化,有时一个季节可能发生多次变化,拥有观察和分析该土地的高频率卫星图像可以为我们对农业土地和快速变化环境的理解提供巨大价值。
星球和AWS在地理空间机器学习方面的合作
SageMaker地理空间能力使数据科学家和机器学习工程师能够使用地理空间数据构建、训练和部署模型。SageMaker地理空间能力允许您高效地转换或丰富大规模地理空间数据集,在训练好的ML模型的基础上加速模型构建,并使用3D加速图形和内置可视化工具在交互式地图上探索模型预测和地理空间数据。借助SageMaker地理空间能力,您可以处理大规模卫星图像和其他地理空间数据,为各种应用程序创建准确的ML模型,包括本文中讨论的农作物分割。
星球实验室PBC是一家领先的地球成像公司,利用其庞大的卫星机队每天捕捉地球表面的图像。星球的数据因此成为地理空间ML的有价值资源。其高分辨率的卫星图像可用于识别地球上任何地方的各种农作物特征及其健康状况。
星球和SageMaker之间的合作使客户能够轻松访问和分析星球的高频地球卫星数据,使用亚马逊强大的ML工具。数据科学家可以带入自己的数据,也可以便捷地查找和订阅星球的数据,无需切换环境。
在拥有地理空间图像的Amazon SageMaker Studio笔记本中进行作物分割
在这个示例的地理空间机器学习工作流中,我们将介绍如何将Planet的数据与地面真实数据源一起导入到SageMaker中,并且如何使用KNN分类器训练、推断和部署作物分割模型。最后,我们将评估结果的准确性,并将其与地面真实分类进行比较。
所使用的KNN分类器是在一个具有地理空间的Amazon SageMaker Studio笔记本中训练的,它提供了一个灵活、可扩展的笔记本内核,用于处理地理空间数据。
具有地理空间图像的Amazon SageMaker Studio笔记本预先安装了常用的地理空间库,如GDAL、Fiona、GeoPandas、Shapely和Rasterio,这些库允许在Python笔记本环境中直接进行地理空间数据的可视化和处理。常用的机器学习库,如OpenCV和scikit-learn,也被用于使用KNN分类进行作物分割,并且这些库也安装在地理空间内核中。
数据选择
我们要放大显示的农田位于通常阳光充足的加利福尼亚州萨克拉门托县。
为什么选择萨克拉门托?选择这种类型的问题的区域和时间是主要由地面真实数据的可用性来决定的,而这种类型的数据,如作物类型和边界数据,并不容易获得。2015年萨克拉门托县土地利用中水资源部调查数据集是一个公开可用的数据集,涵盖了当年的萨克拉门托县,并提供了经过手工调整的边界。
我们使用的主要卫星图像是Planet的4波段PSScene产品,该产品包含蓝色、绿色、红色和近红外波段,并经过辐射校正至传感器辐射。校正至传感器反射率的系数在场景元数据中提供,这进一步提高了在不同时间拍摄的图像之间的一致性。
这些图像由Planet的Dove卫星在2017年2月14日发射(新闻稿),因此它们在2015年并未拍摄萨克拉门托县的图像。然而,自发射以来,它们每天都在该地区拍摄图像。在本示例中,我们接受了地面真实数据和卫星图像之间不完美的两年间隔。然而,Landsat 8低分辨率图像可以作为连接2015年和2017年之间的桥梁。
访问Planet数据
为了帮助用户更快地获得准确可操作的数据,Planet还开发了用于Python的Planet软件开发工具包(SDK)。这是一个强大的工具,供想要使用卫星图像和其他地理空间数据的数据科学家和开发人员使用。使用此SDK,您可以搜索和访问Planet庞大的高分辨率卫星图像收藏,以及来自其他来源(如OpenStreetMap)的数据。该SDK提供了与Planet的API的Python客户端,以及一种无代码的命令行接口(CLI)解决方案,使得将卫星图像和地理空间数据融入Python工作流变得容易。本示例使用Python客户端来识别和下载分析所需的图像。
您可以使用一个简单的命令在具有地理空间图像的SageMaker Studio笔记本中安装Planet Python客户端:
%pip install planet
您可以使用该客户端查询相关的卫星图像,并根据感兴趣区域、时间范围和其他搜索条件检索可用结果的列表。在下面的示例中,我们首先询问在萨克拉门托的地面数据所定义的感兴趣区域(AOI)范围内,有多少个PlanetScope场景(Planet的每日图像)满足了我们规定的一定时间范围(2017年6月1日至10月1日)以及最大云覆盖范围10%的条件:
#使用SDK从数据规范中创建一个请求
dataitem_type = ['PSScene']
geom_filter_train = data_filter.geometry_filter(aoi_train)
date_range_filter = data_filter.date_range_filter("acquired", gt=datetime(month=6, day=1, year=2017), lt=datetime(month=10, day=1, year=2017))
cloud_cover_filter = data_filter.range_filter('cloud_cover', lt=0.10)
combined_filter_test = data_filter.and_filter([geom_filter_test, date_range_filter, cloud_cover_filter])
# 运行快速搜索以获得我们的TRAIN数据
async with Session() as sess:
cl = sess.client('data')
results = cl.search(name='temp_search_train',search_filter=combined_filter_train, item_types=item_type)
train_result_list = [i async for i in results]
print("Number of train scene results: ", len(train_result_list))
返回的结果显示与我们感兴趣的区域重叠的匹配场景的数量。它还包含每个场景的元数据、图像ID和预览图像引用。
在选择特定场景后,根据场景ID、物品类型和产品捆绑包(参考文档),您可以使用以下代码下载图像及其元数据:
train_scene_id = '20170601_180425_0f35'item_type = 'PSScene'bundle_type = 'analytic_sr_udm2'# 定义订单请求products = [order_request.product([train_scene_id], bundle_type, item_type)]request = order_request.build_request('train_dataset', products=products)# 下载训练数据async with Session() as sess: cl = sess.client('orders') # 使用 "reporting" 管理订单状态的轮询 with reporting.StateBar(state='creating') as bar: # 使用之前创建的订单请求执行订单 order = await cl.create_order(request) bar.update(state='created', order_id=train_order['id']) # 通过轮询等待订单处理完成 await cl.wait(train_order['id'], callback=bar.update_state) # 下载实际资产 await cl.download_order(order_id=order['id'], directory=download_directory, progress_bar=True, overwrite=True)
该代码将相应的卫星图像下载到SageMaker Studio的亚马逊弹性文件系统(Amazon EFS)卷中。
模型训练
使用Planet Python客户端下载数据后,可以训练分割模型。在这个例子中,使用KNN分类和图像分割技术的组合来识别作物区域并创建地理参考的geojson特征。
使用SageMaker中的内置地理空间库和工具加载和预处理Planet数据,以便为训练KNN分类器做准备。训练的地面实况数据是来自2015年的萨克拉门托郡土地利用DWR调查数据集,而用于测试模型的Planet数据是2017年的数据。
将地面实况特征转换为等高线
为了训练KNN分类器,需要确定每个像素的类别是“作物”还是“非作物”。类别取决于像素是否与地面实况数据中的作物特征相关联。为了确定这一点,首先将地面实况数据转换为OpenCV等高线,然后使用它们将“作物”与“非作物”像素分离。然后,使用像素值及其分类来训练KNN分类器。
将地面实况特征转换为等高线时,首先必须将特征投影到图像的坐标参考系统中。然后,将特征转换为图像空间,并最终转换为等高线。为了确保等高线的准确性,它们在输入图像上进行可视化,如下面的例子所示。
为了训练KNN分类器,使用作物特征等高线作为掩码将作物和非作物像素分离。
KNN分类器的输入由两个数据集组成:X是一个提供要分类特征的二维数组;y是一个提供类别的一维数组(示例)。在这里,从非作物和作物数据集中创建一个单一的分类带,其中带的值表示像素的类别。然后将带和底层图像像素带的值转换为分类器fit函数的X和y输入。
训练分类器对作物和非作物像素进行分类
使用scikit-learn KNeighborsClassifier进行KNN分类。 KNN交叉验证使用交叉验证调整了对估计器性能造成很大影响的邻居数参数。然后使用准备好的数据集和调整后的邻居数参数来训练分类器。请参考以下代码:
def fit_classifier(pl_filename, ground_truth_filename, metadata_filename, n_neighbors): weights = 'uniform' clf = neighbors.KNeighborsClassifier(n_neighbors, weights=weights) train_class_band = create_contour_classified_band(pl_filename, ground_truth_filename) X = to_X(load_refl_bands(pl_filename, metadata_filename)) y = to_y(train_class_band) clf.fit(X, y) return clfclf = fit_classifier(train_scene_filename, train_ground_truth_filename, train_metadata_filename, n_neighbors)
通过像素波段值预测像素类别来评估分类器在其输入数据上的性能。分类器的性能主要基于训练数据的准确性以及基于输入数据(像素波段值)的像素类别的清晰分离。分类器的参数,如邻居数和距离加权函数,可以调整以补偿后者中的任何不准确性。请参考以下代码:
def predict(pl_filename, metadata_filename, clf): bands = load_refl_bands(pl_filename, metadata_filename) X = to_X(bands) y = clf.predict(X) return classified_band_from_y(bands[0].mask, y)train_predicted_class_band = predict(train_scene_filename, train_metadata_filename, clf)
评估模型预测
训练的KNN分类器用于预测测试数据中的作物区域。此测试数据包括在训练期间模型没有接触过的区域。换句话说,模型在分析之前对该区域没有任何了解,因此可以使用此数据客观地评估模型的性能。我们首先通过目视检查几个区域开始,其中一个区域相对比较嘈杂。
目视检查显示预测的类别与实际类别大多一致。有一些偏差区域,我们进一步检查。
进一步调查发现,该区域的一些噪声是由于实际数据中缺少分类图像(右上相对于左上和左下)中存在的细节。一个特别有趣的发现是,分类器将河边的树木识别为“非作物”,而实际数据错误地将其识别为“作物”。这两种分割之间的差异可能是由于树木阻挡了作物区域的阳光。
接下来,我们检查两种方法之间分类不同的另一个区域。这些突出显示的区域在2015年的实际数据中标记为非作物区域(右上),但在2017年通过Planetscope Scenes(左上和左下)清晰地显示为耕地。它们也大多以耕地进行分类(右下)。
同样,可以看到KNN分类器呈现出比实际类别更精细的结果,并成功捕捉到耕地中发生的变化。这个例子还说明了每日刷新的卫星数据的价值,因为世界常常比年度报告变化快得多,而像这样的组合ML方法可以帮助我们及时发现这些变化。能够通过卫星数据监测和发现这种变化,特别是在不断变化的农业领域,为农民优化工作和价值链中的任何农业利益相关者提供了有益的见解,以更好地了解季节。
模型评估
对预测类别的图像与实际类别的视觉比较可能具有主观性,不能为评估分类结果的准确性进行普遍推广。为了获得定量评估,我们使用scikit-learn的classification_report
函数获取分类指标:
# 训练数据集print(classification_report(to_y(create_contour_classified_band(train_scene_filename, train_ground_truth_filename)), to_y(train_predicted_class_band), target_names=['作物', '非作物'])) 精确度 召回率 F1值 支持 作物 0.89 0.86 0.87 2641818 非作物 0.83 0.86 0.84 2093907 准确率 0.86 4735725 宏平均 0.86 0.86 0.86 4735725加权平均 0.86 0.86 0.86 4735725# 测试数据集print(classification_report(to_y(create_contour_classified_band(test_scene_filename, test_ground_truth_filename)), to_y(test_predicted_class_band), target_names=['作物', '非作物'])) 精确度 召回率 F1值 支持 作物 0.94 0.73 0.82 1959630 非作物 0.32 0.74 0.44 330938 准确率 0.73 2290568 宏平均 0.63 0.74 0.63 2290568加权平均 0.85 0.73 0.77 2290568
像素分类用于创建作物区域的分割掩模,因此精确度和召回率都是重要的指标,而F1值是预测准确性的一个很好的综合度量。我们的结果给出了训练数据集和测试数据集中作物和非作物区域的指标。然而,为了保持简单,让我们更详细地看看这些指标在测试数据集中作物区域的情况。
精确度是我们的模型正面预测准确性的度量。在这种情况下,作物区域的0.94的精确度表明我们的模型在正确识别作物区域(实际上的非作物区域被错误地识别为作物区域的假阳性)方面非常成功。召回率则衡量了正面预测的完整性。换句话说,召回率衡量了正确识别的实际正例所占比例。在我们的情况下,作物区域的召回率为0.73,意味着所有真正作物区域像素的73%被正确识别,从而最小化了假阴性的数量。
理想情况下,精确度和召回率的高值都是可取的,尽管这在很大程度上取决于案例研究的应用。例如,如果我们将这些结果应用于农民寻找用于农业的作物区域识别,我们希望更看重召回率而不是精确度,以最小化假阴性的数量(将实际上是作物区域的非作物区域错误地识别为作物区域),以充分利用土地。F1分数是一个综合的准确度度量,结合了精确度和召回率,并衡量了两个指标之间的平衡。较高的F1分数,例如我们作物区域的0.82,表示精确度和召回率之间的良好平衡和较高的整体分类准确性。虽然训练和测试数据集之间的F1分数有所下降,但这是预期的,因为分类器是在训练数据集上训练的。0.77的加权平均F1分数整体上是令人满意的,足够尝试基于分类数据的分割方案。
使用分类器创建分割掩模
使用KNN分类器对测试数据集进行预测,创建分割掩模的过程包括清理预测输出以避免由图像噪声引起的小片段。为了消除斑点噪声,我们使用OpenCV的中值模糊滤波器。这个滤波器比形态开运算更好地保留了作物之间的道路区域。
要对去噪后的输出应用二进制分割,我们首先需要使用OpenCV的findContours函数将分类的栅格数据转换为矢量特征。
最后,可以使用分割裁剪轮廓线计算实际的分割裁剪区域。
KNN分类器产生的分割裁剪区域可以精确识别测试数据集中的作物区域。这些分割区域可以用于各种目的,如田界识别、作物监测、产量估计和资源分配。达到0.77的F1分数是良好的,并为KNN分类器在遥感图像中进行作物分割提供了有效工具。这些结果可以用来进一步改进和优化作物分割技术,可能提高作物分析的准确性和效率。
结论
本文演示了如何结合Planet的高速、高分辨率卫星图像与SageMaker地理空间功能进行作物分割分析,从而获得宝贵的见解,可以提高农业效率、环境可持续性和食品安全性。准确识别作物区域可以进一步分析作物生长和生产力,监测土地利用变化,并检测潜在的食品安全风险。
此外,Planet数据和SageMaker的组合还可以在作物分割之外进行各种用途。这些见解可以为农业管理、资源分配和政策规划提供数据驱动的决策。通过使用不同的数据和机器学习模型,此组合还可以扩展到其他行业和用例,以实现数字化转型、可持续转型和安全性。
要开始使用SageMaker地理空间功能,请参阅开始使用Amazon SageMaker地理空间功能。
要了解更多有关Planet影像规格和开发者参考资料的信息,请访问Planet开发者中心。有关Planet的SDK for Python的文档,请参阅Planet Python SDK。有关Planet的更多信息,包括其现有数据产品和即将推出的产品,请访问https://www.planet.com/。
Planet Labs PBC前瞻性陈述
除了此处包含的历史信息外,此博客文章中设置的内容均为Planet Labs PBC的前瞻性陈述,根据1995年《私人证券诉讼改革法》“安全港”规定,包括但不限于Planet Labs PBC能够抓住市场机遇并实现当前或未来产品改进、新产品或战略合作伙伴关系和客户合作的潜在益处。前瞻性陈述是基于Planet Labs PBC管理层的信念以及他们目前可获得的假设和信息。由于这些陈述是对未来事件和结果的期望,而不是事实陈述,实际结果可能与预期有所不同。导致实际结果与当前预期不符的因素包括但不限于有关Planet Labs PBC及其业务的风险因素和其他披露,这些披露包括不时向证券交易委员会(SEC)在线提供的Planet Labs PBC的定期报告、代理人声明和其他披露材料,网址为www.sec.gov,以及Planet Labs PBC的网站www.planet.com上可获得的资料。所有前瞻性陈述仅反映Planet Labs PBC的信念和假设,仅限于发表这些陈述的日期。Planet Labs PBC无义务更新前瞻性陈述以反映将来事件或情况。