AI 前线导读:
人工智能技术最近炒得很火,一旦将其大规模用于军事领域,那将是改变规则的技术。美国已经开始利用人工智能技术在海量卫星照片中捕猎中国导弹阵地了。据美国《大众机械》网站报道,密苏里大学团队训练了一个深度学习算法,可在 TB 级数字图像中检测、识别中国的地对空导弹阵地。据称,人工智能程序不仅能够像人一样准确地找到这些阵地,而且远比人类更快。人工智能将被用来补充人类情报专家,帮助他们从数千平方英里的卫星图像中像大海捞针一样找到所需的目标。
那么我们又如何师夷长技以制夷呢?本文就介绍了如何利用 Github 的 Label Maker 项目为机器学习生成卫星地图和街景图的数据集。
更多干货内容请关注微信公众号“AI 前线”,(ID:ai-front)
OpenStreetMap(开放街道地图,OSM)是由英国人 Steve Coast 创立的一个开源地图服务项目,其运营模式类似与维基百科,由志愿者们免费提供地图信息。个人、网站以及公司都可以使用它的地图信息。目前,该地图服务由英国非营利组织 OpenStreetMap 基金会负责。
OSM 已有超过两百万名注册用户。一如维基百科等网站,OSM 网站地图页有“编辑”按钮,亦有记录修订历史。经注册的用户可上传 GPS 路径,及可编辑地图的向量数据,包括使用 OSM 网站的编辑器或其他自由地理信息系统软件,如 JOSM。
OSM 的地图由用户根据手持 GPS 设备、航空摄影照片、卫星视频、其他自由内容以至单靠用户由于对有关区域的熟悉而具有的本地知识绘制。地图的向量数据以开放数据库授权方式授权。
而我们也同样也可以用人工智能来将卫星图片和街景图片生成机器学习数据集,这个工具就是 Github 上的 Label Maker 项目 [1],该项目利用了 OpenStreetMap 的 QA Tile 进行数据集的生成。OpenStreetMap QA Tile 包含用于分析 OpenStreetMap(QSM)的数据,将它们与 Tile Reduce 一起使用,将 OpenStreetMap 与其他数据集合在一起,可检测连接问题等错误,或者监视破坏行为,可以对 OpenStreetMap 数据执行任何基于分片的分析。
Label Maker 项目的工具下载 OpenStreetMap QA Tile 信息和卫星图像分片,并将其保存为.npz[2] 文件,以用于机器学习培训。
需要注意的是,运行这个库需要 tippecanoe 作为“同版本依赖(peer-dependency)”,且在运行该命令之前,应该可从你的命令行获得。
在运行任何命令之前,需创建一个 config.json 文件,指定数据准备过程的输入:
-
country: OSM QA Tile[3] 提取下载。该值应该是一个与 label_maker/countries.txt 中找到的值匹配的字符串。
-
bounding_box: 从中创建图像的边界框。这应该以下面的表格给出:[xmin, ymin, xmax, ymax] 分别为 [-180,180] 和 [-90,90] 之间的经度和纬度值。值应使用 WGS84 基准,使用十进制的经度和纬度。
-
zoom: 用于创建图像的缩放级别 [4]。这功能是解决问题的一种简单形式。值应该为整数。
-
classes: 一系列机器学习训练课程。每个类都被定义为具有两个必需属性的对象:name: 类名filter: Mapbox GL 过滤器 [5] 可定义与此类匹配的任何向量要素。过滤器应用于 Mapbox GL JS 的独立 featureFilter[6]。
-
imagery: 使用 tiled 图像服务的模板字符串。注意,您通常需要一个 API 密钥来获取图像,并可能有相关的成本。上面示例需要一个 Mapbox 访问令牌 [7]。
-
background_ratio: 对于单类分类问题,我们需要下载没有匹配类的图像。我们将下载 background_ratio 乘以匹配一个类的图像数量。
-
ml_type: "classification"、"object-detection"或"segmentation"。对于最终的标签 numpy 数组(y_train 和 y_test),我们将根据类型生成不同的标签。"classification": 与 classes 相同长度的数组。每个数组的值可以是 1 或 0,这取决于它是否与同一索引中的类相匹配。"object-detection": 一组表单为 [xmin,ymin,width,height,class_index] 的边界框。在这种情况下,这些值不是经度和纬度值,而是从左上角测量的像素值。每个特性都针对每个类进行测试,因此如果一个特性匹配两个或更多类,则会创建相应数量的边界框。"segmentation": 一个表单(256,256)的数组,其值与该位置处的 class_index 标签相匹配。这些类按照 config.json 的顺序依次被应用,因此,后面的类将被写在早期的类标签上。
label-maker is most easily used as a command line tool. There are five commands documented below. All commands accept two flags:
label-maker 是最容易使用的命令行工具。下面有五个命令,所有的命令都接受两个标志:
示例:
$ label-maker download --dest flood-monitoring-project --config flood.json
下载并解压 OSM QA tile:
$ label-maker download
Saving QA tiles to data/ghana.mbtiles
100% 18.6 MiB 1.8 MiB/s 0:00:00 ETA
将 OSM 数据恢复到所需的缩放级别,创建标签数据 (labels.npz),计算类别统计信息,创建可视标签文件,(根据 ml_type,可以使用 GeoJSON 或 PNG 文件)。需要上一步中的 OSM QA tile。
$ label-maker labels
Determining labels for each tile
---
Residential: 638 tiles
Total tiles: 1189
Write out labels to data/labels.npz
Downloads example satellite images for each class. Requires the labels.npz file from the previous step. Accepts an additional flag:
下载每个类的卫星图像的例子。需要上一步的 labels.npz 文件。接受一个额外的标志:
-n or --number: 为每类创建的实例图像的 interger 个数。(缺省:5)
$ label-maker preview -n 10
Writing example images to data/examples
Downloading 10 tiles for class Residential
下载训练所需的所有图像分片,需要 labels 步骤中的 labels.npz 文件。
$ label-maker images
Downloading 1189 tiles to data/tiles
捆绑卫星图像和标签以创建最终的 data.npz 文件。需要 labels 步骤中的 labels.npz 文件和 images 步骤中下载的图像分片。
$ label-maker package
Saving packaged file to data/data.npz
一旦你有一个封包的 data.npz 文件,你可以使用 numpy.load[8] 来加载它。作为一个示例,下面是如何将创建的数据提供给 Keras[9] 模型:
数据,在训练和测试集之间进行调整和分割
npz = np.load('data.npz')
x_train = npz['x_train']
y_train = npz['y_train']
x_test = npz['x_test']
y_test = npz['y_test']
此处定义你的模型,Keras 的示范用例:
model = Sequential()
# ...
model.compile(...)
# train
model.fit(x_train, y_train, batch_size=16, epochs=50)
model.evaluate(x_test, y_test, batch_size=16)
要获得更为详细的演练,请查看这个示例页面:Label Maker Examples[10]。
这个库建立在 skynet-data[11] 的理念之上。如果没有来自 OpenStreetMap 和 Mapbox 的出色数据,将无法获得以下许可证:
参考资料:
[1] Label Maker
https://github.com/developmentseed/label-maker
[2] numpy.savez
https://docs.scipy.org/doc/numpy/reference/generated/numpy.savez.html
[3] Download Planet
https://osmlab.github.io/osm-qa-tiles/
[4] Zoom levels
https://wiki.openstreetmap.org/wiki/Zoom_levels
[5] Mapbox GL Filter
https://www.mapbox.com/mapbox-gl-js/style-spec/#other-filter
[6] mapbox/mapbox-gl-js
https://github.com/mapbox/mapbox-gl-js/tree/master/src/style-spec/feature_filter
[7] Access tokens
https://www.mapbox.com/help/how-access-tokens-work/
[8] numpy.load
https://docs.scipy.org/doc/numpy/reference/generated/numpy.load.html
[9] Keras: The Python Deep Learning library
https://keras.io/
[10] Label Maker Examples
https://github.com/developmentseed/label-maker/tree/master/examples
[11] Data pipeline for machine learning with OpenStreetMap
https://github.com/developmentseed/skynet-data
[12] OpenStreetMap Copyright and License
https://www.openstreetmap.org/copyright
[13] Open Data Commons Open Database License (ODbL)
https://opendatacommons.org/licenses/odbl/
[14] Mapbox Terms of service
https://www.mapbox.com/tos/#%5BYmtMIywt%5D