LoginSignup
18
11

More than 1 year has passed since last update.

Amazon Rekognition Custom Labels を使って自分ちの猫を見分ける!

Last updated at Posted at 2020-01-01

気づくと大量にある、猫の写真

猫を飼っているみなさま、こんにちは。
猫の写真よく撮りますよね。スマホとかにたくさん溜まってますよね。

猫が複数おうちにいる場合、撮った写真に写っているのがどっちの猫なのか区別してタグでも打っておきたい、と思うことがあると思います(ないこともあります)。世の中には自動タグ付け機能がある画像ビューアもありますが、たいていは写っているのが人間なのか猫なのかを区別するくらいで、みなさまのおうちのミケ(仮)とタマ(仮)を見分けることはできません。

Amazon Rekognition Custom Labels というサービスを使うと、それぞれの猫が写っている画像と、その画像に写っているのがどの猫なのかを示す情報を用意するだけで、自動猫見分けモデルを作ることができるのです。モデルができたら、画像をそのモデルに入力することで、写真に写っている猫がどの猫なのかを即座に知ることができます。

Amazon Rekognition Custom Labels とは

まず、AWS の AI サービスである Amazon Rekognition というのは、コンピュータビジョンやディープラーニングの専門知識がなくても、AI を使って画像や動画を分析できるサービスです。AWS が用意した API サーバにリクエストを投げることで、画像や動画の分析結果を得ることができます。従来の Amazon Rekognition は、予め決められたものを検知するだけでしたが、Custom Labels という機能が追加され、ユーザ独自のシーン検知(画像分類)や物体検知ができるようになりました。しかも、機械学習の知識やプログラミングが一切不要であるというお手軽さ。

2020年1月現在、Amazon Rekognition Custom Labels は、シーン検知(画像分類)と物体検知に関して、ユーザのデータセットを使ってモデルを作成することができます。
こちらは、シーン検知と物体検知の例です。シーン検知では、画像に対してひとつのラベルを指定することができます。物体検知では、枠と枠に対するラベルのペアを複数指定することができます。

スクリーンショット 2020-01-01 14.40.27.png スクリーンショット 2020-01-01 14.39.59.png
シーン検知の例 物体検知の例

今回は、この Custom Labels のシーン検知のカスタマイズ機能を使って、写真に写っている猫が2匹のうちのどちらの猫なのかを見分けるモデルを作ってみようと思います。

Amazon Rekognition Custom Labels の料金

Custom Labels では、モデルを学習させる時間と、作成したモデルを使って推論を行うための API サーバを稼働させている期間に対して料金が発生します。

リージョン 推論 学習
US East (N. Virginia) $4/hr $1/hr
US East (Ohio) $4/hr $1/hr
US West (Oregon) $4/hr $1/hr
EU (Ireland) $4.44/hr $1.08/hr

料金の詳細は こちら をご参照ください。

前提条件

本記事は、AWS や 機械学習にあまり詳しくない方でも実践できるように書いてみましたが、手順を進める上で最低限必要になりそうな用語の補足と前提条件を記しておきます。

用語

本記事では、AWS のサービス名や機械学習用語がいくつか出てきます。このあたりをおさえておけば、この先の説明で躓くことは少ないかと思います。

用語 概要
AWS CLI コマンドラインシェルでコマンドを使用して AWS サービスとやり取りするためのオープンソースツールです。
Amazon S3 AWS が提供するストレージサービス。
ファイルを保存する際に使用します。
バケット
bucket
S3にデータを保存する際に最上位フォルダとして作成するもの。
学習 機械学習モデルが所望の結果を返すように訓練すること。
推論 学習させたモデルにデータを入力して出力結果を得ること。

実行環境

作成したモデルを使って推論を行う際に AWS CLI を使用します。そのため、AWS CLI を実行できる環境が必要です。AWS CLI のインストール方法は こちら。自分の PC に AWS CLI をインストールできない方は、AWS Cloud9 の環境を立ち上げることで代替できます。AWS Cloud9 は、ブラウザのみでコードを記述、実行、デバッグできるクラウドベースの統合開発環境 (IDE) で、他の AWS サービスと同様に AWS コンソールからアクセスできます。

