• トップ
  • ブログ一覧
  • 【中編】 DeepLens で顔認識をしてみた~実践編~
  • 【中編】 DeepLens で顔認識をしてみた~実践編~

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

    IT技術

    中編~DeepLens で顔認識をしよう!~

    前回は、「AWS の組み込みモデルを使うだけで顔認識ができる」ことを確認しました。

    この「実践編」では、誰の顔であるかを Rekognition サービスに問い合わせてみようと思います。

    やや手順が長いので、今回は「Rekognition」の紹介と、DeepLens プログラムの動作確認までを扱います。

    前回の記事はこちら

    featureImg2020.05.11【前編】DeepLens で顔認識をしてみた~準備編~前編~DeepLens で顔認識をしよう!~「DeepLens」は、AWS(アマゾンウェブサービス)が発売している、カ...

    Rekognition サービス

    Rekognition」サービスは、AWS が提供している「従量課金型の画像認識 API」です。

    【Amazon Rekognition】
    https://aws.amazon.com/jp/rekognition/

    指定した画像や動画のデータを分析し、オブジェクトやシーンを検出してくれる他、顔の分析・比較も行えます。

    使い方はとても簡単で、AWS コンソールの Web から写真をアップロードするだけです。

    Python から Rekognition を使う

    プログラムから使うには、次のようなコードを書きます。

    1import boto3
    2import json
    3
    4client = boto3.client('rekognition')
    5
    6MYCOLLECTIONID = 'sample'
    7BUCKET = 'sample_bucket'
    8
    9def  createCollection():
    10     response = client.create_collection(
    11     CollectionId = MYCOLLECTIONID
    12     )
    13     response = json.dumps(response)
    14     print(response)
    15
    16def indexFaces(key,extID):
    17    response = client.index_faces(
    18        CollectionId = MYCOLLECTIONID,
    19        Image = {
    20            'S3Object': {
    21                'Bucket': BUCKET,
    22                'Name': key,
    23            }
    24        },
    25        ExternalImageId = extID,
    26        DetectionAttributes = [
    27            'ALL',
    28        ]
    29    )
    30    response = json.dumps(response)
    31    print(response)
    32
    33def searchFaces(key):
    34    threshold = 70
    35    maxFaces = 5
    36    bucket = BUCKET
    37    response = client.search_faces_by_image(CollectionId=MYCOLLECTIONID,
    38                   Image={"S3Object": {"Bucket": bucket, "Name": key}},
    39                   FaceMatchThreshold=threshold,
    40                   MaxFaces=maxFaces)
    41    print(response)

    カスタムラベル

    Rekognition は、「コレクション」という単位で、カスタムラベルを作ることができます。

    プログラム中、MYCOLLECTIONID = 'sample'の部分です。

    カスタムラベル」というのは、あらかじめ登録しておく画像のことです。

    例えば、「山口さんの顔認識をしたい」場合、山口さんの顔写真を登録しておく必要があります。

    このカスタムラベルを使うと、誰の顔であるか認識できるようになるのです。

    DeepLens + Rekognition で顔認識をする手順

    それでは、DeepLens でやってみましょう。

    プログラムから誰の顔であるかを識別させるためには、次の手順が必要です。

    1. コレクションを作成する
    2. コレクションにあらかじめ、特定の人の顔画像を登録しておく
    3. ターゲットとなる写真を、Rekognition にコレクション指定して問い合わせる

    上記の手順をそれぞれプログラム中に当てはめると、createCollection() indexFaces(key,extID) searchFaces(key) となります。

    準備

    写真をアップロード

    登録や問い合わせに使う写真を S3 にあらかじめアップロードしておけば、その写真を指定するだけで、簡単に問い合わせを行うことができます。

    適当なバケットに、認識したい人の顔写真をtest.jpg というファイル名でアップロードしておきましょう。

    コレクション名を記録

    この段階で作成した、Rekognition のコレクションは後で使いますので、コレクション名を記録しておいて下さい。

    コード

    実際にコードを書いてみると、以下のようになります。

    1def main():
    2    createCollection()
    3    indexFaces('test.jpg','test-label')
    4    print(searchFace('test.jpg'))

    注意事項

    注意事項は、以下2つです。

    写真の容量制限

    使う写真は、あまり容量が大きすぎるとエラーになります。

    2M以下のファイルを扱うことをお勧めします。

    (※ AWS の仕様によると、5M以下を推奨しています。)

    効率よく開発するなら AWS-CLI

    Rekognition は Python で簡単に試せますが、AWS-CLI を使う方が効率よく開発できると思います。

    私の場合は、上記のプログラムで、必要な関数だけを(他のものをコメントアウトして)使うことで対応しました。

    逆に言うと、Web のコンソールからの操作では、カスタムラベルなどを試すことはできないので注意が必要です。

    DeepLens 側に作り込む場合の全体設計

    それでは DeepLens で、顔認識をしてみましょう!

    DeepLens から Rekognition を呼び出す方法は、2つあります。

    1. DeepLens から「直接」Rekognition API を呼ぶ方法
    2. S3 にアップロードしてから、S3 の「イベントフック」を使って Rekognition APIを呼ぶ方法

    前者はデバッグがやりにくいので、今回は S3 にアップロードして、イベントフックに Lambda プログラムとして実装する方法をとります。

    S3 のイベントフックから Rekognition を呼ぶ

    手順は以下の通りです。

    1. DeepLens から S3 に画像をアップロードする
    2. アップロードした画像を指定して、Rekognition に問い合わせを行う

    これでプログラム骨子はできるのですが、確認方法として、今回はSNSサービスを使い、認識された顔が特定の人物だったらメールを出すという仕様にしてみます。

    DeepLens 側プログラム

    次のコードが DeepLens 側のプログラムです。

    冒頭のコード

    1import boto3
    2import botocore
    3def uploadS3():
    4
    5    session = Session(aws_access_key_id='XXXXXXX',aws_secret_access_key='XXXXXXXX',region_name='ap-northeast-1')
    6
    7    s3 = session.resource('s3')
    8
    9    bucket = s3.Bucket('sample-bucket')
    10
    11    response = bucket.upload_file('/tmp/aws_cam.png','aws_cam.png')

    関数を入れる

    まず、新しい関数を1つ冒頭に入れます。

    アクセスキー、シークレットアクセスキーはあらかじめ用意しておく必要があります。

    末尾のコード

    以下は、既存のプログラムの末尾に加える部分です。

    1                    # (Xmin, ymin-text_offset),
    2                    # CV2.FONT_HERSHEY_SIMPLEX, 2.5, (255, 165, 20), 6)
    3                    # Store label and probability to send to cloud
    4                    file_name = '/tmp/aws_cam.png'
    5                    frame2 = cv2.resize(frame,(720,720))
    6                    cv2.imwrite(file_name,frame2)
    7                    uploadS3()
    8                    cloud_output[output_map[obj['label']]] = obj['prob']

    写真のサイズを調整

    cv2.resize() で写真の大きさを小さくしています。

    これをやらないと、先ほど述べた容量制限にひっかかってエラーになります。

    アップロード

    後は、リサイズしたものを書き出して、それをuploadS3() で S3 にアップロードします。

    動作確認

    さあ、ここまで出来たら、一度 DeepLens にデプロイして、動作を確認してみましょう。

    指定したバケットに正しくアップロードされているか、AWS コンソールを使って確認して下さい。

    もし正しくアップロードされていないのであれば、後述のデバッグガイドを参照してチェックしましょう。

    DeepLens プログラムの動作確認

    プログラムができたら、動作確認が必要なので、「デプロイ」を行います!

    デプロイのポイント

    デプロイの方法は前回の記事に書きましたが、ポイントは2つあります。

    1. DeepLens 側の Lambda プログラムのバージョンを上げる
    2. プロジェクトのデプロイで、正しいバージョンを指定する

    これらをきちんと行わないと、DeepLens 側に変更したファイルが送られてきません。

    デプロイが上手く行けば、プログラムは正常に動作し、特定の人物の顔を認識すると、S3 にアップロードしてくれます。

    デバッグ方法

    さて、ここまで完璧に実行できた方には必要ありませんが、誰しもミスはあり得ます。

    そこで、DeepLens のデバッグ方法について解説します。

    DeepLens でデバッグをするためには、SSH で DeepLens 側にログインする必要があります。

    ポイント

    1. SSH で接続する
    2. 接続アカウント名は「 AWS_CAM 」
    3. パスワードは最初に設定したパスワード(重要!)

    パスワードはメモ必須

    パスワードを忘れた場合、 当然ながら DeepLens は初期化しなければいけません。

    しかし、「ファクトリーリセット」はとても面倒で手間がかかります。

    パスワードは、きちんとメモしておきましょう。

    DeepLens プログラムの起動・終了方法

    さて、ログインできたら、GreenGrass の実行ディレクトリーに移動します。

    実効ディレクトリーは次の通りです。

    /opt/awscam/greengrass/deployment/xxxxxxx/

    このディレクトリから、HelloWorld.py というファイルを探してください。

    プログラムを起動する

    HelloWorld.py ファイルを直接実行させようとすると、IotPayroll を使っているせいで、エラーになってしまいます。

    そこで、次のようにして実行させます。

    cd /opt/awscam/greengrass/core ./greengrassd start

    プログラムを終了する

    プログラムを停止させる時には、以下のようにしてください。

    ./greengrassd stop

    これで、DeepLens 側のプログラムの起動と終了ができますね。

    まとめ

    ポイントは以下の3つです。

    1. DeepLens プログラムの変更方法(バージョンが正しく設定されているか?)
    2. APPID の設定
    3. プログラムのスペルミスをしていないか?

    デバッグは SSH を使う

    Lambda プログラムのエディタは、シンタックスチェックをしてくれません。

    コピペをすると、ダブルバイトスペースが入ってしまったり、想定外のことが多く起こります。

    そのため、ssh を使って、DeepLens 側でデバッグしてエラーメッセージを見る必要があります。

    Greengrass はエラーメッセージが確認できない

    ただし、Greengrass で起動したものは、メッセージがローカル表示されません。

    これは、先述の IoTPayRoll でサーバ側に送信されてしまうためです。

    そこでまず、DeepLens 側で python HelloWorld.py を叩いてみて、シンタックスエラーが起こらないかを確認して下さい。

    権限は正しく設定する

    また、DeepLens 側のプログラムは正しい権限で設定されていなければなりません。

    必ず、Deploy を使って最初に転送して、その後は絶対に権限を変えないようにしてください。

    後編へつづく!

    では、次回は「仕上げ編」です。

    プログラムを実際に動かして、確認メールを送信してみようと思います。

    続きの記事はこちら

    featureImg2020.07.01【後編】 DeepLens で顔認識をしてみた~仕上げ編~後編~DeepLens で顔認識をしよう~前回の「実践編」に続き、「DeepLens」と「Rekognition」を使...

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

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

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

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

    広告メディア事業部

    広告メディア事業部

    おすすめ記事