利用Python創(chuàng)建位置生成器的示例詳解
介紹
在這篇文章中,我們將探索如何在美國(guó)各地城市的地圖數(shù)據(jù)和公共電動(dòng)自行車(chē)訂閱源上訓(xùn)練一個(gè)快速生成的對(duì)抗網(wǎng)絡(luò)(GAN)模型。
然后,我們可以通過(guò)為包括東京在內(nèi)的世界各地城市創(chuàng)建合成數(shù)據(jù)集來(lái)測(cè)試該模型的學(xué)習(xí)和概括能力。
git clone https://github.com/gretelai/GAN-location-generator.git
在之前的一篇博客中,我們根據(jù)電子自行車(chē)訂閱源中的精確位置數(shù)據(jù)訓(xùn)練了一個(gè)基于LSTM的語(yǔ)言模型,并使用該模型為相同地區(qū)(如加利福尼亞州圣莫尼卡)生成合成和隱私增強(qiáng)數(shù)據(jù)集。
通過(guò)以不同的方式構(gòu)建問(wèn)題,并結(jié)合地圖數(shù)據(jù)作為背景,我們可以創(chuàng)建一個(gè)模型,生成人類(lèi)可能訪問(wèn)世界各地的精確位置。
開(kāi)始
我們可以通過(guò)將電動(dòng)自行車(chē)位置數(shù)據(jù)編碼為像素到圖像中,然后訓(xùn)練類(lèi)似于CycleGAN、Pix2pix和StyleGAN的圖像翻譯任務(wù)來(lái)對(duì)此進(jìn)行建模。
在這篇文章中,我們將使用由pix2pix和CycleGAN的作者創(chuàng)建的FastCUT模型,因?yàn)樗膬?nèi)存效率高,訓(xùn)練速度快(適用于更高分辨率的位置)。
使用GitHub上完整的端到端示例,為自己的城市創(chuàng)建合成位置數(shù)據(jù)https://github.com/gretelai/GAN-location-generator.git
步驟
模擬訓(xùn)練步驟
- 從地圖上精確的電動(dòng)自行車(chē)位置創(chuàng)建DomainA
- 從相同的地圖創(chuàng)建DomainB,但不包含位置
- 訓(xùn)練FastCUT 翻譯DomainB->DomainA
合成數(shù)據(jù)生成步驟
- 對(duì)于目標(biāo)地理位置,請(qǐng)下載新地圖(DomainC)
- 在FastCUT模型上進(jìn)行推理,以預(yù)測(cè)車(chē)的位置(DomainC->DomainA)
- 使用CV處理圖像以查找指示器位置并轉(zhuǎn)換為經(jīng)緯度
創(chuàng)建訓(xùn)練數(shù)據(jù)集
安裝依賴項(xiàng)后,運(yùn)行python -m locations.create_training_data,創(chuàng)建一對(duì)512x512px地圖圖像,分別添加和不添加位置數(shù)據(jù)。
接下來(lái),在數(shù)據(jù)集上訓(xùn)練我們的模型——本質(zhì)上是訓(xùn)練FastCUT模型,以預(yù)測(cè)電動(dòng)自行車(chē)位置將在哪里。
CUDA_VISIBLE_DEVICES=0 python train.py --gpu_ids 0 --dataroot ./datasets/ebike_data --name locations_FastCUT --CUT_mode FastCUT --n_epochs 30
FastCUT模型將數(shù)據(jù)記錄到Visdom,讓我們可以監(jiān)控模型訓(xùn)練。
在下面的圖中,我們可以看到模型損失在訓(xùn)練期間減少,還可以看到圖像翻譯任務(wù)的預(yù)覽。
第一個(gè)圖像是真實(shí)的DomainA地圖數(shù)據(jù),第二個(gè)是帶有預(yù)測(cè)的自行車(chē)位置(假的)的DomainA圖像的翻譯版本,第三個(gè)是真實(shí)的DomainB位置。我們可以看到,即使經(jīng)歷了25個(gè)epoch,該模型仍在學(xué)習(xí)預(yù)測(cè)合理的滑板車(chē)位置,例如街角和道路沿線。
當(dāng)運(yùn)行推薦的200個(gè)epoch時(shí),該模型似乎過(guò)擬合,預(yù)測(cè)的滑板車(chē)位置從圖像中消失。在這個(gè)例子中,我看到了30個(gè)epoch有最好的表現(xiàn)。
創(chuàng)建測(cè)試數(shù)據(jù)集
運(yùn)行下面的命令,創(chuàng)建東京市中心的訓(xùn)練數(shù)據(jù)集,或修改緯度和經(jīng)度參數(shù),為任何地理區(qū)域創(chuàng)建合成位置。
請(qǐng)注意,對(duì)于FastCUT python代碼的工作方式,我們需要將地圖網(wǎng)格圖像復(fù)制到testA和testB目錄中。
python -m location_utils.create_test_dataset --lat 35.652832 --lon 139.839478 --name Tokyo
現(xiàn)在,我們可以使用我們的模型來(lái)處理上面為網(wǎng)格創(chuàng)建的每個(gè)圖像,以預(yù)測(cè)東京各地的電動(dòng)自行車(chē)位置。
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
查看單個(gè)圖像的結(jié)果:
將合成圖像轉(zhuǎn)換回坐標(biāo)
現(xiàn)在我們的任務(wù)是把合成電動(dòng)自行車(chē)從東京拍攝到的圖像轉(zhuǎn)換成真實(shí)世界的坐標(biāo),以建立我們的合成位置數(shù)據(jù)集。
為了提取電動(dòng)自行車(chē)的位置,我們使用OpenCV應(yīng)用了一個(gè)圖像遮罩,該遮罩可以搜索圖像中的任何一組洋紅色像素。
創(chuàng)建遮罩后,我們可以計(jì)算遮罩中任何像素與圖像文件名中編碼的中心點(diǎn)緯度和經(jīng)度之間的距離。
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
請(qǐng)注意,根據(jù)城市在世界上的位置,每個(gè)緯度或經(jīng)度之間的物理距離可能會(huì)發(fā)生顯著變化,在將像素映射到位置時(shí),我們需要使用基于橢球體的模型來(lái)計(jì)算精確的偏移量。
幸運(yùn)的是,geopy Python庫(kù)使這變得很容易。
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函數(shù)預(yù)覽遮罩圖像,然后將其轉(zhuǎn)換回緯度和經(jīng)度坐標(biāo)。
放在一起
我們現(xiàn)在可以處理所有圖像,并將合成的位置縫合到東京所有地方的新數(shù)據(jù)集中。
在東京各地查看數(shù)據(jù)時(shí),存在一些明確的誤報(bào),尤其是在為水道生成位置的情況下。也許需要進(jìn)一步調(diào)整模型,或在訓(xùn)練數(shù)據(jù)(domainA或domainB)中提供更多水道的負(fù)面示例,將減少誤報(bào)。
然而,結(jié)果令人鼓舞(考慮到幾乎沒(méi)有模型或數(shù)據(jù)集調(diào)整),該模型似乎能夠模擬電動(dòng)自行車(chē)數(shù)據(jù)集的分布和位置,該數(shù)據(jù)集是使用來(lái)自世界不同地區(qū)的地圖進(jìn)行訓(xùn)練的。
結(jié)論
在這篇文章中,我們嘗試了將視覺(jué)領(lǐng)域的上下文(例如地圖數(shù)據(jù))與表格數(shù)據(jù)結(jié)合起來(lái),為世界上任何地方創(chuàng)建真實(shí)的位置數(shù)據(jù)。
到此這篇關(guān)于利用Python創(chuàng)建位置生成器的示例詳解的文章就介紹到這了,更多相關(guān)Python位置生成器內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Python語(yǔ)言進(jìn)階知識(shí)點(diǎn)總結(jié)
在本文中我們給學(xué)習(xí)PYTHON的朋友們總結(jié)了關(guān)于進(jìn)階知識(shí)點(diǎn)的全部?jī)?nèi)容,希望我們整理的內(nèi)容能夠幫助到大家。2019-05-05Pandas去除重復(fù)項(xiàng)函數(shù)詳解drop_duplicates()
這篇文章主要介紹了Pandas去除重復(fù)項(xiàng)函數(shù)drop_duplicates(),具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2024-02-02python編程開(kāi)發(fā)之類(lèi)型轉(zhuǎn)換convert實(shí)例分析
這篇文章主要介紹了python編程開(kāi)發(fā)之類(lèi)型轉(zhuǎn)換convert用法,結(jié)合實(shí)例形式分析了Python中常見(jiàn)的數(shù)據(jù)類(lèi)型及類(lèi)型轉(zhuǎn)換convert的具體使用方法,需要的朋友可以參考下2015-11-11使用Django框架中ORM系統(tǒng)實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)增刪改查
這篇文章主要介紹了使用Django的ORM實(shí)現(xiàn)對(duì)數(shù)據(jù)庫(kù)數(shù)據(jù)增刪改查方法,文中附含詳細(xì)示例代碼以及過(guò)程詳解,有需要的朋友可以借鑒參考下2021-09-09python 移動(dòng)圖片到另外一個(gè)文件夾的實(shí)例
今天小編就為大家分享一篇python 移動(dòng)圖片到另外一個(gè)文件夾的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python中字典映射類(lèi)型的學(xué)習(xí)教程
這篇文章主要介紹了Python中字典映射類(lèi)型的學(xué)習(xí)教程,是Python入門(mén)學(xué)習(xí)中的基礎(chǔ)知識(shí),需要的朋友可以參考下2015-08-08Python2和3字符編碼的區(qū)別知識(shí)點(diǎn)整理
在本篇文章中小編給各位分享的是關(guān)于Python2和3字符編碼的區(qū)別知識(shí)點(diǎn),有需要的朋友們可以學(xué)習(xí)下。2019-08-08Python+pandas數(shù)據(jù)分析實(shí)踐總結(jié)
這篇文章主要介紹了Python+pandas數(shù)據(jù)分析實(shí)踐總結(jié)的相關(guān)資料,需要的朋友可以參考下2023-07-07Python實(shí)現(xiàn)多張圖片合成文字的效果
前段時(shí)間看到有人問(wèn)如何使用Python實(shí)現(xiàn)多張圖片組成文字的效果?覺(jué)得還挺有意思,于是嘗試做了一下,剛好趕上端午節(jié),所以打算從網(wǎng)上下載1000張王心凌的照片,組成端午安康的字樣,感興趣的可以了解一下2022-06-06