其实ArcGIS API for Python真的很简单,即使你不懂python,看了我这篇文章之后还不会,你就来打我。当然,我是讲武德的。还有那些有需求的还不看这篇文章的,我劝你们耗子尾汁!
可能很多小伙伴都不知道这个是什么,其实直译就可以了:面向python的ArcGIS相关功能接口。在Pro的Python管理器中查看是这样的:
从说明里面能到到,它主要是服务于Online以及Enterprise,其实就是server、portal那一套。空口说无凭证,我们直接从接口文档里面看功能。
上图中跟我们有关的是arcgis.learn(深度学习)模块,其余的部分在本文中不会提到。如果想学习的话,可以参考官网的教程以及示例笔记本(notebook),里面很详细的。
官网地址点击文末蓝色阅读原文即可访问,或者复制下面的链接:
https://developers.arcgis.com/python/
其中最重要的是需要看Sample Notebooks,里面讲的很全很详细(墙裂推荐)。这个部分,可以根据自己需求选择性的去看某一部分。
那咱们主要是深度学习,就看上图中的第三部分就好了(友情提示,第三部分很多示例笔记本)。随便点一个深度学习相关的,比如说之前公众号中写过的《利用深度学习检测路面损坏情况》:
在深度学习工作流中,老三步:样本制作 -> 模型训练 -> 推理。其中使用ArcGIS API for Python的是模型训练环节,其实推理阶段倒不是不能使用API去做,只是你需要一个Image Server,当然如果有多个的话,还是很推荐你使用集群去做推理的。
让我们来看一下arcgis.learn模块的东西:
可能会有人问,样本转换工具是干啥的?如果你之前没有接触过编程,(敲黑板)那得特意留意一下我下面讲的内容:
首先,我们使用ArcGIS Pro导出样本之后,是这个样子的:
然后,这个文件夹里面存储着很多图片,是没办法直接使用的,因为他们是存储在计算机磁盘空间中的。因此,要使用这些图片、标签等等,就需要做转化,将样本文件从磁盘空间中加载到计算机内存中。这个时候就需要用到样本转换工具,在Pro中工具(下图中的训练深度学习模型工具)内部其实也封装了这个过程。
通过使用API会让你看到更多工具内部看不到的过程,可能第一次会有所疑惑,用多了就懂了。
关于模型那块是干嘛的就不用我说啦吧,但是其实你发现,ArcGIS API for Python的模型比ArcGIS Pro中的要多很多。所以强烈推荐你们使用API做训练,因为有更多模型,而且不管是ArcGIS Pro训练深度学习模型工具中有没有的模型,都可以使用Pro去做推理。唯一一个需要注意的是API与Pro的版本对应关系,所以建议你们使用最新版本Pro。
另外,API是完全开源的,有兴趣的话可以去github上查看更多源码。
好了,看完上面之后下面可以愉快的coding了。真的很简单,你们信我。而且简单的同时你可以训练出世界顶级模型(这句话可不是我说的,是fastai作者说的)。因为arcgis.learn模块内部其实封装的是fastai框架,这个框架的作者在kaggle上很出名的,感兴趣的可以查一下。
不说那么多其他的,那就,来吧,展示:
首先打开notebook,没有用过的可以参考我之前的文章:《为什么选择在Jupyter Notebook中编写代码》,然后导包:
from arcgis.learn import prepare_data,UnetClassifier
其中prepare_data是样本转换工具,UnetClassifer是模型,在本场景中使用的是像素分类,小麦提取。你可以按照自己需求去导入模型,代码上差异并不是很大。
另外不同场景的模型在之前的文章中有总结过:《ArcGIS API for Python:深度学习模块概览》,不熟悉的可以点击查看。
然后使用prepare_data
将样本加载到内存中:
# path是样本文件夹路径
path = r'E:\deeplearning\data\dongxiaomai\xiaomai_samplearea_tra30'
data = prepare_data(path,batch_size=16,val_split_pct=0.2)
data
除了一个path是必填的之外,其余的都可以根据实际情况选填。除了上面几个参数之外,接口文档中还有更详细的说明:
一定要学会从接口文档中查看参数信息
在加载完数据值后,还可以查看一下我们的样本数据大概都是啥样的:
data.show_batch()
上图中红色半透明部分是我标注的样本,在data.show_batch方法里,会将样本叠在原始影像上,从而很方便的查看一个batch中的数据是啥样的。你可以多运行几次这行代码看看。
数据加载完成后,便可以实例化我们的模型:
model = UnetClassifier(data)
这一步就很简单了,直接模型括号里面填上上一部中加载的样本对象。然后使用model.lr_find()函数查找学习率:
lr = model.lr_find()
lr
这一步是固定写法,就是查找最合适的学习率。学习率查找完成后,便可以训练模型了:
model.fit(200,lr)
epochs:必填,训练轮数。
lr:必填,学习率。
early_stopping:选填,在模型停止改进时停止训练。
在接口文档中,此部分要找到对应的模型下面,查接口参数:
训练完成之后,可以查看一下损失曲线:
model.plot_losses()
还可以使用model.show_results方法查看当前模型在验证集上的表现情况:
model.show_results()
左边为真实标签,右边为当前模型推理所得。这种方法可以很直观的看到模型的表现如何。另外除了此种方法之外,还有其他精度指标可查看:
model.mIOU()
因为是图像分割,所以比较在意mIOU,其他的模型视情况选择精度指标查看。接口文档中都可以查到,比如说本文中用到的mIOU指标,在接口文档中查看:
如果说,你对模型满意的话,便可以使用model.save方法保存模型了:
model.save(r'E:\deeplearning\model\dongxiaomai\unet_batchsize16_chipsize224_acc86')
固定写法,替换掉文件夹路径即可。到文件夹中查看如下:
然后便可以使用ArcGIS Pro进行推理了。推理阶段在此处就不讲了。
肯定有人看完上面,觉得还不是很清晰,不会咋办。那你来打我,其实改动的地方很少的,我们来看一下去掉每一行运行结果后的完整代码:
其中小部分都是固定写法,大部分都是固定格式,小部分需要根据模型不同更改写法。
这么短几行代码,你去写一个月,还不会,那你来打我。会不会python影响的已经不大了,折腾吧。不得不吹一下,把深度学习封装成如此简洁易用,确实很厉害。
还有之前写过的几篇教程以及大佬写的教程,大家可以拿去练手,基本上都可以获取到数据:
ArcGIS Pro深度学习初体验(下)
超分辨率,来了!!!
利用深度学习检测路面损坏情况
【实操】使用ArcGIS的像素分类模型提取道路