世界を動かす技術を、日本語で。

HNに聞く: ローカルAIを用いたセルフホスティングの写真ライブラリの2025年スタックは何ですか?

329日前

概要

写真管理システム の自作プロジェクトに関する相談 ローカル実行・プライバシー重視 の要件 顔認識・自動キャプション・自然言語検索 の実現方法 EXIF・顔認識・ベクトル検索 の統合アプローチ 実践的な ツール・体験談・ベストプラクティス の紹介

家族写真管理システム自作のリアルな知見と推奨ツール

  • ローカル処理 重視のため、クラウド依存を排除した構成推奨
  • OllamaLLaVA は、写真の内容理解やキャプション生成に有効な選択肢
  • ChromaDB などのベクトルDBは、写真の意味的検索や類似画像探索に最適
  • face_recognition (Pythonライブラリ) は、ローカルでの高精度な顔認識に定評
    • 顔特徴量を NumPy配列 で保存し、IDと紐付け可能
  • EXIF情報 (撮影日時・場所等)は、piexifexifreadで効率的に抽出
  • 構造化メタデータ (EXIF)と 意味情報 (ベクトル埋め込み)は、
    • 統一的なDBスキーマ (例:MongoDBやSQLiteのJSONフィールド)で管理推奨
  • 検索体験 向上のため、
    • 自然言語クエリ をLlamaIndexやLangChainでベクトル化し、ChromaDBへ問い合わせ
    • 顔ID・日時・場所 の絞り込みも同時に適用できる設計が理想
  • UI/UX は、
    • StreamlitGradio で迅速なプロトタイピングが可能
    • タグ付け・修正・家族メンバー登録 の手動編集機能も重要
  • モデル管理 は、
    • Ollama でLLaVAやMiniGPT-4などのモデルをローカル運用
    • 顔認識モデル は、既存の学習済み重みを活用しつつ、必要に応じて家族写真で再学習
  • パフォーマンス面 では、
    • 画像のサムネイル生成特徴量キャッシュ で高速化
    • バッチ処理 による初期登録・再インデックス化の効率化
  • プライバシー保護 の観点では、
    • データ暗号化アクセス制御 (ローカルユーザー限定)を徹底
  • 実際の運用で気づいたポイント
    • 顔認識は「似ている家族」間で誤認識が発生しやすい
    • キャプション生成は、背景や人物名の特定が苦手な場合も多い
    • 手動での タグ修正・誤認識訂正 機能は必須
    • 長期運用では バックアップバージョン管理 も忘れずに

EXIF・顔認識・ベクトル検索の統合設計のコツ

  • 写真1枚ごとに統一的なメタデータ構造 を設計
    • 例:
      • photo_id
      • exif: 撮影日時・GPS等
      • faces: 顔IDリスト+顔特徴量
      • captions: 自動生成キャプション
      • embedding: ベクトル埋め込み
  • ChromaDB 等のベクトルDBには、
    • embeddingmetadata(JSON形式でEXIF・顔ID・タグ等)を格納
  • 検索ロジック は、
    • 自然言語クエリ→ベクトル化→ベクトル検索(意味的類似度)
    • 追加で フィルタ条件 (例:顔ID=家族A、撮影年=2023)を適用
  • 顔ID管理 は、
    • 家族ごとに 一意なID を割り当て、顔特徴量のクラスタリングで新規登録を検知
  • メンテナンス性 を考慮し、
    • メタデータの 再スキャン・再インデックス 機能を実装
    • 手動修正 がDBに即時反映される仕組みも重要

体験談・学び・ベストプラクティス

  • 最初から完璧を目指さず、段階的に機能追加 するアプローチが現実的
    • まずは「顔認識+EXIF抽出」→「キャプション生成」→「自然言語検索」
  • 家族の協力 を得て、顔認識のラベル付け作業を効率化
  • UIはシンプルさ重視、家族が迷わず使える設計を心がける
  • 検索結果の説明性 (なぜこの写真がヒットしたか)をUIで明示
  • プライバシー重視 のため、ネットワーク接続を遮断したPCでの運用も有効
  • モデルやDBのバージョン管理 を徹底し、将来の拡張に備える
  • コミュニティ事例 (GitHub, Reddit, Hacker News等)を積極的に参考にする姿勢が学びを加速

まとめ Ollama, LLaVA, ChromaDB, face_recognition などの組み合わせで、 ローカル・プライバシー重視の家族写真管理システム は十分実現可能。 段階的開発・手動修正機能・メタデータ統合設計 が成功の鍵。 実践者の体験談やコミュニティ知見 を積極的に活用し、 自分だけの最高の写真探索体験 を作り上げてください。

Hackerたちの意見