猫を見分けるモデルを作る

それでは、AWS マネジメントコンソールを操作して猫を見分けるモデルを作っていきましょう。
以下のような流れで実施していきます。
スクリーンショット 2020-01-02 8.58.57.png

Amazon Rekognition Custom Labels のコンソールにアクセス

まずは Web ブラウザから AWS のマネジメントコンソールにログインします。ブラウザは、Chrome か Firefox を使用します。IE や Safari など他のブラウザだとコンソールのレイアウトが崩れる可能性があります。サービス検索窓に reko と入力すると、Amazon Rekognition が候補として出てくるのでクリックします。
スクリーンショット 2020-01-01 13.53.04.png

Amazon Rekognition のコンソールが表示されました。ここで、以下の2つをチェックしてください。

  • リージョン(画面右上の表示)がバージニア北部(N. Virginia)になっている
  • 言語設定(画面左下の表示)が English (US) になっている (2020/8/2 追記:日本語設定で問題なくなりました)

別のリージョンや言語設定になっている場合は、オレンジ色の枠で囲んだ部分をクリックして設定を変更します。これらの確認が完了したら、画面左上の Use Custom Labels をクリックします。
(オレゴンやオハイオのリージョンでも Custom Labels を使用可能ですが、本記事ではバージニア北部で説明します)

スクリーンショット 2020-01-01 13.55.20.png

Amazon S3 バケットの作成

初めて Custom Labels を使用する場合、このような画面が表示されます。Amazon Rekognition がアクセスできる Amazon S3 バケットを作りましょう、と言っているので、オレンジ色の Create S3 bucket をクリックします。
スクリーンショット 2020-01-01 14.26.46.png

このような画面が表示されたら、オレンジ色の Get started をクリックします。
スクリーンショット 2020-01-01 14.02.24.png

プロジェクトの作成

Amazon Rekognition Custom Labels のプロジェクト作成画面が表示されました。ここで、Project name と書いてあるテキストボックスに任意のプロジェクト名を入力し、オレンジ色の Create project をクリックします。
スクリーンショット 2020-01-01 14.03.16.png

問題なくプロジェクトが生成されると、このような画面が表示されます。まだ何もモデルを作成していないので、Models の中は空っぽです。
スクリーンショット 2020-01-01 14.06.29.png

データセットの準備

プロジェクトが作成できたら、次はモデルの学習に使用するデータセットを準備します。今回は写真に写っている猫がどの猫なのかを見分ける画像分類モデルを作るので、猫が1匹のみ写っている画像と、その猫がどの猫なのかを区別するためのラベル情報が必要です。もし、複数の猫が写っている写真に対して、すべての猫を見つけたい場合は画像分類モデルではなく、物体検知モデル(対象の猫を枠で囲んでラベルを付ける)を作成します。
Custom Labels で使用する画像は、サイズが 4096 x 4096 画素以下の JPEG もしくは PNG である必要があります。画像サイズが大きい場合は、小さくリサイズしてください。

画像をフォルダ分けしてローカルPCに保存

画像分類モデルを作る際に、あらかじめラベル名のフォルダを作成して画像を振り分けしておくと Custom Labels の便利機能を使うことができます。今回は、Pino と Jill という2匹の猫のどちらが写っているかを見分けたいので、以下のようなディレクトリ構成でローカルPC に画像を準備しました。なお今回は、各猫の画像を 10枚ずつ、合計 20枚の画像を用意しました。精度を出したい場合は、もっと多くの画像が必要なこともあります。
3匹以上の猫を見分けたい場合は。猫の名前のフォルダを追加してその中に画像を保存してください。

cats
├── pino
│   ├── xxx.jpg
│   └── xxx.jpg
└── jill
    ├── xxx.jpg
    └── xxx.jpg

画像を Amazon S3 にアップロード

