Nyantech であの猫のこんな写真を見つけたい

~ マルチモーダル埋め込みモデルを使って類似画像検索をパワーアップ ~

2024-02-19
日常で楽しむクラウドテクノロジー

Author : 大渕 麻莉

うーん・・・なかなかないですねぇ・・・。

ミケ、どうしたにゃ ?

あっ、タマ。いま、タマの笑顔の写真を探しているのですが、なかなか見つからないのですよね。

そもそもそんな写真あるのかにゃ。生まれてこのかた笑った覚えがないにゃ。

いえ、確かにあるはずなんです。ここにある一万枚の写真ストックの中に・・・。

(いつの間にこんなにたくさんの写真を!ミケ、恐ろしい子・・・!)

 はじめに

こんにちは、機械学習ソリューションアーキテクトの大渕です。

以前、こちらの記事 で類似画像検索の手法を使ってたくさんある猫写真の中から自分の猫に似ている猫の写真を見つける方法をご紹介しました。今回は、タマの笑顔の写真を見つけたいというミケの声にお応えして、マルチモーダル埋め込みモデルを使った方法を紹介したいと思います。突然謎の呪文を言われても困ると思われた方、ご安心ください。マルチモーダル埋め込みモデルについては後ほど詳しくご説明します。

今回メインで使うサービスは、さまざまな基盤モデルをAPIから使うことができる Amazon Bedrock と、最近 ベクトル検索機能が一般提供開始となった Amazon OpenSearch Serverless です。以下の画像のような感じで、似ている写真を検索できます。なお、この記事に出てくる猫さんたちの写真は、2022 年の AWS Nyantech というイベントを開催した際に世界中の猫好きの方からいただいたものです。大事に使わせていただいております !

ご注意

本記事で紹介する AWS サービスを起動する際には、料金がかかります。builders.flash メールメンバー特典の、クラウドレシピ向けクレジットコードプレゼントの入手をお勧めします。

*ハンズオン記事およびソースコードにおける免責事項 »

Nyantech ハンズオンシリーズのその他の記事はこちら

選択
  • 選択
  • 機械学習を使って写真に写っている猫を見分けてみよう! ~ 前編 : Amazon SageMaker Ground Truth を使った画像のラベリング ~
  • 機械学習を使って写真に写っている猫を見分けてみよう! 〜中編:Amazon Rekognition Custom Labels を使った機械学習モデルの作成
  • 機械学習を使って写真に写っている猫を見分けてみよう! 〜後編:Amazon SageMaker を使った機械学習モデルの作成
  • たくさんの写真の中からうちの子 (猫) をみつけよう ! 〜機械学習と Amazon Elasticsearch Service で類似画像検索
  • Nyantech とはじめる MLOps 〜学習パイプランを使って効率的に猫を見分ける機械学習モデルを目指そう ! の巻〜
  • 猫の画像を使ってあそぶブラウザゲームを作ろう ! 〜AWS Cloud Development Kit (AWS CDK)で簡単デプロイ〜
  • Nyantech 画像生成選手権 ~ 画像生成 AI を使ってお題に近い猫の画像を生成しよう ! の巻
  • 1 クリックで立ち上がる自分だけの環境で、お猫様の画像生成をやってみた。
  • 1 クリックで立ち上がる自分だけの環境で、お猫様の画像生成をやってみた。- 拡張編 -
  • Nyantech であの猫のこんな写真を見つけたい ~ マルチモーダル埋め込みモデルを使って類似画像検索をパワーアップ ~
  • IoT を使ってお猫様の健康 (体重) をモニタリングしてみた

このクラウドレシピ (ハンズオン記事) を無料でお試しいただけます »

毎月提供されるクラウドレシピのアップデート情報とともに、クレジットコードを受け取ることができます。 


 1. Amazon BedrockとAmazon OpenSearch Serverless をどう使うか

みなさまご存知の ChatGPT の裏側では大規模言語モデル (LLM) と呼ばれる基盤モデルが使われていますが、基盤モデルを API で簡単に使うことができる AWS の機械学習サービスである Amazon Bedrock は、AI21 Labs、Anthropic、Cohere、Meta、Stability AI、Amazon の LLM や画像生成モデルを取り揃えています。

中でも Amazon が提供している Titan という基盤モデルのラインナップの中に Titan Multimodal Embeddings (Titan マルチモーダル埋め込み) というモデルがあり、これが今回の立役者となります。

 1-1. Embeddings (埋め込み) とは

まずは、Embeddings (埋め込み) ってなんなの ? という疑問にお答えしていこうと思います。

こちらに、テキストを埋め込みモデルでベクトルにした際のイメージ図を示します。天気に関するテキストが 2 つと富士山に関するテキストが 1 つあり、それぞれをベクトルに変換して二次元にプロットしました。

右側のプロットを見ると、天気に関するテキスト同士は近くにありますが、富士山のテキストはそれらとは離れてプロットされています。このように、埋め込みによって意味的に近いデータ同士は似たベクトルに変換されるため、ベクトル間の距離が近くなります。この特性を利用して、類似するデータを検索することができます。

