【後編】 DeepLens で顔認識をしてみた~仕上げ編~
IT技術
後編~DeepLens で顔認識をしよう~
前回の「実践編」に続き、「DeepLens」と「Rekognition」を使った顔認識プログラムについて解説します。
前回は、Rekognition を呼び出すための、DeepLens 側プログラムの動作確認までを行いました。
今回は「仕上げ編」として、実際に Rekognition に問い合わせをして、結果をメール送信するところまで実装したいと思います。
前回の記事はこちら
前回の記事は、以下をご参照ください。
2020.06.30【中編】 DeepLens で顔認識をしてみた~実践編~中編~DeepLens で顔認識をしよう!~前回は、「AWS の組み込みモデルを使うだけで顔認識ができる」ことを確認し...
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 )です。
1def lambda_handler(event, context):
2 #print("Received event: " + json.dumps(event, indent=2))
3
4 # Get the object from the event and show its content type
5 bucket = event['Records'][0]['s3']['bucket']['name']
6 key = urllib.parse.unquote_plus(event['Records'][0]['s3']['object']['key'], encoding='utf-8')
7 try:
8 response = s3.get_object(Bucket=bucket, Key=key)
9 print("CONTENT TYPE: " + response['ContentType'])
10
11 threshold = 70
12 maxFaces = 5
13
14 MYCOLLECTIONID='sample'
15 accesskey = "XXXXXXXXX"
16 secretkey = "XXXXXXXXX"
17 region = "ap-northeast-1"
18 topic_arn = 'arn:aws:sns:ap-northeast-1:XXXXXXXXX:myTestUploadTopic'
19
20 client=boto3.client('rekognition')
21
22 response = client.search_faces_by_image(CollectionId=MYCOLLECTIONID,
23 Image={"S3Object": {"Bucket": bucket, "Name": key}},
24 FaceMatchThreshold=threshold,
25 MaxFaces=maxFaces)
26 print(response)
27 n = len(response['FaceMatches'])
28 if(n > 0):
29 sns = boto3.resource("sns", aws_access_key_id=accesskey, aws_secret_access_key=secretkey, region_name=region)
30
31 response = sns.Topic(topic_arn).publish(
32 Message="This is a test message!!",
33 Subject="TEST"
34 )
35
36 print(response)
37
38
39 return 0
40 except Exception as e:
41 print(e)
42 print('Error getting object {} from bucket {}. Make sure they exist and your bucket is in the same region as this function.'.format(key, bucket))
43 raise e
Rekognition に問い合わせる
アップロードが終了したら、Rekognition に問い合わせを行います。
すると Rekognition が分析を行い、特定の人物の可能性が高い場合にはSNSサービスを使ってメールで知らせてきます。
テスト実行
ここまできたら、間違いがないかどうか、「S3Lambda のテストボタン」で試してみましょう。
この記事の通りにやれば大丈夫ですが、動かない場合は、次のチェックをして下さい。
- 第2回の記事にある Rekognition にコレクションを作成していますか?
- テスト用にアップロードした画像は、ちゃんとコレクション内にありますか?
- 記事中のステップごとに記載した確認はできていますか?
動作確認
さあ、これで全て終了です。
DeepLens にプログラムをデプロイして、動作確認をしてください!
さいごに
いかがでしたか?
複雑な手順に見えますが、Amazon の3つのサービスを使っているだけで、プログラムとして難しい部分はありません。
ひとつひとつ確実に設定することで、プログラムは動作します。
「DeepLens」はもちろん、「S3 フックプログラム」や、「SNS メールサービス」などもいろいろな用途に使えると思います。
ぜひ、あなたなりの活用方法を考えてみて下さいね!
こちらの記事もオススメ!
2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...
2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...
2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...
ライトコードでは、エンジニアを積極採用中!
ライトコードでは、エンジニアを積極採用しています!社長と一杯しながらお話しする機会もご用意しております。そのほかカジュアル面談等もございますので、くわしくは採用情報をご確認ください。
採用情報へ
「好きを仕事にするエンジニア集団」の(株)ライトコードです! ライトコードは、福岡、東京、大阪、名古屋の4拠点で事業展開するIT企業です。 現在は、国内を代表する大手IT企業を取引先にもち、ITシステムの受託事業が中心。 いずれも直取引で、月間PV数1億を超えるWebサービスのシステム開発・運営、インフラの構築・運用に携わっています。 システム開発依頼・お見積もり大歓迎! また、現在「WEBエンジニア」「モバイルエンジニア」「営業」「WEBデザイナー」を積極採用中です! インターンや新卒採用も行っております。 以下よりご応募をお待ちしております! https://rightcode.co.jp/recruit
おすすめ記事
immichを知ってほしい
2024.10.31