Fessで画像ファイルをクロールして検索対象とする場合、従来は画像ファイルが持つメタデータの文字列しか検索対象にできませんでした。 しかし、近年の技術進歩により、マルチモーダル学習モデルを利用して、テキストと画像のベクトルを扱うことが可能になりました。 これにより、画像の内容をテキストで検索することができるようになります。

今回は、Fessがマルチモーダル学習モデルを利用して、画像の内容をテキストで検索する方法をご紹介します。

準備

Fessで画像検索を行うための環境は、GitHub上のcodelibs/docker-multimodalsearchで公開しています。 このリポジトリをクローンして、利用します。

$ git clone --branch v14.15.0 https://github.com/codelibs/docker-multimodalsearch.git
$ cd docker-multimodalsearch

実行にはDocker Composeが必要です。 事前にDocker Desktopなどをインストールし、利用できるようにしておいてください。

セットアップスクリプトの実行

次に、以下のセットアップスクリプトを実行して環境を構築します。

$ bash ./bin/setup.sh

このスクリプトにより、Fessのプラグインがダウンロードされ、実行に必要なディレクトリが作成されます。

画像データの取得

今回は、Open Images Dataset V7で公開されている画像データセットから1000枚の画像ファイルを取得して利用します。 手元に検索対象にできる画像ファイルがある場合は、このダウンロード手順をスキップしてください。

画像のダウンロードには、PythonとFiftyOneモジュールを使用します。

  1. FiftyOneのインストール:

    $ pip install fiftyone
    
  2. 画像ファイルのダウンロード:

    $ fiftyone zoo datasets load open-images-v7 --split validation --kwargs max_samples=1000 -d ./data/fiftyone
    

max_samplesを変更することで、ダウンロードする画像ファイル数を調整できます。

画像ファイルは、data/fiftyone/validation/dataディレクトリに保存されます。

また、FessのDockerコンテナが上記で取得した画像ファイルを参照するために、compose.yamlファイルの以下の部分のコメントアウトを外しておきます。

     - ./data/fiftyone:/home/fiftyone

上記の設定により、FessのDockerコンテナはfile:/home/fiftyone/validation/data/で画像ファイルにアクセスできます。

Fessの起動

Docker Composeを使用してサーバを起動します。

$ docker compose -f compose.yaml up -d

サーバが起動したら、ウェブブラウザでhttp://localhost:8080/adminにアクセスし、Fessの管理画面にログインしてください。

インデックスの更新

画像をベクトルとして検索するためには、検索用のインデックスを更新する必要があります。 以下の手順で行います。

  1. Fessの管理画面で、「システム情報」 > 「メンテナンス」をクリック
  2. 「再インデックス」の「シャード数」を1に変更し、「開始」ボタンをクリック
  3. 左メニューの「ダッシュボード」をクリック
  4. 「fess.yyyymmddHHMM」のようなインデックスの▼をクリックし、show settingsを選択
  1. "knn": "true",が設定されていることを確認します

サムネイルの表示

検索結果を確認する際、画像の内容を視覚的に把握しやすくするため、以下の手順で検索結果にサムネイルを表示する設定をします。

  1. 管理画面で、「システム」 > 「全般」をクリック
  2. 「サムネイル表示」のチェックボックスにチェックを入れる
  3. 「更新」ボタンをクリックして設定を保存する

これで、検索結果にサムネイルが表示されます。

クロール設定の作成

今回は、画像ファイルがFessのDockerコンテナから参照できるパスに存在しているため、ファイルシステムのクロール設定を作成します。

左メニューの「クローラー」 > 「ファイルシステム」で「新規作成」をクリックして file:/home/fiftyone/validation/data/ をクロールする設定を作成してください。

今回は以下の項目を入力しました。

  • 名前(任意の名前)
  • パス

クロール設定を作成後、左メニューの「システム」 > 「スケジューラ」から「Default Crawler」を選択して、クロールを開始してください。

検索結果の確認

クロールが完了したら、検索画面で実際に画像検索を試してみましょう。 例えば、「Red Cars」や「Running dogs」などのキーワードを入力し、期待通りの画像が表示されるか確認してみてください。

* * *

今回は、Fessを使用してベクトル検索で画像を検索するための手順を紹介しました。

ベクトル検索を実現するために、OpenAIのCLIP(Contrastive Language–Image Pre-training)モデルを使用しました。CLIPは、テキストと画像の両方を同じベクトル空間にマッピングすることで、画像の内容をテキストで検索することを可能にします。

これにより、単なるメタデータではなく、画像そのものの内容に基づいた検索が実現します。FessとCLIPを組み合わせることで、より高度な画像検索機能を簡単に導入できるようになります。