Photonix Photo Managerで自前の写真サーバーを立てる
May 24, 2023
linux AlpineLinux 写真サーバー webサーバー目次
はじめに
写真サーバーといえば「Google Photos」と「Apple Photos」が有名ですが、お手軽なのにこれらと引けを取らず高機能な写真サーバーPhotonix Photo Manager(以降Photonixと略す)を自前で立ち上げてみます。
Photonixは最新のAIによる画像認識技術を取り入れて、写真に何が写っているのかを認識したり、写真中の人物を認識したり、といったクールな機能も実装されています。稼働画面からはpython臭がプンプンします。爬虫類の匂い?別に悪い匂いではないけれど…
Photonixの感触を掴むためのデモサイトが存在します。
https://demo.photonix.org/login
demoサイト
デモサイトにログインすると何の変哲もないシンプルなサムネイルページに切り替わりますが、
サムネイルをクリックし写真画面に切り替わると…
画像認識の結果が可視化されます。Yoloによる画像認識でお馴染みの画像なんですが…気分はAI技術者。
ただ、Photonixは大量の写真を扱う機能は弱いように思えます。最新のAI画像認識技術に触れてみるために使うというスタンスでいいと思います。
本格的で実用的な写真サーバーにはPiwigo、PhotoPrismやPhotoPrismなどがあり、本サイトでも紹介していますので、そちらもどうぞ。
- Lycheeで自前の写真サーバーを立てる
- Piwigoで自前の写真サーバーを立てる
- PhotoPrismで自前の写真サーバーを立てる
- Photonix Photo Managerで自前の写真サーバーを立てる
本記事はPhotonix設定手順の備忘録です。
Photonixのインストール
Photonixをdocker composeでインストールします。インストール先のOSはAlpine Linuxを想定していますが、docker composeでインストールするので、dockerを入れたLinuxならば、どれでも大丈夫だと思います。
まずは公式docker-composeファイルの入手
$ wget https://raw.githubusercontent.com/photonixapp/photonix/master/docker/docker-compose.example.yml
$ cp -p docker-compose.example.yml docker-compose.yml
このdocker-composeファイルのままで動作するのですが、ご自身の環境に応じて変更すべきポイントをあげておきます。
services:
postgres:
restart: always
redis:
restart: always
photonix:
ports:
- '3600:80'
volumes:
- ./data/photos:/data/photos
restart: always
restart: alwaysは、全ての設定を終え動作確認も終わったら、常用するなら追加しておきましょう。
使用するポート(ports:)はデフォルトでは8888ですが、筆者の場合3600に変更しました。本記事では、ポート3600での稼働例を示します。
volumes:で永続化するデータ領域を定義します。今回の例ではPhotonixのディレクトリを切って、その中にdocker-compose.ymlを入れ、同じディレクトリにdataを置きました。data/photos以下が全写真の置き場で、その中にサブディレクトリを切っても大丈夫です。
./Photonix/
docker-compose.yml
data/
photos/ 写真格納フォルダー
photo1.jpg
subfolder/
photo2.jpg
...
実際に運用する場合は、写真格納フォルダーはdata/photos以下ではなく、Sambaでマウントした共有ディレクトリにしておくと、外部からもアクセスできて便利だと思います。
例えばこんなかんじで、
volumes:
- "/home/samba/share/Pictures:/data/photos"
本サイトに別の写真サーバアプリPhotoPrismの活用記事をあげています。
PhotoPrismとPhotonixで写真格納フォルダーを共用すれば、写真ファイルを写真アプリ毎に二重に持つ必要がなく、写真の追加も1度で済み、とても便利。
PhotoPrismのdocker-compose.yml
volumes:
- "/home/samba/share/Pictures:/photoprism/originals"
Photonixのdocker-compose.yml
volumes:
- "/home/samba/share/Pictures:/data/photos"
こうしておくと、PhotoPrismとPhotonixのどちらもSambaでマウントした共有ディレクトリ /home/samba/share/Pictures の写真を参照することになります。
本サイトに公開した手順でAlpine Linuxのファイアーウォール(awall)を設定している場合は、ポート3600番を開ける必要があります。
"service":{
...
"webapps": [
...
{"proto": "tcp", "port": 3600},
...
],
...
},
"filter": [
...
{
"in": "LAN",
"out": "_fw",
"service": [ "http", "webapps", ...],
"action": "accept"
},
...
]
ファイアーウォールを再起動
# awall activate -f
# rc-service iptables restart
# rc-service ip6tables restart
docker-compose.ymlが出来て、ファイアーウォールに穴を開けたら、Photonixサーバーを起動
$ docker compose up -d --build
Photonixを最新版にアップグレードするには、
$ docker compose pull photonix
$ docker compose stop photonix
$ docker compose up -d photonix
Photonixへのアクセス
Photonixサーバーが起動したら、Webブラウザから写真サーバーにアクセス
今回はポート番号3600で設定したので、こんなかんじで。
http://サーバ名またはIPアドレス:3600/
Photonixサーバーにアクセスすると、以下のログインページが表示されます。1回目の起動時にログインアカウントとパスワードを設定します。このアカウントはAdminアカウントになります。
次に写真ライブラリを作成します。ライブラリ名と場所を指定します。「Storage backend」は「Local」で「Base path」は「/data/photos」のままでOK。
追加のユーザーとライブラリを追加できますが、これは現時点ではコマンドラインで行う必要があります。
$ docker compose run photonix python photonix/manage.py createsuperuser --username USERNAME --email example@example.com
$ docker compose run photonix python photonix/manage.py create_library USERNAME "My Library"
「Photo importing」でbase pathのdata/photosを監視するように設定。base pathに写真が追加されたら自動でインポートされます。
どの画像解析、画像認識をするかを指定します。まずは全部ONにします。
これで使用準備が整いました。
引き続きログインページになるので、先程設定したログインアカウントとパスワードを入力。
写真フォルダーが空なのでこんなページになります。
写真の追加
写真ファイルはdata/photosにコピーすると自動的にインポートされます。data/photos以下にサブディレクトリが切られていても良いし、日本語のファイル名やディレクトリ名であってもよい。
写真ファイルをdata/photosにコピーして暫く待って、ブラウザをリロードすると、タイムラインページに、
インポートしたつもりの写真が全て揃っていないかも…その場合はさらに暫く待って、ブラウザをリロード。インポートの際、画像の認識もやっているので相当時間がかかる。
それでも一部しかインポートできていなかったら、写真ファイルのタイムスタンプが原因かもしれません。data/photosに複数のサブディレクトリをコピーして一括してインポートさせる場合など、先にインポートしたサブディレクトリよりも後でインポートするサブディレクトリのタイムスタンプが古いとインポートされないようです(バグなのか仕様なのか)。このようなとき、
# touch data/photos/インポートできていなかったサブディレクトリ
これでうまくいきました。
写真の認識
タイムラインページのサムネイルをクリック
写真に何が写っているかの認識結果がYoloっぽく表示されます。この例ではTreeが3つとHouseが1つ認識されました。
Photonixが写真中の何を認識できるかは、data/models/object/oid_v4_label_map.pbtxtを見ればわかります。601種類の物体を識別できるようです。
item {
name: "/m/011k07"
id: 1
display_name: "Tortoise"
}
item {
name: "/m/011q46kg"
id: 2
display_name: "Container"
}
...
item {
name: "/m/0xzly"
id: 600
display_name: "Maracas"
}
item {
name: "/m/0zvk5"
id: 601
display_name: "Helmet"
}
タイムラインページの検索欄からdisplay_nameのキーワードを入力すると、その物体が写っている写真を検索できます。
data/models/object/oid_v4_label_map.pbtxtのdisplay_nameを日本語に書き換えたら日本語で検索できるのだろうか?未確認ですが。
マップ機能
「Map」タブから写真の撮影場所を地図で表示し、そこから写真の検索ができます。
「Google Photos」や「Apple Photos」と同様の操作感です。
アルバム作成
アルバム作成のUIは癖があって少々わかりにくい。
まず、Ctrlキーを押しっぱなしにし画像を選択するモードにする。選択モードになるとサムネイルの右下に白丸アイコンが付く。この白丸アイコンをクリックすると画像を選択したことになります。
必要なだけ画像を選択したら、ページ右下の「+」アイコンをクリックすると、選択した画像に対して何をするかのコンテキストメニューがページ右下に半円状であらわれます。
コンテキストメニューから「+Album」を選択し、アルバムの名前を入力。
アルバムが作成されました。このとき、ブラウザをリロードしなければアルバムは現れないかもしれません。
「Album」タブに移動すればOK.
コンテキストメニューの操作が直感的にわかりにくいところが残念なところ。
Photonixスマホアプリ
AppStoreやPlayストアで「Photonix Photo Manager」を探し、ダウンロードします。
「Photonix Photo Manager」を起動し、PhotonixサーバのURLを入力。
今回はポート番号3600で設定したので、こんなかんじで。
http://サーバ名またはIPアドレス:3600/
ログインアカウントとパスワードを入力すると、タイムライン画面が表示されます。
以下のスクリーンショットはスマホを横持ちしたときのもの。
スマホの写真をアップロードする機能は無いようです。
実運用に挑戦
手持ちの20年分約3万枚の写真をPhotonixに投入してみて使えるのかを試してみました。
約3万枚を一括でいきなりインポートしてみましたが、非力なCeleronサーバーのためかインポートは遅々として進まず、丸10日間経過してもインポートは完了していません。
明示的に指示しなくても写真を追加するだけで自動でインポートが始まるのですが、どこまで進んだかの進行状況が見えないのは不安な点です。とりあえず、
$ docker compose logs photonix
これでログは出力できるのであまり進んでいないことは確認できます。約3万枚の写真のインポートを続けた間に何度かLinux全体が無反応になり、その都度やむなく再起動しています。再起動の度にインポートを最初からやり直して、無限地獄に陥っている可能性もあり、真にどの程度のスピードでインポートできるのかは不明です。
万枚規模の大量の写真を一度にインポートするのはやめたほうがいいのかもしれません。
大量インポート後は、PhotonixではTimeline/Album/Mapと検索機能を使って目的の写真を探すことになりますが、万枚規模の写真を探すのは、Photonixの検索機能ではとても無理ゲーと思えます。
これから新たに投入する写真はAlbumを作りながら整理していけばいいのでしょうが、過去の大量写真を1からAlbumを作っていくのは気が遠くなる話です。
あまり大量でない写真をアルバムなんか作らずに写ったものを言葉で検索して使っていくっていうのがよさそうです。
おわりに
Photonixはちょっとさわっただけだけど、大量の既存写真をインポートしてアルバムを作って整理するのはかなり大変そうに思えます。
なんでもかんでもPhotonixでやるのではなく、docker-composeのvolumeで指定する写真ディレクトリをPhotoPrism等の他の写真サーバと共用させることにより、それぞれの写真サーバの得意分野を使っていくというのが正しい使い方なのかも。