Our project is dedicated to recognizing the architectural styles of buildings from photos.
Наш проект посвящён определению архитектурных стилей зданий по фотографиям.
Приложение получилось легковесным: 168 MB. Обработка одной фотографии (инференс модели + работа приложения) занимает около 500 ms.
Итоговая модель предсказывает архитектурные стили с высокой точностью: f1-мера на тестовой части данных = 92.44 %. Скорость обработки изображений моделью достаточно высокая: 2.47 FPS = 405 ms на изображение.
В качестве метрик успеха можно рассмотреть:
- увеличение интереса среди молодого поколения к искусству,
- повышение качества образования в области искусства,
- количество скачиваний нашего приложения,
- привлечение государственной поддержки.
С демонстрацией работы нашего приложения можно ознакомиться здесь: https://disk.yandex.ru/i/KJjbY3wrSn6rgg, https://disk.yandex.ru/i/w6WEkqI5r8nvXw.
Ниже можно ознакомиться с архитектурой нашего решения.
В итоге мы остановились на подходе с использованием модели для решения задачи классификации. По входному изображению модель будет предсказывать его архитектурный стиль (класс).
Поскольку наш проект нацелен на определение архитектурных стилей, вопрос классов стоит довольно остро. Было проведено исследование наиболее распространённых архитектурных стилей в России и были выделены следующие классы и подклассы:
- Древнерусская архитектура:
- Древнерусская крестово-купольная архитектура
- Древнерусская шатровая архитектура
- Барокко и его вариации:
- Барокко
- Петровское барокко
- Елизаветинское барокко
- Классицизм и его вариации:
- Классицизм
- Ранний классицизм
- Строгий классицизм
- Поздний классицизм
- Павловский классицизм
- Историзм:
- Историзм
- Русский ампир
- Неоренессанс
- Необарокко
- Неовизантийский
- Модерн и его вариации:
- Модерн
- Русский модерн
- Современные и экспериментальные стили:
- Авангард
- Деконструктивизм
- Постмодерн
- Конструктивизм
- Сталинская архитектура:
- Сталинская неоклассика
- Сталинский ампир
- Типовая советская архитектура:
- Типовая архитектура хрущевского времени
- Типовая архитектура брежневского времени
Все результаты проведённого мини-исследования зафиксированы в Google Sheets по следующей ссылке (на странице "Стили"): https://docs.google.com/spreadsheets/d/1flZR9etKiiBj5woGevgpPm_uXmV5QDf2FaGiVF5qL9s/edit?usp=sharing.
В качестве итоговых классов были выбраны все вышеперечисленные классы, кроме историзма. Историзм было решено удалить по причине того, что этот стиль сочетает в себе элементы многих архитектурных стилей из разных исторических эпох, поэтому он может быть слишком похож на все остальные классы.
Для сбора сырого датасета картинок использовался web-scraping для автоматического сохранения картинок из результатов поиска на сайте с архитектурной фотобазой (https://photobuildings.com/) или из выдачи обычного Google. Поисковые запросы / фильтры содержали название рассматриваемого архитектурного стиля.
Ссылка на реализованный нами scraper: https://github.com/ArchEye-Team/Scraper.
Таким образом мы собрали сырой датасет с отдельными папками для картинок каждого из 7 выделенных классов. Более подробная информация о собранном сыром датасете сохранена в нашей Google-таблице (на странице "Ресёрч по датасетам"): https://docs.google.com/spreadsheets/d/1flZR9etKiiBj5woGevgpPm_uXmV5QDf2FaGiVF5qL9s/edit?usp=sharing.
После сбора сырого датасета была дополнительно осуществлена его очистка: удаление лишних изображений внутри каждого из классов, а также дубликатов, которые попали сразу в несколько классов в сыром датасете.
Для версионирования нашего датасета мы использовали MLFlow. На текущий момент есть 2 версии датасета: сырой и после очистки.
Все требования к данным, инструкции для разметчика, а также расчёт стоимости сборки всего датасета были подробно расписаны в нашем Google-документе (https://docs.google.com/document/d/1NPxiwmb6qTcejX8FUNtnz5B4XwUiJwMTlFEK3ELzqfk/edit?usp=sharing)
В качестве моделей для экспериментов мы отобрали 3 классификационных модели: EfficientNetV2, ViT и ResNet. Обоснование выбора моделей, ссылки на код для обучения зафиксированы в Google-таблице (на странице "Модели для классификации"): https://docs.google.com/spreadsheets/d/1flZR9etKiiBj5woGevgpPm_uXmV5QDf2FaGiVF5qL9s/edit#gid=2029452096.
Обучение осуществлялось на kaggle (на gpu T4), эксперименты логировались с помощью MLFlow. Для воспроизводимости наших экспериментов все random_seeds были зафиксированы. Для возможности честного сравнения экспериментов разбиения train-val-test были одинаковыми для всех экспериментов.
В качестве главной метрики качества была выбрана macro f1-мера. Сравнение экспериментов с обучением различных классификаторов осуществлялось на основе её значений.
Ниже приведена таблица с итоговыми значениями метрик качества в конце обучения выбранных классификационных моделей:
Модель | f1-score on val (%) | f1-score on test (%) | size (pt), MB | inference FPS (cpu) | inference FPS (gpu, T4) |
---|---|---|---|---|---|
EfficientNet | 73.77 | 74.06 | 204.4 | 7.17 | 54.33 |
ViT | 92.11 | 92.44 | 327.4 | 2.47 | 64.78 |
ResNet | 73.86 | 76.44 | 163.1 | 7.69 | 71.35 |
В качестве итоговой модели выбрана ViT, так как она показала самые высокие результаты на валидационной и тестовой частях датасета.
Веса обученных моделей сохранены в папке на яндекс-диске: https://disk.yandex.ru/d/O7m7Ewd9vNWJCQ.
Нами было написано iOS-приложение. Код не поместился на github, поэтому мы выложили его на яндекс-диск: https://disk.yandex.ru/d/E5-2CkqpjnaYKw.
IMG_2779.MP4
IMG_2773.MP4
IMG_2772.MP4
Xcode 14 iOS 16.0+