フォルダ分けした画像を Amazon S3 にアップロードします。
AWS コンソールで s3 と入力し、出てきた候補の中の S3 をクリックして、Amazon S3 のコンソールにアクセスします。
スクリーンショット 2020-01-01 15.00.47.png

S3 のコンソールに表示されたバケット一覧から、さきほど 作成した custom-labels-console-us-east-1-xxxx という名前のバケットを見つけてクリックします。

このような画面が表示されたら、さきほど ローカルPC に保存したフォルダ(cats)を、図の赤い四角あたりにドラッグ&ドロップします。
スクリーンショット 2020-01-01 15.10.26.png

フォルダをドラッグ&ドロップすると、このような画面が表示されるので、左下にある Upload をクリックします。
スクリーンショット 2020-01-01 15.14.05.png

データセットの登録

AWS コンソールの Custom Labels に戻ります。以下の画面は、Custom Labels のコンソールを表示した直後の画面ですが、こちらで左上にある三本線(オレンジ色の枠で囲んだ部分)をクリックするとメニューが表示されるので、メニューの Datasets をクリックします。
スクリーンショット 2020-01-01 15.39.47.png

このような、データセット一覧の画面が表示されます。ここで、右上にある Create Dataset をクリックします。

スクリーンショット 2020-01-01 15.42.44.png

Dataset name の部分に任意のデータセット名を入れます。今回は cats とします。
スクリーンショット 2020-01-01 15.44.17.png

さきほど S3 にアップロードした画像を登録したいので、Image location は、Import images from S3 bucket を選択します。もし、Amazon SageMaker Ground Truth でラベリングした結果を使う場合は、左上の Import images labeled by SageMaker Ground Truth を選択します。
スクリーンショット 2020-01-01 15.45.28.png

S3 folder location に、さきほど S3 にアップロードした cats フォルダのパスを入力します。このとき、パスは s3://custom-labels-console-us-east-1-xxxx/cats のようなフォーマットで指定します。もし cats フォルダをバケット直下でなく、もっと深い階層にアップロードした場合は、そのパスを指定してください。
図のオレンジ色の枠で囲んだ部分にチェックを入れます。ここにチェックを入れることで、フォルダ分けして画像を S3 にアップロードした際に、フォルダ名が、各フォルダの中にある画像のラベルとして自動設定されます。
スクリーンショット 2020-01-01 15.59.09.png

S3 のパスを入力すると、こちらのように S3 のバケットポリシーを設定するよう案内されます。こちらは、Rekognition から S3 バケットにアクセスするために必要な権限設定となりますが、こちら の手順でバケットを作成した場合は次の手順は不要です。画面の下にあるオレンジ色の Submit ボタンをクリックして、こちら の手順に進みます。既存の S3 バケットに保存した画像を Dataset に登録したい場合は、次の手順を実施します。
スクリーンショット 2020-01-10 16.15.48.png

既存の S3 バケットに保存した画像を Dataset に登録する場合

既存のバケットに保存されている画像を Dataset に登録したい場合は、バケットポリシーの設定が必要です。コンソールに表示されている、以下のバケットポリシー全体をコピーします。

{
    "Version": "2012-10-17",
    "Statement": [
(中略)
            "Action": "s3:PutObject",
            "Resource": "arn:aws:s3:::<BUCKET_NAME>/*",
            "Condition": {
                "StringEquals": {
                    "s3:x-amz-acl": "bucket-owner-full-control"
                }
            }
        }
    ]
}

Web ブラウザの、Dataset 登録画面とは異なるタブで画像をアップロードしたバケットにアクセスし、Permissions -> Bucket Policy を選択し、テキストボックスに先ほどコピーしたバケットポリシーをペーストして Save をクリックします。
スクリーンショット 2020-01-10 16.31.23.png

以上で S3 バケットポリシーの設定が完了です。これを忘れると、モデルの学習をする際にこのようなエラーが出て学習に失敗しますので、既存のバケットを使用する際は必ず設定が必要です。
s3_error.png

Dataset 登録画面に戻り 、右下にあるオレンジ色の Submit をクリックします。

データセット詳細画面

