たくさんの写真の中からうちの子 (猫) をみつけよう ! 〜機械学習と Amazon Elasticsearch Service で類似画像検索

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

大渕 麻莉

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

おそらく猫好きのみなさまは、自分の猫の写真だけではなく、公園や道ばたで見かけた猫の写真や猫カフェで撮った写真、はたまたインターネットで見つけたかわいい猫の写真など、様々な猫の写真をお持ちなのではないでしょうか。そんなみなさまが突然、「あなたの猫写真コレクションの中から、あなたの猫の写真だけをピックアップしなさい !」と謎の組織から言われたらどうしましょう。写真を 1 枚ずつチェックして仕分けるという途方もない作業をしなければならないのでしょうか ?

今回の記事では、いざそんな時が来てもあわてなくてすむように、たくさんの写真の中からうちの子 (に似ている猫) の写真を見つける方法をご紹介します。

手法としては機械学習を使うのですが、機械学習というと、以前 こちらの記事 でご紹介したような画像分類を思い浮かべる方もいらっしゃるかもしれません。しかし、画像分類モデルを作成するには、あらかじめうちの子の写真とそれ以外の子の写真を分類してラベルづけしておく必要があり、「うちの子の写真を見つけるためにうちの子の写真を (自力で) 見つける」というニワトリたまご的なイケてない感じになってしまいます。そこで、今回は類似画像検索のアプローチを考えます。

流れとしては、学習済みの機械学習モデルを使って画像を特徴ベクトルに変換して Amazon Elasticsearch Service にベクトルを登録し、k 近傍法 (k-NN) 類似検索エンジン を使って検索を行う、となります。機械学習モデルを使っていますが、機械学習で猫の顔を認識しているわけではなく、写真に写っているもの全体の特徴を表す特徴量を抽出するために使っています。

こちらは、今回作成する類似画像検索システムの概念図です。2 つのサービスしか出てこないし、ものすごく簡単な気がしてきませんか ?

img_elasticsearch-your-cat_01

今回は以下の 3 ステップで類似画像検索をやってみます。

  • ステップ 1:Amazon SageMaker ノートブックインスタンスの起動
  • ステップ 2:Amazon Elasticsearch Service環境のセットアップ
  • ステップ 3:画像を特徴ベクトルに変換しAmazon ESに登録 & うちの子の写真を検索 !

サンプルデータとして、こちらの猫さんたちにご協力いただきました。

img_elasticsearch-your-cat_02

本記事で使用するデータセットとサンプルノートブックはこちらからダウンロード可能です。こちらの zip ファイルをダウンロードし、解凍しておいてください。Image.zip と visual_search_es.ipynb の 2 つのファイルが入っています。

2021/2/22 (月) 開催決定 !

AWS Nyantech #2 - たくさんの写真の中からうちの子 (猫) をみつけよう !


この記事の内容を試してみたいけど、自分ひとりでできるか不安だな…と感じられた方に朗報です!
2021 年 2 月 22 日にこの記事の内容のハンズオン (Nyands-on) イベントを開催予定です。ぜひご参加ください!
 

 1. ステップ 1:Amazon SageMaker ノートブックインスタンスの起動

本ハンズオンでは、サンプルノートブックを実行する環境として Amazon SageMaker のノートブックインスタンスを利用します。以下の手順で Amazon SageMaker ノートブックインスタンスを起動します。
 
  1. AWS マネジメントコンソールにログインします。ログイン後、画面右上のヘッダー部のリージョン表示が [東京] となっていることを確認します。
    もし [東京] となっていない場合はリージョン名をクリックして [東京] に変更してください。(他のリージョンを使いたい場合は、Amazon SageMaker と Amazon Elasticsearch Service が使える別のリージョンを選択しても構いません。その場合、以降のリージョンをすべてそのリージョンに読み替えてください)

  2. AWS マネジメントコンソールの画面左上にある [サービス] をクリックしてサービス一覧を表示させ、[Amazon SageMaker] を選択してください。(画面上部の検索窓に "sage" などと打ち込むことで、サービスを絞り込むことが可能です)。Amazon SageMaker の画面を開いたら左側のメニューから [ノートブックインスタンス] を選択し、 [ノートブックインスタンスの作成] ボタンをクリックします。

  3. “ノートブックインスタンス名“ に任意の名前を設定してください。そのほかの設定はデフォルトの設定にしておきます。

  4. “IAMロール“ は、プルダウンメニューから [新しいロールの作成] をクリックしてください。

  5. “指定するS3バケット”[任意のS3バケット] を選択して [ロールの作成] をクリックしてください。

  6. 画面を一番下までスクロールし、[ノートブックインスタンスの作成] をクリックしてください。数分でノートブックインスタンスのステータスが InService になります。

7. ノートブックインスタンス一覧から、いま作成したノートブックインスタンス名をクリックして ”アクセス許可と暗号化” の部分にある ” IAM ロール ARN” をコピーしておいてください。Amazon Elasticsearch Service セットアップの中でこの ARN を使用します。

img_elasticsearch-your-cat_03