あんまり興味ないかもしれないけど、Enteは僕にとってほとんどの条件を満たしてるよ。顔認識とAIベースのオブジェクト検索が標準で使えるし、オープンソースのサーバーを制限なしで自分でホスティングできるんだ。彼らが使ってるモデルは君のプロジェクトに役立つかもしれないよ。

彼らの料金ページには何も書いてないみたいだけど、サーバーを自分でホスティングして写真も扱う場合、Enteにお金を払う必要あるのかな?(「S3互換のオブジェクトストレージ」)

Enteの自ホスティングの提案はちょっと変だね。なんで自分でホスティングする写真をエンドツーエンドで暗号化したいんだろう?ただ面倒になるだけな気がする。

Enteはすごい提案だね。なんで今まで聞いたことがなかったのか不思議だけど、私が探しているものには合わないと思う。でも、ソフトウェアが完全にオープンなのはすごいよね。

Immichも結構いい感じだよ。https://immich.app/

これだね。面白いプロジェクトだし、FLOSSプロジェクトがこんなに高品質だなんて信じられない。僕の中ではPostgresと同じレベルだよ(ただ、こっちは小さいプロジェクトだけどね)。

今使ってるのはImmichだよ。SynologyのDockerコンテナで動かしてる。顔認識の作業をするために、ノートパソコンで別のDockerコンテナを立ち上げるのがすごく便利だった。Synologyだと時間がかかりすぎるからね。もうGoogleやAppleに自動アップロードはしてないよ。今のところ、すごく気に入ってる。まだ100%移行はしてないけど、Synologyの写真アプリでアップロードしてるから。Immichはもっと洗練された機能的なインターフェースを提供してくれる。

家のサーバーでimmichを約1年使ってるけど、ほとんどメンテナンス不要で、更新もすごく簡単。クライアントのモバイルアプリがサーバーに更新があると(さりげなく)通知してくれるんだ。UIもすごく洗練されてて、機能も安定してるから、オープンソースだなんて信じられないよ。

Immichを数年間使ってるけど、めっちゃ良いよ。ちょっとした粗さはあるけど、最初の安定版リリースで大体解消されると思う。

こんなのを個人的に作ってるんだけど、今はSentenceTransformerモデルを使ってファイルを分割してる。キャプションにはblipを使ってて(「バンフでの家族旅行、2025年2月」みたいな)、顔検出にはmtcnnとInsightFaceを使ってる。インデックスにはキャプション、顔の埋め込み、EXIFメタデータ(日付、GPS)を保存してるから、「去年の冬にバンフでの写真を見せて」みたいなクエリができるんだ。今はChromaDBを統合して、検索を速くする作業をしてる。最終的には、インデックスをこんな感じで保存する予定だよ:{ "filename": "/Vacation/Banff/Wife.jpg", "chunk_id": 0, "text": "2025年2月のバンフでの家族", "caption_embedding": [0.1, 0.2, ...], "face_embeddings": [{"name": "NT", "embedding": [0.3, 0.4, ...]}, ...], "exif": { "DateTimeOriginal": "2025:02:15", "GPSCoordinates": "18.387, -65.992" } } それから、これらのインデックスを検索するためのUI(Spotlight Searchみたいな)も作ったよ。コードは進行中だけどね: https://github.com/neberej/smart-search

今、photoprismを使ってるんだけど、ちょっと遅いんだよね。顔認識が結構見逃すし、自動クラスタリングは最初はうまくいくけど、数千の顔をタグ付けしたら実装が止まっちゃって、バックグラウンドワーカーが1つのCPUコアを使い続けて何時間も動いてる。開発者が外部からの貢献を受け入れるのにすごく消極的で、それが多くの好奇心旺盛な人たちを遠ざけちゃってる。Immichはその逆みたい。すごく早く進んでて、多くの貢献者がいるけど、たまにバグが出るし、セットアップも面倒くさい。でもAI機能は100倍強力だよ。ただ、UIはphotoprismの方が好きかな。両者のいいとこ取りの中間的なものがあればいいのに。

Immichは平均して2〜3週間ごとに開発版をリリースしてて、4〜6ヶ月ごとに大きなアップデートがあるけど、安定版に近づいてるからペースも少し落ちるはず。セットアップは正直、かなり標準的だと思うよ。

写真管理の面についてはよくわからないけど、gemma3(4bと12b)をローカルでollama経由で動かした経験はすごく良かったよ。gemmaを使って写真を処理したり、説明を得たり、写真についての質問に答えたり(例えば、「この写真に自転車はある?」みたいな)してた。顔認識には試してないけど、もし1枚の写真で誰かを特定してたら、その人が別の写真にもいるかどうか教えてくれると思う。ただ一つ注意点があって、何千枚もの写真を処理する場合、全部処理するのに時間がかかるよ(ハードウェアや写真のサイズによるけど)。顔やバウンディングボックスをopencvみたいなもので最初に抽出してからgemma3に渡す処理パイプラインを作るのもいいかも。もしオープンソースにすることに決めたら、リポジトリのリンクを教えてね。

