Создаём свой онлайн фотоальбом с 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-приложение;
- удобный интерфейс.
Минусы:
- Нейросеть не всегда хорошо справляется с распознаванием изображений;
- мне так и не удалось заставить нормально распознавать лица: либо вообще ничего не попадало в индекс, либо система находила «лица» котов;
- система использует фотографии только при индексировании. Для просмотра используется затем созданный кэш из превью, который может значительно вырасти в размерах при большом количестве фотографий.