Ни для кого не секрет, что в инстаграме можно найти фотографии любого крупного города. Что, если мы попробуем по фрагментам восстановить картину целиком? Полученная информация поможет составить представление о незнакомых местах и будет полезна путешественникам, дополняя традиционные путеводители.
Идея анализа городов по фото в общем не нова [1, 2, 3], но честно говоря, найденные статьи по существу рассказывают не очень много.
Как собирать данные из инстаграма — тема, освещенная неоднократно, и в данной статье не рассматривается. Что-то можно вытянуть через API, но если к нему нет доступа, имеются альтернативные варианты.
Нашими базовыми инструментами будут Python и Plotly. В конце приведены ссылки на GitHub и Jupyter-ноутбуки для разных городов (графики интерактивные, поэтому содержат больше информации и рекомендуются к очному знакомству). В репозиторий также включены скрипты для сбора данных.
В этой статье мы будем гулять по Берлину. Датасет, рассматриваемый в данной статье, содержит порядка 100k фотографий для ~2k локаций.
Для каждой локации нам потребуется:
- Название
- Координаты
- Фото (10-100 шт.)
- Число постов (переменная edge_location_to_media на странице локации, в документации она не фигурирует, но по косвенным признакам обозначает именно это)
Первая прогулка
Нанесем данные на карту. Чтобы выделить наиболее оживленные места, объединим локации, расположенные на одной улице, в один маркер. Карты будем рисовать с помощью Mapbox.
Карта Берлина. На маркерах отмечено число локаций
Познакомимся с основными топонимами. Для этого нам нужно преобразовать координаты мест в адреса — это задача обратного геокодирования. Для ее решения использовался Google Geocoding API. После сбора геоданных, отсортируем улицы и районы по числу локаций.
Для таких городов, как Москва, информация о районах не слишком важна, в центре все примерно одинаково, а вот Берлин более неоднороден и поэтому полезно отличать, например, Кройцберг от Пренцлауэр-Берга.
Посмотрим на список мест, отсортированный по популярности.
Топ локаций
location, edge_location_to_media
Alexanderplatz Berlin, 695533
East Side Gallery, 537034
Brandenburger Tor, 525004
Berliner Dom, 411376
Berlin Kreuzberg, 364077
Berlin Mitte, 340891
Memorial to the Murdered Jews of Europe, 251433
Berlin Wall, 228749
Kreuzberg Berlin Germany, 218383
Potsdamer Platz, 182316
Checkpoint Charlie, 171895
Brandenburg Gate, 143530
Mercedes Benz Arena Berlin, 143498
Zoo Berlin, 140465
Berlin Hauptbahnhof, 138153
Gendarmenmarkt Berlin, 114615
Berliner Fernsehturm, 106127
Friedrichshain, 104376
Reichstag dome, 101895
Berlin Germany, 97402
East Side Gallery Berlin Wall, 96385
Jüdisches Museum Berlin Jewish Museum Berlin, 94647
Berlin the place to be, 92444
FAR AWAY, 91062
Berlin Reichstag, 90945
Museum Island, 84010
Potsdamer Platz Berlin, 80733
Hamburger Bahnhof Museum für Gegenwart Berlin, 79323
Kurfürstendamm, 75632
KaDeWe, 73312
Pergamonmuseum, 71524
Tempelhofer Feld, 70472
Azad Gence, 69566
Reichstag building, 69028
Tiergarten Berlin Germany, 65391
Berghain Panorama Bar, 60807
Mall of Berlin, 60718
Schöneberg Berlin Germany, 60482
Tiergarten Berlin, 60210
Hackescher Markt, 59899
Klunkerkranich, 59661
Berlin Victory Column, 57304
Berlin Prenzlauer Berg, 56705
Madame Tussauds Berlin, 55351
Hackesche Höfe, 55183
Bikini Berlin, 50920
Alexanderplatz, 48875
Alte Nationalgalerie, 48346
Museum für Naturkunde Berlin, 46786
The Wall Of Berlin, 46708
NENI Berlin Monkey Bar, 44770
Flughafen Berlin Tempelhof, 44197
Columbiahalle, 43717
Brandenburger Tor, 43484
Berlin Germany, 42739
Warschauer Straße, 41897
Reichstag, 41321
Berlin Holocaust Memorial, 39930
Brandebourg Tor Berlin , 38949
Berlinische Galerie, 37947
Sony Center, 37539
Berliner Philharmonie, 37431
Konzerthaus Berlin, 36905
Tempodrom, 35982
Berlin Mitte, 35895
Friedrichshain, 34693
Urban Spree, 34613
Kraftwerk Berlin, 34392
Bode Museum, 34205
Bundestag, 33998
SONY Center Berlin am Potsdamer Platz, 33628
Berlin Brandenburger Tor, 33098
Brandenburger Tor, 32857
Berlin Zoological Garden, 32718
Deutsches Historisches Museum, 32604
Humboldt Universität zu Berlin, 32308
C/O Berlin, 32294
Astra Kulturhaus Berlin, 30082
Badeschiff Berlin, 30007
Markthalle Neun, 29989
Michelberger Hotel, 29444
Altes Museum, 29009
Hotel Adlon Kempinski Berlin, 28889
Mauerpark, 28282
YAAM Berlin, 27925
Mitte, 27681
Hofbräu Berlin, 27561
Huxleys Neue Welt, 27546
Oberbaum Bridge, 27131
Friedrichstadt Palast Berlin, 27009
STATION Berlin, 26816
Velodrom Berlin, 26385
Moabit, 26350
Neues Museum, 26346
Gedächtniskirche, 26316
В нем перемешаны «формальные» места (памятники, музеи, галереи) с «неформальными» (клубы, бары, магазины). Чтобы отделить одни от других, нам понадобятся данные из Википедии; в отличие от инстаграма, ее API доступно всем желающим в полном объеме. По одной оси отложим число постов в инстаграме, по другой — количество просмотров статьи в Википедии об этом месте. На таком рисунке более «формальные» места будут располагаться выше, более популярные — правее.
Для снижения погрешностей, будем группировать локации по улицам, как на карте. В процессе подбора статей к локациям теряется часть данных, поэтому рисунок будет содержать меньше точек, чем карта.
«Инста-вики» диаграмма. Для нескольких улиц отмечены наиболее значимые места. Более подробную информацию см. в ноутбуке
Куда идти делать селфи? Оценим долю фотографий, содержащих лица. В этом нам помогут OpenCV и каскад Хаара.
Доля фотографий, содержащих лица. Точки, расположенные в правой части рисунка — популярные места для селфи (ну или ярмарки тщеславия)
Going deeper
Далее, применим нейронную сеть для определения окружения на фотографиях. Использовалась CNN Places365, обученная на датасете, собранном в MIT [4]. Были отобраны наиболее подходящие для данной задачи теги. Узнаем, какие из них чаще встречаются:
Рейтинг тегов. Названия оставлены оригинальные. Их не надо понимать буквально: martial_arts_gym — это скорее тренажерный зал, а тегом discotheque может быть отмечено просто темное помещение
Посмотрим, какие теги соотвествуют улицам:
То же самое на карте:
Карта Берлина с наиболее характерными тегами. Обратите внимание на тег discotheque справа — это Фридрихсхайн, район с бурной ночной жизнью
Hello, Hallo, Hola
Один из способов что-то узнать о новом городе — сравнить с тем, который тебе знаком. Возьмем вектора фич для локаций двух городов и с помощью t-SNE получим двумерные координаты. Для большей наглядности, на рисунке скрыты локации, лежащие в области города-оппонента.
Сравнение локаций Берлина и Москвы. Ярлыки обозначают доминирующий признак в данной области. Кластеры разных цветов, расположенные рядом, указывают на точки соприкосновения городов, т. е. на похожие места
Посмотрим на разность признаков:
Разность признаков между Берлином и Москвой. Похоже, в нашей столице чаще фотографируются в тренажерных залах и примерочных
Статьи
1. How to Study the City on Instagram
2. What We Instagram: A First Analysis of Instagram Photo Content and User Types
3. Zooming into an Instagram City: Reading the local through social media
4. Places: A 10 million Image Database for Scene Recognition
Ноутбуки
Тула, Москва, Санкт-Петербург, Берлин, Рим, Гонконг
GitHub
github.com/pskryuchkov/voyage