Во время последнего локдауна в Великобритании мы с женой играли в GeoGuessr. Эта игра более размеренна, чем те, в которые мы обычно играем, но хорошо подходит для нашей семьи с 11-недельным младенцем, который становится активнее с каждым днём.
GeoGuessr — это игра о географических исследованиях. Вас бросают на случайную точку в Google Street View, после чего ваша задача — указать своё местоположение на карте. Можно осматривать окрестности, увеличивать изображение и двигаться по пути автомобиля на местных улицах.
Нас серьёзно заинтересовали ежедневные соревнования (Daily Challenge) на GeoGuessr. Мы начали заходить на сайт каждый день и пытаться поставить новый рекорд. В формате Daily Challenge на каждый раунд выделяется по три минуты, которые мы тратили или на бешеное кликанье по австралийскому бушу (при этом иногда путая его с Южной Африкой), или на обсуждение того, есть ли в шведском языке буква ø
.
Теперь у меня накопился большой объём знаний типа «увижу — узнаю». Я могу опознать Гренландию с первого взгляда. Вернулись мои утерянные знания флагов стран, а также появились новые знания о флагах штатов США, о тех странах, где ездят по левой и правой полосам, где используют километры или мили. Я знаю почти все доменные имена стран (их часто можно встретить на рекламных билбордах вдоль дорог) – мне ещё долго не забыть .yu.
Вы знали, что чёрно-белые дорожные ограждения распространены в России и Украине? Или что можно разобрать синюю полосу EU на автомобильных номерах, несмотря на размытие Google Street View? Подробнее об этом можно прочитать в этом руководстве из 80 тысяч слов – Geoguessr — the Top Tips, Tricks and Techniques.
Указывающая вниз полосатая красно-белая стрелка даёт понять, что вы находитесь в Японии, с большой вероятностью, на острове Хоккайдо или, возможно, на острове Хонсю рядом с горами.
Немного глубокого обучения
Однажды я прочитал, что машинное обучение уже умеет делать всё, что и человек, но меньше чем за одну секунду. Распознать лицо, выбрать текст из изображения, повернуть, чтобы не врезаться в другую машину. Это заставило меня задуматься, а размышления привели к статье под названием Geolocation Estimation of Photos using a Hierarchical Model and Scene Classification, написанной Эриком Мюллером-Будаком, Кадером Пусту-Иреном и Ральфом Эвертом. В этой статье геолокализация рассматривается как «задача классификации, в которой Земля подразделена на географические ячейки».
Она прогнозирует GPS-координаты фотографий.
Даже по фотографиям, которые сделаны в помещении! (Daily Challenge игры GeoGuessr часто засовывает игрока внутрь музеев).
Недавно авторы статьи выпустили реализацию на PyTorch и указали веса для обученной модели base(M, f*)
с внутренней архитектурой ResNet50.
Я предположил, что обученная модель не очень хорошо будет соответствовать тем частям фотосфер, которые я смогу получить от GeoGuessr. В качестве данных обучения авторы использовали «подмножество набора данных из 100 миллионов фотографий Yahoo Flickr Creative Commons (YFCC100M)». В него вошли «примерно пять миллионов изображений Flickr с геометками и неопределённых фотографий, например, снимков внутри помещений, еды и людей, местоположение которых сложно спрогнозировать».
Любопытно было то, что в наборе данных Im2GPS люди определяли местоположение изображения с точностью на уровне страны (в пределах 750 км) в 13,9% случаев, а Individual Scene Networks справлялись с этой задачей в 66,7% случаев!
Итак, возник вопрос: кто лучше в GeoGuessr, моя жена (потрясающий игрок) или машина?
Автоматизируем GeoGuessr с помощью Selenium
Для скрейпинга скриншотов из текущего внутриигрового местоположения я создал программу на Selenium, четыре раза выполняющую следующие действия:
- Сохраняем скриншот canvas
- Делаем шаг вперёд
- Поворачиваем обзор примерно на 90 градусов
Количество повторов этих действий можно настроить через NUMBER_OF_SCREENSHOTS
в показанном ниже коде.
'''
Given a GeoGuessr map URL (e.g. https://www.geoguessr.com/game/5sXkq4e32OvHU4rf)
take a number of screenshots each one step further down the road and rotated ~90 degrees.
Usage: "python file_name.py https://www.geoguessr.com/game/5sXkq4e32OvHU4rf"
'''
from selenium import webdriver
import time
import sys
NUMBER_OF_SCREENSHOTS = 4
geo_guessr_map = sys.argv[1]
driver = webdriver.Chrome()
driver.get(geo_guessr_map)
# let JS etc. load
time.sleep(2)
def screenshot_canvas():
'''
Take a screenshot of the streetview canvas.
'''
with open(f'canvas_{int(time.time())}.png', 'xb') as f:
canvas = driver.find_element_by_tag_name('canvas')
f.write(canvas.screenshot_as_png)
def rotate_canvas():
'''
Drag and click the <main> elem a few times to rotate us ~90 degrees.
'''
main = driver.find_element_by_tag_name('main')
for _ in range(0, 5):
action = webdriver.common.action_chains.ActionChains(driver)
action.move_to_element(main)
.click_and_hold(main)
.move_by_offset(118, 0)
.release(main)
.perform()
def move_to_next_point():
'''
Click one of the next point arrows, doesn't matter which one
as long as it's the same one for a session of Selenium.
'''
next_point = driver.find_element_by_css_selector('[fill="black"]')
action = webdriver.common.action_chains.ActionChains(driver)
action.click(next_point).perform()
for _ in range(0, NUMBER_OF_SCREENSHOTS):
screenshot_canvas()
move_to_next_point()
rotate_canvas()
driver.close()
Скриншоты содержат и интерфейс GeoGuessr, но я не стал заниматься его удалением.
Приблизительное определение геолокации
Я перешёл к ветке PyTorch branch, скачал обученную модель и установил зависимости с помощью conda
. Мне понравился README репозитория. Раздел requirements был достаточно понятным и на новом Ubuntu 20.04 у меня не возникло никаких проблем.
Для выяснения отношений между человеком и машиной я выбрал в GeoGuessr карту World. Отправив URL своей программе Selenium, я прогнал её для четырёх скриншотов, сделанных в GeoGuessr.
Ниже представлены сокращённые результаты работы машины.
python -m classification.inference --image_dir ../images/
lat lng
canvas_1616446493 hierarchy 44.002556 -72.988518
canvas_1616446507 hierarchy 46.259434 -119.307884
canvas_1616446485 hierarchy 40.592514 -111.940224
canvas_1616446500 hierarchy 40.981506 -72.332581
Я показал те же четыре скриншота своей жене. Она предположила, что точка находится в Техасе. На самом деле место находилось в Пенсильвании. Машина сделала для каждого из четырёх скриншотов четыре различные догадки. Все догадки машины находились в США. Две достаточно близко друг к другу и две подальше.
Если взять усреднённое местоположение, то машина в этом раунде побеждает!
Мы сыграли ещё два последующих раунда, и окончательный счёт оказался 2-1 в пользу машины. Машина довольно близко подобралась к улице в Сингапуре, но не смогла опознать заснеженную улицу в Канаде (Мэделин назвала город за считанные секунды).
После написания этого поста я узнал о потрясающей предыдущей работе со сравнением результатов человека и машины на поле боя GeoGuessr. В статье PlaNet — Photo Geolocation with Convolutional Neural Networks Тобиас Вейанд, Илья Костиков и Джеймс Филбин пытались определить местоположение фотографии всего по нескольким пикселям.
Чтобы выяснить, насколько PlaNet сравнима с интуицией человека, мы позволили ей соревноваться с десятью много путешествовавшими людьми в игре Geoguessr (www.geoguessr.com).
В сумме люди и PlaNet сыграли в 50 раундов. PlaNet выиграла 28 из 50 раундов с медианной погрешностью локализации в 1131,7 км, в то время как медианная погрешность людей составляла 2320,75 км.
Веб-демо
Авторы статьи Geolocation Estimation of Photos using a Hierarchical Model and Scene Classification создали довольно милый веб-инструмент. Я проверил его на одном из скриншотов Selenium.
Графическая демонстрация, в которой вы сможете посоревноваться против описанной в статье системы с глубоким обучением находится здесь: https://tibhannover.github.io/GeoEstimation/. Также мы создали многофункциональный веб-инструмент, поддерживающий загрузку и анализ пользовательских изображений: https://labs.tib.eu/geoestimation
Обучаемость GeoGuessr
Существует много причин, по которым попытки победить GeoGuessr (под этим мы подразумеваем частая демонстрация более высоких результатов, чем у человека) при помощи машинного обучения могут быть проще, чем определение местоположения фотографии, сделанной человеком.
В отличие от обобщённого определения геолокации, в GeoGuessr мы (почти всегда) пытаемся выяснить, на какой дороге находимся. Это означает, что можно предпринять больше усилий для распознания всегда присутствующих элементов, например, дорожной маркировки, марок и моделей автомобилей (и то, и другое часто выдаёт страну). Можно предпринять усилия к перемещениям по дорогам в поисках дорожных знаков, из которых можно понять язык страны, а тексты на вывесках можно использовать для поиска по таблице.
Существуют и другие маркеры (кое-кто в сообществе GeoGuessr считает их жульничеством), которые может распознавать фреймворк обучения.
Если в street view посмотреть вниз то можно увидеть часть машины, снимавшей текущую фотосферу. Например, в Кении спереди у машины есть чёрная труба. Основная часть Вьетнама была снята с мотоцикла, и часто можно увидеть шлем водителя. Страны часто снимаются одной машиной с уникальным цветом или антенной.
В других местах в небе есть место, где сшитая фотосфера выглядит разорванной (в основном в Сенегале, Черногории и Албании). В Африке за автомобилем Street View иногда едут машины сопровождения. Есть разные поколения камер, с разным разрешением, типами гало, цветопередачей и размытием в нижней части сферы. В нижнем углу фотосферы есть сообщение об авторстве, обычно это «Google» и указание года, но иногда бывает и имя фотографа.
Если использовать эти подсказки, то я не удивлюсь, что машина когда-нибудь в соревнованиях на время победит даже лучших пользователей GeoGuessr. На самом деле, я считаю, что было бы достаточно одного исследовательского гранта, чтобы мы стали играть в GeoGuessr существенно хуже, чем машины.
На правах рекламы
Закажите сервер и сразу начинайте работать! Создание VDS любой конфигурации в течение минуты. Эпичненько :)
Автор: Mikhail