利用Python创建位置生成器的示例详解
目录
- 介绍
- 开始
- 步骤
- 创建训练数据集
- 创建测试数据集
- 将合成图像转换回坐标
- 放在一起
- 结论
介绍
在这篇文章中,我们将探索如何在美国各地城市的地图数据和公共电动自行车订阅源上训练一个快速生成的对抗网络(GAN)模型。
然后,我们可以通过为包括东京在内的世界各地城市创建合成数据集来测试该模型的学习和概括能力。
git clone https://github.com/gretelai/GAN-location-generator.git
在之前的一篇博客中,我们根据电子自行车订阅源中的精确位置数据训练了一个基于LSTM的语言模型,并使用该模型为相同地区(如加利福尼亚州圣莫尼卡)生成合成和隐私增强数据集。
通过以不同的方式构建问题,并结合地图数据作为背景,我们可以创建一个模型,生成人类可能访问世界各地的精确位置。
开始
我们可以通过将电动自行车位置数据编码为像素到图像中,然后训练类似于CycleGAN、Pix2pix和StyleGAN的图像翻译任务来对此进行建模。
在这篇文章中,我们将使用由pix2pix和CycleGAN的作者创建的FastCUT模型,因为它的内存效率高,训练速度快(适用于更高分辨率的位置)。
使用GitHub上完整的端到端示例,为自己的城市创建合成位置数据https://github.com/gretelai/GAN-location-generator.git
步骤
模拟训练步骤
- 从地图上精确的电动自行车位置创建DomainA
- 从相同的地图创建DomainB,但不包含位置
- 训练FastCUT 翻译DomainB->DomainA
合成数据生成步骤
- 对于目标地理位置,请下载新地图(DomainC)
- 在FastCUT模型上进行推理,以预测车的位置(DomainC->DomainA)
- 使用CV处理图像以查找指示器位置并转换为经纬度
创建训练数据集
安装依赖项后,运行python -m locations.create_training_data,创建一对512x512px地图图像,分别添加和不添加位置数据。
接下来,在数据集上训练我们的模型——本质上是训练FastCUT模型,以预测电动自行车位置将在哪里。
CUDA_VISIBLE_DEVICES=0 python train.py --gpu_ids 0 --dataroot ./datasets/ebike_data --name locations_FastCUT --CUT_mode FastCUT --n_epochs 30
FastCUT模型将数据记录到Visdom,让我们可以监控模型训练。
在下面的图中,我们可以看到模型损失在训练期间减少,还可以看到图像翻译任务的预览。
第一个图像是真实的DomainA地图数据,第二个是带有预测的自行车位置(假的)的DomainA图像的翻译版本,第三个是真实的DomainB位置。我们可以看到,即使经历了25个epoch,该模型仍在学习预测合理的滑板车位置,例如街角和道路沿线。
当运行推荐的200个epoch时,该模型似乎过拟合,预测的滑板车位置从图像中消失。在这个例子中,我看到了30个epoch有最好的表现。
创建测试数据集
运行下面的命令,创建东京市中心的训练数据集,或修改纬度和经度参数,为任何地理区域创建合成位置。
请注意,对于FastCUT python代码的工作方式,我们需要将地图网格图像复制到testA和testB目录中。
python -m location_utils.create_test_dataset --lat 35.652832 --lon 139.839478 --name Tokyo
现在,我们可以使用我们的模型来处理上面为网格创建的每个图像,以预测东京各地的电动自行车位置。
CUDA_VISIBLE_DEVICES=0 python test.py --gpu_ids 0 --dataroot ./datasets/ebike_data --name locations_FastCUT --CUT_mode FastCUT --phase train --epoch 30 --num_test 225 --preprocess scale_width --load_size 256
查看单个图像的结果:
将合成图像转换回坐标
现在我们的任务是把合成电动自行车从东京拍摄到的图像转换成真实世界的坐标,以建立我们的合成位置数据集。
为了提取电动自行车的位置,我们使用OpenCV应用了一个图像遮罩,该遮罩可以搜索图像中的任何一组洋红色像素。
创建遮罩后,我们可以计算遮罩中任何像素与图像文件名中编码的中心点纬度和经度之间的距离。
import cv2 as cv import numpy as np def find_points(img_path: str) -> list: """ Return the pixel offsets of magenta-colored pixels in image """ image = cv.imread(img_path) lower = np.array([225, 0, 225]) upper = np.array([255, 5, 255]) shape_mask = cv.inRange(image, lower, upper) pixel_x, pixel_y = np.where(shape_mask > 0) return pixel_x, pixel_y
请注意,根据城市在世界上的位置,每个纬度或经度之间的物理距离可能会发生显著变化,在将像素映射到位置时,我们需要使用基于椭球体的模型来计算精确的偏移量。
幸运的是,geopy Python库使这变得很容易。
import geopy.distance def point_to_geo(center_lat: float, center_lon: float, point_x: float, point_y: float) -> list: """ Convert pixel offset and center points to lat/lon coordinates""" # Center map around current lat / lon points d = geopy.distance.distance(kilometers=np.sqrt(box_side_km ** 2 + box_side_km ** 2)) ne = d.destination(point=geopy.Point(center_lat, center_lon), bearing=315) pixel_to_km = box_side_km * 2 / image_pixels lat_d = geopy.distance.distance(kilometers=pixel_to_km * point_x) lon_d = geopy.distance.distance(kilometers=pixel_to_km * point_y) point_lat = lat_d.destination(point=ne, bearing=180).latitude point_lon = lon_d.destination(point=ne, bearing=90).longitude return [point_lat, point_lon]
下图使用cv2.imshow函数预览遮罩图像,然后将其转换回纬度和经度坐标。
放在一起
我们现在可以处理所有图像,并将合成的位置缝合到东京所有地方的新数据集中。
在东京各地查看数据时,存在一些明确的误报,尤其是在为水道生成位置的情况下。也许需要进一步调整模型,或在训练数据(domainA或domainB)中提供更多水道的负面示例,将减少误报。
然而,结果令人鼓舞(考虑到几乎没有模型或数据集调整),该模型似乎能够模拟电动自行车数据集的分布和位置,该数据集是使用来自世界不同地区的地图进行训练的。
结论
在这篇文章中,我们尝试了将视觉领域的上下文(例如地图数据)与表格数据结合起来,为世界上任何地方创建真实的位置数据。
到此这篇关于利用Python创建位置生成器的示例详解的文章就介绍到这了,更多相关Python位置生成器内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!