
【後編】 DeepLens で顔認識をしてみた~仕上げ編~
2021.12.20
後編~DeepLens で顔認識をしよう~
前回の「実践編」に続き、「DeepLens」と「Rekognition」を使った顔認識プログラムについて解説します。
前回は、Rekognition を呼び出すための、DeepLens 側プログラムの動作確認までを行いました。
今回は「仕上げ編」として、実際に Rekognition に問い合わせをして、結果をメール送信するところまで実装したいと思います。
前回の記事はこちら
前回の記事は、以下をご参照ください。
S3 側のプログラム
前回で DeepLens 側の設定は終わったので、S3 側の設定から始めましょう。
Lambda 起動
S3 に新しい写真が追加されたら、「Lambda」を起動するよう設定します。
まず、AWS コンソールから Lambda サービスのページに移動してください。

関数の作成
「関数を作成」ボタンをクリックします。

設計図の仕様をチェックして、フィルター追加のところに「S3」と入力します。
すると、キャプチャのように候補が出てくるので、「s3-get-object-python」 をチェックします。
最後に、「設定」を押します。

関数名を入力
関数名を入力します。
ここでは「myTestUploadFunc」としておきます。

実行ロールとバケットを設定
実行ロールは「既存のロールを使用する」をチェックして、ドロップダウンから 「service-role/AWSDeepLensLamdaRole」を選びます。

S3 トリガーのバケットをドロップダウンして、使いたいバケットを選び、「設定」ボタンを押します。
押しても画面遷移しない場合は未設定の箇所があるので、赤い部分を修正して下さい。
設定完了

きちんと設定が出来ていると、画面がキャプチャのように遷移します。
これでようやく、S3 のフックプログラムが書けるようになります。
テスト
さっそく、Lambda に慣れるためにテストをしてみましょう。
右上の「テスト」ボタンを押します。

イベント名を入力
イベント名を入力します。
ここでは、「myUploadTestEvent」としておきます。

バケット名を変更
スクロールして、テストプログラムの下の方にある、 "bucket": の "name": "example-bucket" のところを "name": "バケット名" に変更します。
「バケット名」には、あなたがつけた S3 のバケット名を入れて下さい。
(例: "test-s3-bucket" など)
同じように、 "arn" についても修正します。
ファイルを入れ替え
最後に、これからアップロードテストをするファイル名を "key": "test/key" の "test/key" と入れ替えて下さい。
test が「フォルダ名」で、key が「ファイル名」にあたります。
設定完了
さあ、これで「作成」ボタンを押したらテストの準備は完了です。
出来上がった関数の右にテストボタンがあるので、ちゃんとプログラムが実行されるか確認してみましょう!
確認

エラーが起こるとキャプチャのように赤くなるため、もう一度テストプログラムをチェックします。
(正しく修正されていれば、テストプログラムは動作します。)
エラーを防ぐため、テストファイルはあらかじめアップロードしておく必要があります。
アクセス権限の確認
ここで忘れてはならないのが、「アクセス権限」です。
S3 イベントを監視するには、実行ロールに S3 アクセス権がついているかを確認する必要があります。
これは、IAM のコンソール上から行います。

ついていなければ、「ポリシーをアタッチします」ボタンを押して、AmazonS3FullAccess を付与します。
ちょっと面倒ですが、AWS のルールとして、サービスを実行する時には実行権限をつける必要があるのです。

ついでにここで、「AmazonRekognitionCustomLabelsFullAccess」と「AmazonSNSFullAccess」も付与しておくと、後の手間が省けます。
ここで、ようやく一段落です。
結構手数が多いので、設定忘れやミスがないよう、ひとつひとつ丁寧にやって行きましょう!
SNS サービスの準備
今回は確認方法に「SNSサービス」を使うので、SNS 側にトピックを作る必要があります。
トピックとは
「トピック」というのは、SNS がサービスを行う単位のことです。
トピック単位で、複数のメールアドレスにメールを送ることができます。
また、トピックにメールアドレスを登録することを、「サブスクリプション」と呼びます。
トピックの作成
例によって、AWS コンソールから「AmazonSNS サービス」を選んで、トピックを選びます。

「トピックの作成」ボタンを押して、トピックを作成します。

トピック名を入力
任意のトピック名を入力します。
ここでは、「myTestUploadTopic」としています。
「トピックの作成」ボタンで、トピックが作成されます。
サブスクリプションを作成
次に、トピックの青線箇所をクリックすると、サブスクリプションを作成できます。


