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