画像をクリックすると拡大します

 1-2. Multimodal Embeddings (マルチモーダル埋め込み) とは

次は Amazon Titan で使えるマルチモーダル埋め込みです。

上図はテキスト埋め込みの例でしたが、Titan Multimodal Embeddings は、画像とテキストをまとめてベクトルにすることができます。こちらの図は、Titan Multimodal Embeddings でベクトルを作成するイメージ図です。

画像とテキストの両方、もしくはいずれか一方を入力として推論を行うと、サイズ 1024 のベクトルがひとつ出力されます。

画像をクリックすると拡大します

埋め込みモデルを使ってデータをベクトルに変換できたら、次は距離が近いベクトルを探す「ベクトル検索」の方法を考える必要があります。

今回は Amazon OpenSearch Serverless のベクトル検索機能を使います。Amazon OpenSearch Serverless は、複数の近似 k-NN ライブラリやアルゴリズムに対応しているため、データ量や必要な精度に応じて適切な方法を選択することができます。詳細は こちらの記事こちらのスライド をご参照ください。

ところで、画像とテキストをまとめてベクトルにすることが、ほしい写真を検索することにどう効果があるのでしょうか?百聞は一見にしかず、実際に試して確認していきましょう !


 2. 写真検索アプリのデプロイ

というわけで、以下のような構成の検索アプリのサンプルコードを用意しました。こちらをデプロイしてどのように写真検索ができるかみてみましょう。

この写真検索アプリは AWS CDK と React を使って実装されているため、各種設定をしたのちデプロイコマンドを実行するだけで、みなさまの AWS 環境にアプリをデプロイすることができます。遊び終わったらリソースを削除するのも簡単です。

それでは、以下の手順で写真検索アプリをデプロイしていきます。

 2-1. Step 1 : AWS CDK スタックデプロイ環境の準備

まずは写真検索アプリをデプロイするための環境を準備します。

Docker、Node.js、AWS CLI 実行環境が整っていれば、みなさまが普段お使いの PC から CDK スタックをデプロイすることが可能です。

ご自身の環境を変えたくない場合や、ライブラリの依存関係などでうまくデプロイできない場合は、AWS Cloud9 をデプロイ環境として使うのが便利です。AWS Cloud9 のセットアップは こちらの AWS CloudShell を使う方法 が簡単でおすすめです。

 2-2. Step 2 : サンプルコードを GitHub から取得

次に、Step 1 で準備した CDK スタックデプロイ環境で以下のコマンドを実行して、こちらの GitHub リポジトリ からファイル一式を取得して下さい。

$ git clone https://github.com/aws-samples/image-search-titan-multimodal-cdk

 2-3. Step 3 : 手順に従って AWS CDK スタックをデプロイ

取得したファイル一式の docs/HowToDeploy.md に記載されたデプロイ手順に従って CDK スタックをデプロイして下さい。(CDK デプロイ環境さえあれば) コマンドを 5 つ実行するだけです !

 2-4. Step 4 : 写真検索アプリで遊ぼう !

CDK スタックのデプロイが完了したら、ターミナルの出力ログに表示された「…WebAppDomain…」の URL をブラウザのアドレスバーにコピペして、写真検索アプリで遊びましょう !

この記事では、Titan Multimodal Embeddings の効果を感じられる遊び方を紹介します。そのために、サンプルコードのルートフォルダにある images.zip をローカル PC にダウンロードして解凍して下さい。解凍によって作成された images フォルダの中の写真を検索に使います。

 2-4-1. 写真で写真を検索

まずは指定した写真と似た写真を探す機能を試します。「ファイルを選択」ボタンをクリックして、image_003.jpg を選択して下さい。

茶白の猫さんが表示されたら、青い「Search」ボタンをクリックして下さい。茶白っぽい猫さんたちの写真が表示されたと思います。かわいいですね〜。

画像をクリックすると拡大します

 2-4-2. テキストで写真を検索

次に、テキストによる検索を試してみましょう。

いったん水色の「Clear」ボタンをクリックして、画面を初期化します。

次に、テキストボックスに「white cat」と入力してから「Search」ボタンをクリックして下さい。

ずらっと白猫さんたちが表示されましたね ! いい感じです !

画像をクリックすると拡大します

Titan Multimodal Embeddings は写真とテキストを一緒に指定するとそれらをまとめてひとつのベクトルに変換してくれます。これにより、写真だけをベクトルに変換するよりも、より意図に沿った情報をベクトルに入れ込むことができます。

といいつつ今回のアプリでは、Amazon OpenSearch Serverless のインデックスには、テキストは使わず写真のみを変換したベクトルを登録しているのですが、今回の実験により、検索は写真なしでキーワードだけでもできることがわかりました。「こういう写真が欲しいけど、写真は用意してないんだよな〜」というときは、キーワードだけで検索してみる、なんてことができそうですね。 

ここまでの実験によって、猫のような一般的な被写体であれば、ベクトルにテキストを埋め込まなくてもいい感じに検索してくれることがわかりました。自社製品など、一般的ではない被写体を検索対象にする場合は写真と一緒に製品名などの関連テキストを一緒に埋め込むとよいかもしれません。

 2-4-3. 写真とテキストで写真を検索

