【Amazon Rekognition】機械学習を使ってサンタの仕事を楽にしてあげよう!

AWS

2024.12.3

Topics

はじめに

こんにちは、Paseri です。
この記事はNHN テコラス Advent Calendar 2024 の 3 日目の記事です。

時間が過ぎるのはあっという間でもう12月に入り、今年も残り4週間となりました。
世間は仕事納めで忙しいと思いますが、お子さんのいるご家庭では大事なイベントがありますよね。
12月と言えば…「クリスマス」ですね!

「サンタさんは良い子にしている子供のところに来る」という話は誰もが聞いたことのある話だと思います。
では、サンタさんはどうやって数多くいる子供の中から良い子を判断しているのでしょうか?

今回はそんなサンタさんが行っている作業をAWSサービスで再現してみよう!というコンセプトのお話です!

本記事では Amazon Rekognition カスタムラベルを紹介しつつ、実際に構築します。
(※本記事の題材は架空のお話です。直接サンタさんに関係はありませんのでご理解を宜しくお願い致します。)

サービス紹介

〇 Amazon Rekognition とは?
AWSが提供する機械学習を活用した、クラウドベースの画像・動画分析サービスです。
写真の人間の表情や、どこにいるか、何をしているかなどを分析してくれます。

以下の画像は Rekognition のデモ画面です。
既にデモには「Santa Claus」や「Christmas」を判別するラベルが実装されているので以下の様に画像をアップロードすると分析してくれます。

このサービスは事前に学習済みの AI を利用するため、機械学習の専門的な知識が無くても利用できます。

Amazon Rekognition は、高度なコンピュータビジョン機能をアプリケーションに簡単に追加できるクラウドベースのイメージおよびビデオ分析サービスです。このサービスは実証済みの深層学習テクノロジーを利用しており、機械学習の専門知識は必要ありません。
Amazon Rekognition とは – Amazon Rekognition

〇 Amazon Rekognition カスタムラベル とは?
事前に用意されている Amazon Rekognition のラベルでは対応できない概念があります。

例えば今回は「良い子」を分析したいのですがそういったラベルは用意されていません。
そのため Amazon Rekognition に学習をさせる必要がある際にカスタムラベルを使用します。

詳細:Amazon Rekognition Custom Labels とは。 – Rekognition

料金

Amazon Rekognition は利用量に応じた従量課金制となっています。
今回は Amazon Rekognition カスタムラベルを利用するので抜粋します。

カスタムラベルは「推論時間」と「トレーニング時間」に応じて料金が発生します。

特徴 料金
推論 USD 4/時間
トレーニング USD 1.37/時間

※東京リージョン(ap-northeast-1)の料金です。
詳細:料金 – Amazon Rekognition | AWS

事前準備

事前にカスタムラベルに学習させるための画像データを用意します。
今回は「良い子」を「家事をお手伝いする子供」と定義し、対照の子供として「ゲームをする子」の画像を準備してみました。
(画像の準備は Bedrock にお願いしました。)

「家事をお手伝いする子供」:10枚 + テスト用1枚

「ゲームをする子」:10枚 + テスト用1枚


隠れてゲームをしている感じがあっていい画像ですね。

(上記画像は今回作成したカスタムラベルのテスト用の画像です。)

カスタムラベル作成

プロジェクトの作成

Amazon Rekognition カスタムラベルのコンソール画面です。
「ご利用開始にあたって」を選択してプロジェクトの作成を行います。

初回利用時は S3 バケットの作成が必要みたいです。
なのでそのまま「S3 バケットを作成」を選択します。

するとプロジェクトの作成ができるようになったので「プロジェクトの作成」から進んでいきます。

特別な設定は無く、プロジェクト名を入力して作成します。

データセットの作成

作成されたプロジェクトの画面です。
必要な操作手順が表示されているのでそれに従って進めます。

今回はテスト用の画像も準備しているのでテストデータも設定できる右側を選択しました。

S3 バケットから画像を分析することもできますが画像をローカルPC上に置いていたので今回は直接アップロードします。

同様にテスト用の画像もPCから直接アップロードします。
設定後、作成を選択します。

作成したデータセット画面です。
格納先に気を付けつつ画像をアップロードします。
① トレーニング用の画像データ
② テスト用の画像データ

直接アップロードした際の画面です。
トレーニング用に20枚、テスト用に2枚アップロードします。


画像のアップロードができたら、ラベル付けを行います。
ラベルを付けることで Rekognition 側が学習を行う際に「この画像は、このラベルだ!」と紐づけて学習してくれます。

画面左下の「ラベルを追加」からラベルを作成して画像に割り当てます。

今回ゲームをしている子を「during a game」、お手伝いをしている子を「housework help」としています。

これでタグ付けが完了しました。

モデルトレーニング

アップロードした画像すべてにラベル付けが完了したら次はトレーニングを行います。

トレーニングはプロジェクトを選択すればあとは Rekognition 側で行ってくれます。
今回は検証のため選択していませんが、データの暗号化も可能です。