クリックすると拡大します


 2. ステップ 2:Amazon Elasticsearch Service 環境のセットアップ

 2-1. Amazon ES のドメイン作成

  1. AWS マネジメントコンソールにログインします。
    ログイン後、画面右上のヘッダー部のリージョン表示が [東京] となっていることを確認します。もし [東京] となっていない場合はリージョン名をクリックして [東京] に変更してください。

  2. AWS マネジメントコンソールの画面左上にある [サービス] をクリックしてサービス一覧を表示させ、[Elasticsearch Service] を選択してください。(画面上部の検索窓に "elasticsearch" などと打ち込むことで、サービスを絞り込むことが可能です)
    Elasticsearch の画面を開いたら [新しいドメインの作成] ボタンをクリックして、ドメイン作成画面に進みます。

  3. "Step 1: デプロイタイプの選択" において、"デプロイタイプの選択"[開発およびテスト] を選択します。バージョンは変更せず、そのまま [次へ] を押してください。

  4. "Step 2: ドメインの設定" で、"Elasticsearch ドメイン名""workshop-visualsearch" と入力します。それ以外の箇所は変更せずに [次へ] を押してください。

  5. "Step 3: アクセスとセキュリティの設定" で、"ネットワーク構成"[パブリックアクセス] に設定します。
    続いて "細かいアクセスコントロール" で、[マスターユーザーの作成] を選択してください。ここで設定するマスターユーザーのアカウントは、Amazon ES 上の可視化ツール Kibana にログインするために使われます。
    インストラクションに従って任意の マスターユーザー名 および マスターパスワード を入力してください。マスターユーザー名は 1~16 文字の間で設定する必要があります。またマスターパスワードは 8 文字以上、かつ大文字、小文字、数字、および特殊記号をそれぞれ一つずつ含む形で入力してください。ここで設定したユーザー名、パスワードは ステップ 3 で使用します。

6. 次にアクセスポリシーの項目を設定します。こちら にアクセスしてご自身の IP アドレスを確認してください。続いて "ドメインアクセスポリシー"[カスタムアクセスポリシー] を選択し、その下の項目で [IPv4 アドレス] を選びます。その右の空欄に、先ほど確認した自身の IP アドレスをそのまま入力し、その右を [許可] に設定します。続いて、[要素を追加] のリンクをクリックして、[IAM ARN] を選びます。その右の空欄に、ステップ 1 でコピーした “IAM ロール ARN” を貼り付けし、その右を [許可] に設定します。ここまで設定したら、画面一番下の [次へ] を押してください。

img_elasticsearch-your-cat_05-02

クリックすると拡大します

7. "Step 4: 確認" で、これまでの設定内容を眺めて、特に問題がなければ画面右下の [確認] を押してドメインを作成してください。ドメイン作成には 15 分程度かかります。

8. 作成されたドメインの “エンドポイント” に記載されている URL のうち、[search-workshop-…amazonaws.com] までのドメイン名の部分をコピーしておいてください。「ステップ 3:画像を特徴ベクトルに変換しAmazon ESに登録 & うちの子の写真を検索」で使います。

img_elasticsearch-cat_05

クリックすると拡大します

 2-2. Amazon ES ロールの作成

  1. AWS マネジメントコンソールの画面左上にある [サービス] から [Amazon Elasticsearch Service] のページを開いてください。

  2. Amazon ES のダッシュボード画面上で、先ほど作成したドメイン [workshop-visualsearch] をクリックします。
    ドメインの詳細が表示されたら、"Kibana" の横にある URL をクリックしてください。URL が表示されていない場合はドメインがまだ作成中ですので、もう少し待ちます。
    URLをクリックするとKibana のログイン画面が表示されますので、ドメイン作成時に指定したマスターユーザーとマスターパスワードを入力してください。

  3. ログイン後の画面では、[Explore on my own] を選択します。続いて画面左側の三本線マークをクリックしてメニューを表示し、[Security] をクリックします。

4. "Create Roles" の下にある [Create new role] をクリックして、ロール管理画面に進みます。

img_elasticsearch-your-cat_06

クリックすると拡大します

5. "Name""workshop_visualsearch_role" と入力してください。

img_elasticsearch-your-cat_07

クリックすると拡大します

6. 続いて下にある [Cluster permissions] を設定します。プルダウンメニューから [cluster_composite_ops] を選択します。続いてもう一度プルダウンメニューから [cluster_all] を選択します。

これらの権限は、クラスターの情報を読み取るためのもので、Open Distro 側であらかじめ定義されているものです。詳細を知りたい方は こちら をご確認ください。これによって、こちらの図のような状態になります。

img_elasticsearch-your-cat_08

クリックすると拡大します

7. 続いて下にある [Index permissions] を設定します。”Index” “*” を入力し、プルダウンメニューから [crud] [create_index] [manage] を選択してください。これにより、こちらの図のような状態になります。

今回のハンズオンでは手順を簡易化するために “*” を指定しましたが、本番利用する場合は、実際に使用するインデックス名を指定してください。

img_elasticsearch-your-cat_09

クリックすると拡大します

