Ни для кого не секрет, что в инстаграме можно найти фотографии любого крупного города. Что, если мы попробуем по фрагментам восстановить картину целиком? Полученная информация поможет составить представление о незнакомых местах и будет полезна путешественникам, дополняя традиционные путеводители.

Идея анализа городов по фото в общем не нова [1, 2, 3], но честно говоря, найденные статьи по существу рассказывают не очень много.

Как собирать данные из инстаграма — тема, освещенная неоднократно, и в данной статье не рассматривается. Что-то можно вытянуть через API, но если к нему нет доступа, имеются альтернативные варианты.

Нашими базовыми инструментами будут Python и Plotly. В конце приведены ссылки на GitHub и Jupyter-ноутбуки для разных городов (графики интерактивные, поэтому содержат больше информации и рекомендуются к очному знакомству). В репозиторий также включены скрипты для сбора данных.

В этой статье мы будем гулять по Берлину. Датасет, рассматриваемый в данной статье, содержит порядка 100k фотографий для ~2k локаций.

Для каждой локации нам потребуется:

  1. Название
  2. Координаты
  3. Фото (10-100 шт.)
  4. Число постов (переменная 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
Judisches 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 fur Gegenwart Berlin, 79323
Kurfurstendamm, 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
Schoneberg Berlin Germany, 60482
Tiergarten Berlin, 60210
Hackescher Markt, 59899
Klunkerkranich, 59661
Berlin Victory Column, 57304
Berlin Prenzlauer Berg, 56705
Madame Tussauds Berlin, 55351
Hackesche Hofe, 55183
Bikini Berlin, 50920
Alexanderplatz, 48875
Alte Nationalgalerie, 48346
Museum fur 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 Universitat 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
Hofbrau Berlin, 27561
Huxleys Neue Welt, 27546
Oberbaum Bridge, 27131
Friedrichstadt Palast Berlin, 27009
STATION Berlin, 26816
Velodrom Berlin, 26385
Moabit, 26350
Neues Museum, 26346
Gedachtniskirche, 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

Комментарии (4)


  1. webviktor
    08.04.2019 10:24

    И все?
    Это треть статьи или как?
    Обрывается не начавшись.


  1. gofat
    08.04.2019 11:10
    +1

    Интересно сделано, спасибо за статью.

    Можно еще было что-нибудь дополнительно использовать из pre-trained сетей (условный imagenet, к примеру), чтобы вытащить дополнительную информацию для анализа.
    Ну и любопытно во времени поглядеть, как меняются вкусы для фото-мест за год, к примеру.


  1. JediPhilosopher
    08.04.2019 11:37

    В ходе разработки моего сервиса для построения интересных пешеходных маршрутов я изучал возможность использования данных соцсетей и фоточек из них для определения интересности места. Но там очень много подводных камней, и в реальности наивная идея «давайте выделим места, где больше фоточек, соединим их маршрутами и выдадим туристам» не работает и дает очень много погрешностей. Почему так:

    1. Большое количество фоточек в каком-то конкретном месте вовсе не означает, что место интересно для туристов и стоит посещения. Очень много фотографий, например, делают в транспортных хабах: вокзалах, аэропортах. Селфи типа «всем чао, я на Мальдивы» на фоне самолетов за окном. А туристу, гуляющему, по городу там, разумеется, делать нечего (хотя бывают те же вокзалы которые сами по себе памятники архитектуры). Например в этой статье анализировали фоточки из Гонконга, там 2 из 6 основных кластеров фото во фликре — аэропорт и вокзал.
    2. Фоточки могут иметь определенную сезонность или периодичность. Например в этом месте разово провели какое-то крутое мероприятие: концерт, карнавал и т.п. Люди наделали и напостили вагон фоточек, создав локальный кластер. Но больше такого мероприятия там не планируется, и месяц спустя туристу там уже делать нечего. В этой статье чтобы отфильтровывать такие темы анализировали теги, но все равно такие фото могут просачиваться и портить статистику, создавая «ложные» достопримечательности.
    3. Фоточки постят не только туристы, но и местные жители. А у них могут быть совсем разные интересы, как описано в этой статье. Может быть куча кластеров фото вокруг, например, школ и детских садов, где местные жители фотографируют своих чад, но туристу это, опять же, не интересно.
    4. По группам фотографий можно найти достопримечательности, но сложно построить удобный и интересный маршрут. Так как просто улицы обычно редко фотографируют. Люди фотографируются либо у достопримечательностей, либо в заведениях по сторонам улицы, понять из этого удобно ли идти по улице (вдруг это шумная пыльная многополосная магистраль) из соцсетей сложно.
    5. Погрешности гео-тегов. В условиях плотной городской застройки GPS может давать серьезную погрешность, а при съемке внутри зданий вообще улетать черт знает куда. Поэтому точную привязку интересных объектов к улицам сделать сложно.

    Ну и финальная точка, которая ставит крест на использовании этих данных для чего-либо кроме разовых исследований — это лицензия. У всех крупных соцсетей обычно довольно закрытые лицензии на контент: их нельзя парсить, нельзя сохранять полученную из них информацию, нельзя использовать их данные в своих коммерческих целях. За исследователями никто гоняться не будет, разумеется, но любая попытка использовать такие алгоритмы и их данные для создания коммерческого продукта (путеводителя, навигатора) рано или поздно встретится с проблемами.

    В целом идея использовать данные соцсетей для рекомендаций маршрутов — это хорошая и полезная идея, но подводных камней на пути от proof-of-concept к реально работающему сервису там очень много. Собственно поэтму, видимо, таких сервисов в открытом доступе до сих пор и нет.


    1. pskryuchkov Автор
      08.04.2019 15:28

      2. Фоточки могут иметь определенную сезонность или периодичность. Например в этом месте разово провели какое-то крутое мероприятие: концерт, карнавал и т.п. Люди наделали и напостили вагон фоточек, создав локальный кластер. Но больше такого мероприятия там не планируется, и месяц спустя туристу там уже делать нечего. В этой статье чтобы отфильтровывать такие темы анализировали теги, но все равно такие фото могут просачиваться и портить статистику, создавая «ложные» достопримечательности.
      Да, это действительно имеет место, но как правило «места на раз» тонут среди постоянных, особенно если их фильтровать, например, по дате.

      1. Большое количество фоточек в каком-то конкретном месте вовсе не означает, что место интересно для туристов и стоит посещения. Очень много фотографий, например, делают в транспортных хабах: вокзалах, аэропортах.
      3. Фоточки постят не только туристы, но и местные жители. А у них могут быть совсем разные интересы, как описано в этой статье. Может быть куча кластеров фото вокруг, например, школ и детских садов, где местные жители фотографируют своих чад, но туристу это, опять же, не интересно.
      Это ловит классификатор изображений: понятно, что туристу интересны места, помеченные как museum, promenade и restaurant, а не как office, schoolhouse и airport_terminal.