画面下部の「モデルをトレーニング」を選択すると料金が発生する旨の確認画面が表示されます。
画面にも表示される通り、トレーニングが失敗、または終了した際は料金が発生しません。
(余談ですが、トレーニングは最大72時間実行されると自動終了するそうです。)

画像22枚に対して約17分程度で終了しました。データ量が少ないので、予想より早く終わりました。

トレーニングしたモデルの詳細画面です。
値がすべて100%になっているので学習させたデータの差分が少なすぎたようですね。
今回は検証なのでこのまま動作を見てみようと思います。

① F1 値:各ラベルの平均性能とテストデータセット全体の平均モデル性能を測定した値です。
② Average precision:各ラベルの適合率とテストデータセット全体の平均適合率が用意されています。
③ Overall recall:各ラベルの平均リコールとテストデータセット全体の平均再現率が表示されます。

何故かボタンがつぶれていますがテストデータの結果をパフォーマンスから見ることができます。

テスト結果を見ることができます。
2つとも学習用データに近い構図の画像なので信頼度は高めですね。

モデルの使用(推論)

モデルを実際に使用するにはモデルを起動させる指示が必要です。
「モデルを使用」タブへ移動するとコンソールから起動することができます。
また他にも、AWS CLI や Python で呼び出すことが可能となっています。

試しにモデルを起動してみます。
Cloud Shell から CLI コマンドを実行します。

[cloudshell-user@ip-XXX-XXX-XXX-XXX ~]$ aws rekognition start-project-version \
>   --project-version-arn "arn:aws:rekognition:ap-northeast-1:000000000000:project/paseri-goodchild-project/version/paseri-goodchild-project.2024-11-25T12.57.59/1732507079974" \
>   --min-inference-units 1 \
>   --region ap-northeast-1
{
    "Status": "STARTING"
}

数分待つとコンソール上で「RUNNING」と表示されました。
これで画像の分析を行うことができるようになりました。

画像_01

新しく S3 バケットを作成し、分析したい画像データを格納しておきました。
これを CLI コマンドを利用して Rekognition で分析を行います。

画像_02

分析に利用する画像です。
それっぽい「お手伝いする子供」の画像を Bedrock に生成してもらいました。
これを CLI コマンドで呼び出します。

画像_03

と、思ったのですが"CustomLabels"が空の状態で表示されました。
おそらく学習データがよくなかったため回答が出力されないみたいですね。

[cloudshell-user@ip-XXX-XXX-XXX-XXX ~]$ aws rekognition detect-custom-labels \
>   --project-version-arn "arn:aws:rekognition:ap-northeast-1:000000000000:project/paseri-goodchild-project/version/paseri-goodchild-project.2024-11-25T12.57.59/1732507079974" \
>   --image '{"S3Object": {"Bucket": "paseri-techblog","Name": "goodboy.jpg"}}' \
>   --region ap-northeast-1
{
    "CustomLabels": []
}

うまく検証できなかったので、学習に使用した画像を分析してみます。

画像_04

これなら値が表示されました。
"Confidence"は画像の during a game ラベルに対する信頼度をパーセントで出ているので、この画像の子は「ゲームをしている」という結果が表示されていることになります。

[cloudshell-user@ip-XXX-XXX-XXX-XXX ~]$ aws rekognition detect-custom-labels \
>   --project-version-arn "arn:aws:rekognition:ap-northeast-1:000000000000:project/paseri-goodchild-project/version/paseri-goodchild-project.2024-11-25T12.57.59/1732507079974" \
>   --image '{"S3Object": {"Bucket": "paseri-techblog","Name": "game boy_01.png"}}' \
>   --region ap-northeast-1
{
    "CustomLabels": [
        {
            "Name": "during a game",
            "Confidence": 94.16600036621094
        }
    ]
}

最後にモデルの停止をしておきます。
モデルを起動したままにしておくと継続的に課金が発生してしまうので気を付けてください。
(食卓からチキンが減ることになってしまいますよ。)

[cloudshell-user@ip-XXX-XXX-XXX-XXX ~]$ aws rekognition stop-project-version \
>   --project-version-arn "arn:aws:rekognition:ap-northeast-1:000000000000:project/paseri-goodchild-project/version/paseri-goodchild-project.2024-11-25T12.57.59/1732507079974" \
>   --region ap-northeast-1
{
    "Status": "STOPPING"
}

まとめ

今回は Amazon Rekognition カスタムラベルを利用して「良い子供」を判別するモデルを作成しました。
学習データが不十分でうまくいかない部分もありましたが学習モデルに触れることはできたので今後の課題ということで検証は終了とします。

皆さんはAIに頼らず、しっかりお子さんの日頃の行動を見守ってサンタさんにこっそり伝えてあげてくださいね。

少しでも参考になれば幸いです!
最後までお読み頂きありがとうございました!

テックブログ新着情報のほか、AWSやGoogle Cloudに関するお役立ち情報を配信中!

Paseri

2024年新卒入社。うどん好きな初心者クラウドエンジニア。

Recommends

こちらもおすすめ

Special Topics

注目記事はこちら