Создаём свой онлайн фотоальбом с PhotoPrism

Я уже давно задумывался о какой-либо каталогизации всей своей коллекции фотографий, в которой есть и личные снимки, и съёмки различных городских мероприятий, и работа, и многое другое. Пробовал использовать как простейшие средства вроде таблиц Excel и баз данных Access, так и написание собственных приложений для этой цели на различных языках программирования. Но всё не то…

И вот однажды в сети я увидел упоминание приложения PhotoPrism.

Photo Prism® — это web-приложение на базе искусственного интеллекта для децентрализованной сети. Оно использует новейшие технологии для автоматической расстановки меток и распознавания изображений, без вашего участия.

Его основные особенности:

  • Возможность разворачивания приложения практически на любом подходящем устройстве: на домашнем компьютере, домашнем сервере, микрокомпьютере (Raspberry Pi и подобных), NAS, виртуальном сервере, выделенном сервере, в облаке и т.д.
  • Использование удобного Web-интерфейса, с которым удобно работать как на компьютере, так и на экране мобильного телефона или планшета.
  • Лёгкость установки: существует готовый Docker контейнер, который можно установить одной командой в терминале.
  • Поиск: лёгкий поиск фотографий по нужным фильтрам. Фотографии автоматически классифицируются по контенту (используется нейросетевая технология TensorFlow) и местоположению. Также можно производить поиск по таким свойствам, как качество, цвет, ч/б фотографии. Фотографии могут быть помечены как приватные, архивные или исключены из поиска.
  • Распознавание лиц: позволяет автоматически классифицировать фотографии по человеку, который на них находится. Правда (как показала практика), пока это не очень хорошо работает.
  • Классификация по метаданным, извлекаемым из EXIF-данных: описание, дата снимка, параметры кадра, камера, объектив, автор и т.д.
  • Карты и места: из EXIF свойств снимков извлекаются данные о местоположении и отображаются на картах.
  • Возможность поделиться альбомом с кем-нибудь с помощью ссылок.
  • Поддержка множества форматов изображений, включая RAW.
  • Возможность загрузки фотографий с телефона по WebDAV.
  • Безопасность: всё хранится только на вашем личном компьютере или сервере.

Существует несколько версий PhotoPrism, которые отличаются в основном по наличию технической поддержки и обслуживания. Поэтому для нас вполне хватит бесплатной Community версии.

Установка

Чтобы установить PhotoPrism, необходимо всего лишь установить Docker контейнер:

docker run -d \
  --name photoprism \
  -p 2342:2342 \
  -e PHOTOPRISM_ADMIN_PASSWORD="password" \
  -v /photoprism/storage \
  -v ~/Pictures:/photoprism/originals \
  photoprism/photoprism

В контейнере есть два каталога, которые обязательно нужно вынести в хост систему:

  • /photoprism/originals — здесь хранятся все оригиналы фотографий. Соответственно, этот каталог нужно примонтировать к каталогу с фотографиями (~/Pictures в примере выше). Если вы не хотите, чтобы PhotoPrism мог изменять содержимое этого каталога и вы добавляете туда фотографии только самостоятельно, то можно его примонтировать с флагом «ro«.
  • /photoprism/storage — здесь будет храниться база данных, а также все превью изображений. Поэтому размер хранимых данных здесь будет полностью зависеть от количества фотографий и настроек библиотеки. Рекомендуется хранить этот каталог на SSD накопителе.

Доступно множество параметров, которые передаются в команде запуска в качестве переменных окружения. Вот некоторые из них:

  • PHOTOPRISM_ADMIN_PASSWORD — пароль администратора.
  • PHOTOPRISM_WORKERS — максимальное количество потоков, одновременно сканирующих библиотеку. По-умолчанию равно количеству ядер процессора.
  • PHOTOPRISM_READONLY — отключает возможность загрузки, удаления фотографий и других операций, которые могут изменять содержимое папки с оригиналами.
  • PHOTOPRISM_DISABLE_PLACES — отключает определение мест и карты.
  • PHOTOPRISM_DISABLE_FACES — отключает распознавание лиц.
  • PHOTOPRISM_DISABLE_CLASSIFICATION — отключает распознавание предметов на фото.
  • PHOTOPRISM_DISABLE_TENSORFLOW — отключает все нейросетевые функции.

С полным списком параметров можно ознакомиться в документации на официальном сайте.

Интерфейс

После установки необходимо открыть в браузере страницу http://localhost:2342 , либо http://IP:2342 , если приложение установлено на сервере. Здесь необходимо авторизоваться в системе с логином admin и паролем, который был указан при запуске контейнера:

Откроется библиотека изображений, но пока пустая. Необходимо вручную запустить сканирование каталога, это мы сделаем чуть позже.

Заглянем в настройки. Там можно настроить множество параметров, которые будут влиять на возможности приложения и на скорость его работы:

Здесь можно включить/выключить различные пункты меню, распознавание лиц, отображение мест на карте, ведение логов, редактирование и т.д. Также можно поменять язык интерфейса. Русский тоже имеется.

В расширенных настройках можно изменять качество создаваемых превью-картинок, их максимальный размер (на каждую фотографию создаётся несколько превьюшек с разными размерами), а также управлять опциями нейросети:

Сканирование

Для сканирования каталога с фотографиями необходимо выбрать пункт Library (Библиотека) и нажать кнопку Start:

Само сканирование выполняется в фоновом режиме. Его скорость зависит от настроек приложения, включенных опций, а также от производительности компьютера.

По итогу в интерфейсе начнут появляться фотографии. С помощью кнопки изменения вида можно выбрать один из трёх вариантов:

Вид карточек с краткой информацией:

Вид таблицы:

Вид миниатюр:

Любую фотографию можно открыть для просмотра. Здесь же можно перейти в полноэкранный режим или включить слайдшоу.

Для каждой фотографии доступны для просмотра и редактирования множество полей. Некоторые из них заполняются автоматически из EXIF метаданных и результатов работы TensorFlow:

  • Заголовок;
  • дата и время снимка;
  • страна;
  • координаты GPS;
  • камера и параметры снимка (выдержка, ISO, фокусное расстояние, число F);
  • объектив;
  • авторские права;
  • предмет съёмки;
  • лицензия;
  • описание;
  • ключевые слова;
  • заметки.

Если перейти в раздел Labels (Метки), то можно увидеть автоматически классифицированные фотографии по различным меткам:

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

А вот электроника:

Если система с чем-то не справилась, то можно исправить метку вручную. Вот фото вагона, который сеть пометила как «Car» (автомобиль):

Открываем редактор и просто добавляем нужную на метку. Она сразу помечается 100% вероятностью:

Ещё одна любопытная опция: отображение фотографий на карте (если в EXIF метаданных имеются сведения о координатах):

Также имеется сортировка по регионам:

Конечно же имеется календарь, в котором все фотографии отсортированы в папки по годам и месяцам:

При необходимости можно посмотреть фотографии по каталогам, как они находятся на диске:

На смартфоне система тоже вполне удобна в использовании:

Если есть необходимость доступа к системе через Интернет, то конечно же можно пробросить порты на роутере. Но в этом случае убедительно рекомендуется использовать реверс-прокси (например, Traefik), чтобы защитить передаваемую информацию и сделать работу сервиса по https протоколу.

Итог

Плюсы:

  • Автоматическая классификация фотографий по многим параметрам;
  • мощная система поиска по различным фильтрам и ключевым словам;
  • полностью self-hosted решение — все данные хранятся только на вашем личном оборудовании;
  • возможность загрузки новых фотографий прямо через web-приложение;
  • удобный интерфейс.

Минусы:

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