目次
概要
Amazon Web Services(以下、AWS)のRekognitionサービスを使用して、面倒なトレーニングは一切なしでS3ストレージにアップロードされる動画の中から、人の写っていない動画だけを削除する方法を紹介します。
一般的にAIの機能を使用しようとすると、大量のサンプルデータを学習させる工程が必要になることが多く、このデータの準備が大変わずらわしかったりします。ここではAWSのRekognitionという学習済みのサービスを使用することでAIに学習させるという工程なしに、動画の分別という人が行うと面倒な作業を短時間で自動化する方法を紹介します。
この記事では下記の経緯から、たくさんの動画の中から人の写っていない動画だけ削除するものを紹介していますが、削除する判定条件を変更したり、削除以外のアクションをさせることでいろいろと応用できると思います。
経緯
趣味でRaspberry Piを使って何か実用的なものを作ってみようと思い、動体検知で起動する自宅用の監視カメラを作りました。ただ、作ったはいいものの、天気が急に曇る、車のライトが差し込む等の要因で人や動物が写っていない不要な動画がたくさん撮影されてしまいました。これは使い勝手がよくないなと思い、アップロードされたファイルの中からAmazon Rekognitionを活用して人の写っている動画だけを選別して残す仕組みを改善策として試してみました。その方法について書いていきたいと思います。
アーキテクチャ
以下のような構成です。
- 動画ファイルをS3のバケットにアップロードする
※図はカメラからとなっていますが、手動アップロードでも何でもOK - Lambda function(newFileUploaded)でS3のファイル生成をトリガーにAmazon Rekognitionサービスに解析を要求
- Rekognitionは解析が完了するとSNS Topicを発行
- Lambda function(labelDetectionCompleted)でラベル検出結果を確認し、”Human”ラベルが無ければその動画を削除
システム構築
では設定を始めましょう。前提としてこの記事の内容を再現するためにはAWSアカウントを取得し、開発できる環境が必要です。今回使用するサービスはすべて無料枠のあるサービスなので、試していきなり課金されるということはありません。
また、以下の手順はすべて同一リージョン内で実施してください。私の場合は東京(ap-northeast-1)を使用しました。
準備
AWS Lambdaにセットアップする関数はGitに置いています。事前にダウンロードしておいてください。
データを保存するS3バケットも決めておきます。無ければ新規作成しておきましょう。今回に限っては作成の際に特別な設定は不要なので、AWSの公式ドキュメントを参考に作成しておきます。全体を通して必要なロールも2つ設定しておきます。
“rekognition”はAmazon Rekognitionの分析完了後、Lambda関数にSNSトピックを発行するために必要な設定です。分析要求時このロールのARNをAmazon Rekognitionに渡すことで、”AmazonRekognition”が プレフィックスされるSNSトピックが発行されるようになります。”lambda_rekognition_execution”は作成するLambda関数(2種類)両方で使用するロールです。ここでは簡単に構築することを優先し、このロールに2つのLambda関数実行に必要な権限をすべて設定します。
まず”rekognition”の作成ですが、IAM>ロールの作成>Rekognitionを選択します。
この画面でRekognitionを選択し、”次のステップ”へ進みます。
続く、アクセス権限、タグの設定ページはそれぞれそのまま”次のステップ”を選択して、最後の確認ページでロール名を”rekognition”に設定します。
続けて”lambda_rekognition_execution”の設定をします。こちらはIAM>ロールの作成>Lambdaを選択します。こちらはアタッチするポリシーを聞かれるので、以下の3つを設定します。
- AmazonS3FullAccess
- AmazonRekognitionFullAccess
- CloudWatchLogsFullAccess
以降の設定変更は不要で、確認画面でロール名を”lambda_rekognition_execution”と指定してロールを作成します。
“lambda_rekognition_execution”の設定はまだ完了ではありません。インラインポリシーの追加が必要です。
インラインポリシーはロール>lambda_rekognition_execution>インラインポリシーの追加の画面でJSONタブを選択し、以下のJSONを貼り付けます。”rekognitionロールのARN”は先ほど各自で作成したロールのARNに置き換えてください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "arn:aws:iam::aws:policy/service-role/AmazonRekognitionServiceRole" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "rekognitionロールのARN" } ] } |
これで準備は完了です。
Lambda function(newFileUploaded)の作成
ここではS3へのファイルアップロードをトリガーに、Amazon Rekognitionにラベル解析要求を投げるLambda関数”newFileUploaded”の作成を行います。
関数の作成
Lambda>関数>一から作成と進み、以下の内容で作成します。
トリガーの設定
トリガーにS3を追加し、設定を以下のように行います。バケットには準備のところで用意したバケット名を設定してください。
サフィックスにmp4を指定しているのは、こちらの環境で撮影する動画がmp4形式だったためです。Amazon Rekognitionのラベル検出APIで解析可能なファイル形式はmp4、mov、 aviなので、ここは必要に応じて変更してもらえればOKです。
関数コードのアップロード
準備のところでダウンロードしたnewFileUploaded.zipをアップロードします。コードに記載されているAPIの詳細は公式のAPIスペックに記載があります。startLabelDetection APIのMinConfidenceは値が低いと大量のラベルが検出されるため、このコードではConfidence 90以上のラベルのみ取得できるように設定しています。
アップロードは関数コード>コードエントリタイプ>.zipファイルをアップロードからnewFileUploaded.zipをアップロードします。
ファイルのアップロードに伴いハンドラ名も”newFileUploaded.handler”に変更します。あわせて環境変数も設定が必要です。
ROLE_ARNがロール”rekognition”のARN、SNS_TOPIC_ARNが次に作成するSNSトピック”AmazonRekognitionLabelDetectionCompleted”のARNです。
実行ロールの設定
実行ロールには準備で作成した”lambda_rekognition_execution”を指定します。
SNS Topicの作成
次にSNS トピックの設定を行います。SNSダッシュボード>トピックの作成でトピック名に”AmazonRekognitionLabelDetectionCompleted”を指定しておきます。表示名は任意です。空っぽでも問題ありません。
作成が終わったらこのタイミングでAWS LambdaのnewFileUploadedに戻り、環境変数のSNS_TOPIC_ARNに”AmazonRekognitionLabelDetectionCompleted”のARNを忘れずに設定しておきます。
Lambda function(labelDetectionCompleted)の作成
最後に、ラベリングされた結果を確認して、”Human”ラベルが無い場合は画像を削除する処理を実装します。
ここでもAWS Lambdaを使用し、関数名は”labelDetectionCompleted”とします。こちらもランタイムはNode.js 8.10を使用します。
トリガーの設定
この関数はAmazon Rekognitionのラベル検出完了時に発行されるSNSトピックをトリガーにするため、以下のように設定します。
関数コードのアップロード
newFileUploadedをセットアップしたときと同じ手順でGitからダウンロードしたlabelDetectionCompleted.zipをアップロードします。ハンドラも”labelDetectionCompleted.handler”に忘れず変更しておきましょう。
ここで使用しているgetLabelDetection APIは一度に取得できるラベルが1000件までです。”Human”ラベルが見つからない場合、以後のデータは再帰的に取得する構造になっています。
実行ロールの設定
newFileUploadedと同じく”lambda_rekognition_execution”を指定しておきます。
以上で構築は完了です。データサンプルを大量に用意してのトレーニングなど必要無く、サービスを組み合わせてちょっとしたコードを実装するだけで準備が整いました。
動作確認
では、試しに動かしてみます。ここではvi_0023_20190211_202645.mp4という人の写っていないファイルと、vi_0024_20190211_202705.mp4という人の写っているファイルを試しにアップロードしています。
アップロード後にCloudWatch>ロググループ>/aws/lambda/labelDetectionCompletedの該当時刻のログを確認すると、vi_0023_20190211_202645.mp4については
vi_0024_20190211_202705.mp4については
というログが表示されました。ここでS3を覗いてみると、以下のようにvi_0023_20190211_202645.mp4が削除されています。
おわりに
Amazon Rekognition自体は特に新しい機能でもないですが、触ってみるとAIに学習させるという作業なしでAIの機能を活用することができてとても便利に感じました。使ってみた感想は、人についてはなかなか精度の良い検出ができていたと思います。中にはルームライトを太陽光と判定した例もありましたが、このあたりは許容範囲かと思っています。皆さんも、もし興味が湧けば一度試してみてください。
執筆者プロフィール

- tdi AI・コグニティブ推進部
- 現在はコグニティブ・クラウド領域のコンサルタント兼エンジニアとして活動中。元が組み込み育ちのためIoTにも興味あり。