• トップ
  • ブログ一覧
  • 【後編】 DeepLens で顔認識をしてみた~仕上げ編~
  • 【後編】 DeepLens で顔認識をしてみた~仕上げ編~

    広告メディア事業部広告メディア事業部
    2020.07.01

    IT技術

    後編~DeepLens で顔認識をしよう~

    前回の「実践編」に続き、「DeepLens」と「Rekognition」を使った顔認識プログラムについて解説します。

    前回は、Rekognition を呼び出すための、DeepLens 側プログラムの動作確認までを行いました。

    今回は「仕上げ編」として、実際に Rekognition に問い合わせをして、結果をメール送信するところまで実装したいと思います。

    前回の記事はこちら

    前回の記事は、以下をご参照ください。

    featureImg2020.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 のテストボタン」で試してみましょう。

    この記事の通りにやれば大丈夫ですが、動かない場合は、次のチェックをして下さい。

    1. 第2回の記事にある Rekognition にコレクションを作成していますか?
    2. テスト用にアップロードした画像は、ちゃんとコレクション内にありますか?
    3. 記事中のステップごとに記載した確認はできていますか?

    動作確認

    さあ、これで全て終了です。

    DeepLens にプログラムをデプロイして、動作確認をしてください!

    さいごに

    いかがでしたか?

    複雑な手順に見えますが、Amazon の3つのサービスを使っているだけで、プログラムとして難しい部分はありません。

    ひとつひとつ確実に設定することで、プログラムは動作します。

    DeepLens」はもちろん、「S3 フックプログラム」や、「SNS メールサービス」などもいろいろな用途に使えると思います。

    ぜひ、あなたなりの活用方法を考えてみて下さいね!

    こちらの記事もオススメ!

    featureImg2020.07.28機械学習 特集知識編人工知能・機械学習でよく使われるワード徹底まとめ!機械学習の元祖「パーセプトロン」とは?【人工知能】ニューラルネ...

    featureImg2020.07.30Python 特集実装編※最新記事順Responder + Firestore でモダンかつサーバーレスなブログシステムを作ってみた!P...

    featureImg2020.07.17ライトコード的「やってみた!」シリーズ「やってみた!」を集めました!(株)ライトコードが今まで作ってきた「やってみた!」記事を集めてみました!※作成日が新し...

    広告メディア事業部

    広告メディア事業部

    おすすめ記事