最後に、写真とテキストの両方を指定して検索する場合の効果を確認してみます。

いったん「Clear」ボタンをクリックして画面を初期化してから、「ファイルを選択」ボタンをクリックして image_039.jpg の写真を選択してください。ゴージャスな白猫さんが表示されましたね。

次に「Search」をクリックすると、選択した猫さんと似ている白っぽい猫さんたちが表示されました。さらにキーワードを追加してみます。

画像をクリックすると拡大します

続けてテキストボックスに「tongue」と入力して「Search」ボタンをクリックしてください。

先ほどとは表示される猫さんが変わっているのがおわかりいただけたでしょうか ? image_023.jpg の猫さんが追加されていますね。tongue (舌) というキーワードを追加したことで、選択した写真の猫さんに似ているだけでなく、舌を出しているかが重要視された結果になっているようです。つまり、ドンピシャの表情の写真がなくてもベースとなる写真を指定しつつキーワードを追加することで、欲しい写真を検索できるのではないでしょうか。

この気づきをミケに伝えなければ !

画像をクリックすると拡大します

 2-5. Step 5 : リソースの削除

遊び終わったら、不要になったリソースを削除することをおすすめします。今回使用しているサービスのほとんどは使った際に料金が発生する従量課金ですが、Amazon OpenSearch Serverless のみリソースを削除するまで課金が継続発生するため、不要になったら必ず CDK スタックの削除を実行して下さい。

以下のコマンドを実行するとすべてのリソースを削除することができます。コマンドを実行後、リソースを削除するかどうか聞かれたら y を入力して削除を実行してください。

$ npm run cdk:destroy

 3. さいごに

この記事では、Amazon Bedrock で使える Titan Multimodal Embeddings モデルと、Amazon OpenSearch Serverless のベクトル検索機能を使った写真検索アプリをご紹介しました。これらのサービスを活用することで、シンプルな構成で写真検索アプリを作ることができました。また、マルチモーダルの埋め込みを使うことで、テキストのみを検索キーとして写真を検索できるなどその効果をお伝えできたと思います。

この記事が、みなさまの検索機能の強化に役立てば幸いです。

~ 後日談 ~

CDK スタックをデプロイ・・・。カチャカチャカチャ・・・ッターン !

ミケ、何してるにゃ ?

タマの普通の顔の写真を指定しつつ、このキーワードと一緒に検索・・・ッターン !!

・・・聞こえてないみたいにゃ

やりました ! 探してたタマの笑顔の写真が見つかりました !

ミケ談 : タマの爽やかな笑顔を切り取った奇跡の一枚です。

参考情報

Nyantech ハンズオンシリーズのその他の記事はこちら

選択
  • 選択
  • 機械学習を使って写真に写っている猫を見分けてみよう! ~ 前編 : Amazon SageMaker Ground Truth を使った画像のラベリング ~
  • 機械学習を使って写真に写っている猫を見分けてみよう! 〜中編:Amazon Rekognition Custom Labels を使った機械学習モデルの作成
  • 機械学習を使って写真に写っている猫を見分けてみよう! 〜後編:Amazon SageMaker を使った機械学習モデルの作成
  • たくさんの写真の中からうちの子 (猫) をみつけよう ! 〜機械学習と Amazon Elasticsearch Service で類似画像検索
  • Nyantech とはじめる MLOps 〜学習パイプランを使って効率的に猫を見分ける機械学習モデルを目指そう ! の巻〜
  • 猫の画像を使ってあそぶブラウザゲームを作ろう ! 〜AWS Cloud Development Kit (AWS CDK)で簡単デプロイ〜
  • Nyantech 画像生成選手権 ~ 画像生成 AI を使ってお題に近い猫の画像を生成しよう ! の巻
  • 1 クリックで立ち上がる自分だけの環境で、お猫様の画像生成をやってみた。
  • 1 クリックで立ち上がる自分だけの環境で、お猫様の画像生成をやってみた。- 拡張編 -
  • Nyantech であの猫のこんな写真を見つけたい ~ マルチモーダル埋め込みモデルを使って類似画像検索をパワーアップ ~
  • IoT を使ってお猫様の健康 (体重) をモニタリングしてみた

builders.flash メールメンバーへ登録することで
AWS のベストプラクティスを毎月無料でお試しいただけます

筆者プロフィール

大渕 麻莉
アマゾン ウェブ サービス ジャパン合同会社
機械学習ソリューションアーキテクト

組込みソフトウェア開発から画像処理アルゴリズム開発を経てクラウドに到達し、2019 年にアマゾン ウェブ サービス ジャパン合同会社に入社。以来、社内外のイベントで機械学習セッションをしたりサンプルコードを書いたりしながら、お客様の機械学習導入・運用の技術サポートに従事。
脳内 CPU の半分が猫のことで占められており、視界に入るすべての生き物がうちの猫に見えるという日々を過ごしている。 

AWS を無料でお試しいただけます

AWS 無料利用枠の詳細はこちら ≫
5 ステップでアカウント作成できます
無料サインアップ ≫
ご不明な点がおありですか?
日本担当チームへ相談する