こちらはデータセットの詳細画面です。cats フォルダがこんな感じにデータセットとして登録されました。自動的にフォルダ名からラベル付けがされています。うっかり間違ったフォルダに画像を入れてしまっていたなどでラベルの訂正をしたい場合は、以下の画像の上半分にある Start Labeling をクリックします。そうすると、各画像のファイル名の右側にチェックボックスが表示されるので、ラベルを変更したい画像のチェックボックスをチェックして、上にある Assign Labels をクリックして正しいラベルを選び直します。ラベルを選び直す際は、Select label と書いてあるテキストボックスをクリックするとラベルの候補が表示されるのでそこから選ぶか、新しいラベルを入力します。ラベルの修正が終わったら Exit をクリックします。
スクリーンショット 2020-01-01 16.07.55のコピー.png

これで、データセットの登録が完了しました。

モデルの学習

さきほど 見た、データセットの詳細画面でオレンジ色の Train model をクリックし、以下の手順を行い、オレンジ色の Train をクリックします。

  • Choose project のテキストボックスをクリックすると、さきほど 作成したプロジェクト名が候補に出てくるのでクリック
  • Choose training set のテキストボックスをクリックすると、さきほど 登録したデータセット名が候補に出てくるのでクリック
  • Create test set で Split training dataset を選択

Split training dataset を選択することで、指定したデータセットを学習用と評価用に分割し、学習したモデルの評価を行います。評価用のデータセットを別に用意している場合は、Choose an existing test set を選択してデータセットを指定します。
スクリーンショット 2020-01-01 16.22.15のコピー.png

今回2匹の猫の画像をそれぞれ10枚ずつ用意したデータセットを使用し、学習には 45分ほどかかりました。使用する画像の枚数などによって学習にかかる時間は変わります。

学習結果の確認

Custom Labels のコンソールのメニューから Project を選択すると、プロジェクト名と、そのプロジェクトで作成したモデル名が表示されます。この画面で Status の部分を見ると、学習が正常終了しているのか(TRAINING_COMPLETED)、失敗しているのか(TRAINING_FAILED)などがわかります。モデル名をクリックすると、モデルの詳細画面が表示されます。
スクリーンショット 2020-01-01 16.36.10.png

モデルの詳細画面では、モデルの評価結果や学習に使用したデータセットの情報などを確認することができます。
スクリーンショット 2020-01-01 16.44.45.png

モデルの詳細画面で View test results をクリックすると、モデルの評価結果の詳細を確認することができます。
スクリーンショット 2020-01-01 16.46.08.png

作成したモデルを使って猫を見分ける(推論)

それでは、作成した猫を見分けるモデルを使って、猫を見分けてみましょう。Rekognition Custom Labels は、学習したモデルがデプロイされた推論エンドポイントを作成し、エンドポイントに推論リクエストを投げて推論を実行します。エンドポイントの起動はコンソール、コマンド、SDK から可能です。コマンドを使用する場合は、お持ちの PC に AWS CLI 環境がある方はそちらをお使いいただき、環境がない場合は、AWS のコンソールから AWS Cloud9 サービスにアクセスし、オレンジ色の「Create environment」をクリックして環境を立ち上げると、画面の下側にターミナルが表示されるので、そちらから Rekognition の API を叩くことができます。

コンソールから推論エンドポイントを開始と終了

モデルの詳細画面で「モデルを使用」タブをクリックすると、以下の画面が表示されます。ここで「開始」ボタンをクリックすると推論エンドポイントが起動します。エンドポイントが起動完了するまでに 10分から30分ほどかかります。推論エンドポイントは稼働している期間が課金対象となるため、使用しなくなったら速やかに停止させるのがおすすめです。
スクリーンショット 2021-07-26 19.11.36.png

REST API を使って推論

さきほど見たモデルの詳細画面を下までスクロールすると、「モデルを使用する」という項目があります。ここの「API コード」と書かれた部分をクリックすると、モデルを使用するためのコマンドが表示されます。

スクリーンショット 2021-07-26 19.16.46.png