「プロトコルの選択」で、Eメールを選択します。
「エンドポイント」に、メールを受信したいアドレスを入力します。
「サブスクリプションの作成」ボタンを押すと、先の画面に戻りますが、この時点でメールが届くので確認して下さい。
確認
確認が済むと、画面に「確認済み」と表示されます。
これは、正しいメールアドレスが登録されたかどうかを、AWS のシステムが確認する機能です。
これを行わないと、SNS サービスは利用できません。
さあ、これで準備完了です!
トピックの ARN をコピー
画面に表示されているトピックの ARN をコピーしましょう。
arn は、SNS サービスコンソールの最初のページのトピックに表示されています。
arn:aws:sns:ap-northeast-1:xxxxxxxxxxxx:myTestUploadTopic.
これはシステムごとに違うので、上記をコピペしても動きません。
必ずご自分の環境のものを使って下さい。
トピック表示の個別画面の右上に「メッセージの発行」ボタンがありますので、実際にテストメールが発行されているかを確認しておいて下さい。
Lambda プログラムの変更
以下が、新しく追加する、S3 のイベント監視フックプログラム( Lambda )です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | def lambda_handler(event, context): #print("Received event: " + json.dumps(event, indent=2)) # Get the object from the event and show its content type bucket = event['Records'][0]['s3']['bucket']['name'] key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8') try: response = s3.get_object(Bucket=bucket, Key=key) print("CONTENT TYPE: " + response['ContentType']) threshold = 70 maxFaces = 5 MYCOLLECTIONID='sample' accesskey = "XXXXXXXXX" secretkey = "XXXXXXXXX" region = "ap-northeast-1" topic_arn = 'arn:aws:sns:ap-northeast-1:XXXXXXXXX:myTestUploadTopic' client=boto3.client('rekognition') response = client.search_faces_by_image(CollectionId=MYCOLLECTIONID, Image={"S3Object": {"Bucket": bucket, "Name": key}}, FaceMatchThreshold=threshold, MaxFaces=maxFaces) print(response) n = len(response['FaceMatches']) if(n > 0): sns = boto3.resource("sns", aws_access_key_id=accesskey, aws_secret_access_key=secretkey, region_name=region) response = sns.Topic(topic_arn).publish( Message="This is a test message!!", Subject="TEST" ) print(response) return 0 except Exception as e: print(e) print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket)) raise e |
Rekognition に問い合わせる
アップロードが終了したら、Rekognition に問い合わせを行います。
すると Rekognition が分析を行い、特定の人物の可能性が高い場合にはSNSサービスを使ってメールで知らせてきます。
テスト実行
ここまできたら、間違いがないかどうか、「S3Lambda のテストボタン」で試してみましょう。
この記事の通りにやれば大丈夫ですが、動かない場合は、次のチェックをして下さい。
- 第2回の記事にある Rekognition にコレクションを作成していますか?
- テスト用にアップロードした画像は、ちゃんとコレクション内にありますか?
- 記事中のステップごとに記載した確認はできていますか?
動作確認
さあ、これで全て終了です。
DeepLens にプログラムをデプロイして、動作確認をしてください!
さいごに
いかがでしたか?
複雑な手順に見えますが、Amazon の3つのサービスを使っているだけで、プログラムとして難しい部分はありません。
ひとつひとつ確実に設定することで、プログラムは動作します。
「DeepLens」はもちろん、「S3 フックプログラム」や、「SNS メールサービス」などもいろいろな用途に使えると思います。
ぜひ、あなたなりの活用方法を考えてみて下さいね!
こちらの記事もオススメ!
書いた人はこんな人

- 「好きを仕事にするエンジニア集団」の(株)ライトコードです!
ライトコードは、福岡、東京、大阪の3拠点で事業展開するIT企業です。
現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。
いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。
システム開発依頼・お見積もり大歓迎!
また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」「WEBディレクター」を積極採用中です!
インターンや新卒採用も行っております。
以下よりご応募をお待ちしております!
https://rightcode.co.jp/recruit
ライトコードの日常12月 1, 2023ライトコードクエスト〜東京オフィス歴史編〜
ITエンタメ10月 13, 2023Netflixの成功はレコメンドエンジン?
ライトコードの日常8月 30, 2023退職者の最終出社日に密着してみた!
ITエンタメ8月 3, 2023世界初の量産型ポータブルコンピュータを開発したのに倒産!?アダム・オズボーン