経験をシェアしてくれてありがとう、nico!すごく役立つよ。顔検出のためにOpenCVを使って処理パイプラインを作るアイデアは素晴らしいね。思いつかなかったよ。gemmaをollamaと一緒に使うのをぜひ検討してみるよ。そして、オープンソースにするところまで行ったら、ここにリンクを投稿するね!

自己ホスティングではないけど、https://ente.io/ はE2E暗号化されたクラウドストレージとローカルAIを持つ独立した商業ソリューションだよ。(編集:どうやら自己ホスティングもできるみたい)

実際、自己ホスティングできるよ。https://help.ente.io/self-hosting/

NextcloudをDockerで、RecognizeとMemoriesアプリを使って約1年半運用してるよ。2018年のリファービッシュされたDell Precisionタワーで動かしてる。docker composeを使って、ハードウェアトランスコーディング用のgo-vodや、クライアントへのプッシュ通知を処理する別のNextcloudインスタンス、キャッシュ用のredisなどのサポートコンテナを含めてる。もっと詳しいことや注意点があればシェアできるよ。先週、再スキャンを始めたんだけど、バックグラウンドジョブがキューに積まれて、cronで1日2〜3回呼ばれる感じ。Recognizeは1日あたり10,000〜20,000枚の写真を処理してて、いい結果が出てる。父のノートパソコンにデスクトップクライアントをインストールして、これまで蓄積してきた家族のハードドライブを全部アップロードできるようにしたんだ。クライアントはアップロード後にディスクスペースをきれいにしてくれるから、私のセットアップには大きな利点だよ。父は以前OneDriveクライアントを使ってたから、このプロセスをすぐに理解できたみたい。Nextcloudには、写真や動画を自動アップロードできる decentなモバイルクライアントもあって、最近は義母が7年前のiPhoneからメディアをアップロードするのを手伝ったよ。

私も似たような構成で、外付けハードドライブに接続したPi 4を使ってる。時々他のハードドライブにオフロードしてるよ。モバイルアプリは、家のネットワークに接続してるときに特定のフォルダを自動同期する。パフォーマンスは飛び抜けて良いわけじゃないけど、主にバックアップソリューションが必要だからね。あなたが言ってたアプリもチェックしてみるよ。もっとセットアップの詳細をシェアしてもいいよ。なんで2つのインスタンスを運用してるの? 編集:なるほど、Memoriesアプリのためかな。

かなり深い話だね。セマンティックサーチにはCLIPとコサイン類似度で十分だよ。spacecadetが言ってたSmolVLM(2)は面白そうだけど。自分では顔認識を統合してないけど、[deepface]はかなり完成度が高そうだったよ。[photofield]では高速レンダリングにもっと注力してた(興味があれば簡単な[explainer]があるよ)。でも、CLIPを使った基本的なセマンティックサーチでも、思ってた以上にいい感じに動いてる。ベクターデータベースはクールだけど、もっとクールなのはfloat配列をsqliteに書き込むことだね :) [deepface]: https://github.com/serengil/deepface [photofield]: https://github.com/SmilyOrg/photofield [explainer]: https://lnar.dev/blog/photofield-origins/

ちょっと話が逸れるけど、昔からAppleにTime Machineやパーソナルクラウドを作ってほしいと思ってた。データが自分のプロパティ内で保存・処理されるやつね。長期保存用のクラウドバックアップやソフトウェアアップデートはサブスクリプションベースで提供する感じで。機能については、スクリーンキャプチャ用のタグがないのが不思議。たくさん作ったから、まとめたいんだよね。

それは、元のApple TV(黒いパックのやつじゃないやつ)に似てるね。ハードドライブがあって、基本的にFront Rowを動かしてたやつ(テレビで写真を見るとか)と、昔のApple Time Capsuleを組み合わせた感じ。

写真ライブラリアプリにとって、本当に価値のある機能は、非常に似ているか同一の写真を識別して、どれが「ベスト」かを決めて、残りを捨てる提案をしてくれるものだと思う。家族のポーズを撮った4枚の写真とか、WhatsAppで共有してからギャラリーに戻した派生写真とか、無駄にストレージを使ってる気がするし、私だけじゃないって分かってる。

そうだね。たくさんの「カリング」ソフトがあるけど、標準的な写真整理アプリにとっては良い機能になると思うよ。 https://imagen-ai.com/ https://aftershoot.com/

ImmichとPhotoPrismの両方にこの機能があるよ: https://immich.app/docs/administration/system-settings#dupli... https://docs.photoprism.app/user-guide/library/duplicates/