コマンド名 概要
Start API 作成したモデルを実行するための 推論エンドポイントを起動するコマンド。
コンソールに表示されたコマンドをコピペして実行すればOK。
Detect API 起動した推論エンドポイントにリクエストを投げて推論結果を得るコマンド。
コンソールに表示されたコマンドをコピペし、--image オプション部分を自分の環境に合わせて書き換えてから実行する。
Stop API 推論エンドポイントを停止するコマンド。

Amazon S3 に保存した画像を使う

以下のコマンドの MODEL_ARN の部分をモデルの ARN に置き換えます。MY_BUCKETPATH_TO_MY_IMAGE を画像が保存してある場所に合わせて書き換えます。

$ aws rekognition detect-custom-labels \
  --project-version-arn "MODEL_ARN" \
  --image "{"S3Object": {"Bucket": "MY_BUCKET","Name": "PATH_TO_MY_IMAGE"}}" \
  --endpoint-url https://rekognition.us-east-1.amazonaws.com \
  --region us-east-1

ローカルPC の画像を使う

以下のコマンドの MODEL_ARN の部分をモデルの ARN に置き換えます。
さらに、IMAGE_PATH の部分を画像のパスに書き換えます。カレンドディレクトリにある image.png を指定する場合は、fileb://image.png と指定し、カレントディレクトリの中の img フォルダの中にある image.png を指定する場合は、fileb://img/image.png と指定します。

$ aws rekognition detect-custom-labels \
  --project-version-arn "MODEL_ARN" \
  --image-bytes fileb://IMAGE_PATH \
  --endpoint-url https://rekognition.us-east-1.amazonaws.com \
  --region us-east-1

推論結果は、以下のようなフォーマットで得られます。それぞれの猫である確率が Confidence の項目に記載されています。この推論結果を使って、たとえば、もっとも Confidence が大きい猫の名前を最終的な判定結果とします。

{
    "CustomLabels": [
        {
            "Name": "jill",
            "Confidence": 74.62300109863281
        },
        {
            "Name": "pino",
            "Confidence": 25.376998901367188
        }
    ]
}

[Advanced] デモ環境のサンプルを使って推論する

こちら に、AWS が提供する Custom Labels GUI の操作で Custom Labels で作成したモデルを使った推論を行うことができます。
手順の通りに実行して環境構築が完了すると、CloudFormation の Outputs タブにある URL から以下のような画面にアクセスできます。(初回アクセス時は Cognito のパスワードの変更などが必要です)
Upload ボタンから画像を選択すると、推論結果が画面に表示されます。
スクリーンショット 2020-01-01 17.36.52.png

お片付け

API サーバの停止

立てた API サーバは、使い終わったら停止します。
以下のコマンドの MODEL_ARN の部分をモデルの ARN に置き換えて実行します。

$ aws rekognition stop-project-version \
  --project-version-arn "MODEL_ARN" \
  --endpoint-url https://rekognition.us-east-1.amazonaws.com \
  --region us-east-1

S3 バケットの削除

S3 に保存しているデータに対しても課金されるので、不要な場合はバケットごと削除します。こちら の手順で S3 のコンソールに行き、作成した S3 バケットのチェックボックスにチェックを入れます。チェックを入れた瞬間に右側からニョキッと出てくる画面を✗ボタンで非表示にし、 Delete/削除 ボタンをクリックします。するとテキストボックスが表示されるので、そこに削除したいバケット名を入力し、Confirm/確認 をクリックするとバケットを削除することができます。

AWS Cloud9 環境の削除

REST API を実行する環境として AWS Cloud9 を使用した場合は、AWS Cloud9 の環境を削除する必要があります。AWS コンソールで AWS Cloud9 の環境一覧画面を表示し、削除したい環境を選択して「Delete」をクリックします。

まとめ

以上、Amazon Rekognition Custom Labels を使って、写っている猫を見分けるモデルを作り、作ったモデルを使って実際に猫を見分けることができました。

次は、写真に写っている複数の猫をそれぞれ見分ける物体検知モデルを作ってみたいと思います。

18
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
18
11