8. 画面の一番下までスクロールして、[Create] をクリックします。

 2-3. Open Distro ロールと IAM ロールの紐付け

1. workshop_visualsearch_role の画面で [Mapped users] を選択し、[Map users] をクリックしてください。

img_elasticsearch-your-cat_10

クリックすると拡大します

2. “Users” のプルダウンメニューから自分のユーザー名を選択し、”Backend roles” には、Amazon SageMakerノートブックインスタンス作成の手順でコピーした IAM ロール ARN を貼り付けてください。

img_elasticsearch-your-cat_11

クリックすると拡大します

3. 画面の右下にある [Map] をクリックしてください。


 3. ステップ 3:画像を特徴ベクトルに変換しAmazon ESに登録 & うちの子の写真を検索 !

1. ステップ 1 で起動した Amazon SageMaker ノートブックインスタンスを開いてください。(ノートブックインスタンス一覧画面から [Jupyter を起動] をクリック)

2. Jupyter の画面の右上にある [Upload] をクリックして、ダウンロードしておいたデータセットとノートブックをアップロードしてください。アップロードしたいファイルを選択するとファイル名の右側に青い [Upload] ボタンが表示されるのでそちらをクリックします。
ファイルサイズが大きいため、データセットのアップロードには少し時間がかかります。青い [Upload] ボタンのクリックを忘れるとファイルがアップロードされないのでご注意ください。

img_elasticsearch-your-cat_12

クリックすると拡大します

3. こちらはデータセットとノートブックをアップロードした状態です。visual_search_es.ipynb をクリックしてノートブックを開いてください。

img_elasticsearch-your-cat_13

クリックすると拡大します

4. ノートブックに記載された説明を読みながら、セルを上から順に実行してください。実行したいセルをクリックして選択してから Ctrl+Enter で選択したセルを実行できます。

こちらの画像は、左上の写真をキーにして類似画像を検索した結果です。違う子の写真も混ざっていますが、同じ子を含む写真をピックアップすることができました。

img_elasticsearch-your-cat_14

 4. リソースの削除

使用したリソースの中には、削除しない限り課金が続くものがあります。課金を止めるためには、以下の手順でリソースの削除を行います。削除したリソースは元に戻せないのでご注意ください。

 4-1. Amazon SageMaker のノートブックインスタンスの停止と削除

ステータスが InService になっているノートブックインスタンスをいきなり削除することはできないため、ノートブックインスタンスをまず停止させ、その後削除します。

ノートブックインスタンスは停止の状態から再度起動させることが可能ですが、一旦削除してしまうと同じノートブックインスタンスを使用することはできず、保存していたデータなども全て削除されますのでご注意ください。

Amazon SageMaker コンソールの左側のメニューから「ノートブックインスタンス」をクリックし、削除したいノートブックインスタンスを選択します。

上にある [アクション] から [停止] を選択し、ノートブックインスタンスのステータスが Stopped になったら再度 [アクション] から [削除] を選択するとノートブックインスタンスを完全に削除することができます。

img_elasticsearch-your-cat_15

クリックすると拡大します

 4-2. Amazon Elasticsearch Service ドメインの削除

Amazon ES のコンソールにアクセスし、ドメイン一覧から今回作成したドメインをクリックします。

アクションのプルダウンメニューから [ドメインの削除] をクリックします。すると ”ドメインの削除” 画面が表示されるので、ドメインの削除 のチェックボックスをチェックして [削除] をクリックします。


 5. まとめ

今回は、学習済みの機械学習モデルを使って画像を特徴ベクトルに変換し、Amazon Elasticsearch Service で k-NN を使った類似ベクトル検索を行うことで、うちの子 (に似た猫) の写真を検索する方法をご紹介しました。

検索精度を上げるために写真の撮影条件 (明るさ、被写体の大きさ、ホワイトバランスなど) をそろえる、画像を特徴ベクトルに変換するアルゴリズムを変える、特徴ベクトルの次元を増やすなど色々と工夫してみていただければと思います。


 6. Special Thanks ! & 参考情報

Special Thanks!
サンプルデータは、AWS の猫好きメンバーの協力で作成しました。
本記事は機械学習ソリューションアーキテクトの上総の協力のもと執筆しました。

参考情報
MXNet Gluon Model Zoo »
Amazon Elasticsearch Service 開発者ガイド (KNN) »

筆者プロフィール

photo_ohbuchi

大渕 麻莉

アマゾン ウェブ サービス ジャパン株式会社 機械学習ソリューションアーキテクト。
組込みソフトウェア開発から画像処理アルゴリズム開発を経てクラウドに到達し、2019
年にアマゾン ウェブ サービス ジャパン株式会社に入社。主に製造業のお客様の機械学習導入・運用の技術サポートを担当。
脳内 CPU の半分が猫のことで占められており、視界に入るすべての生き物がうちの猫に見えるという日々を過ごしている。

AWS のベストプラクティスを毎月無料でお試しいただけます

さらに最新記事・デベロッパー向けイベントを検索

下記の項目で絞り込む
絞り込みを解除 ≫
フィルタ
フィルタ
1

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

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