LoginSignup
2
3

More than 1 year has passed since last update.

Python で Amazon Rekognition を動かしてみた

Posted at

背景

「家に不在時でも〇〇が家に来たら〇〇を行う」
こんな事ができたらなぁと考える事がありました。

例えば
 ・ヤクルトレディが来たらオートロック解除
 ・宅配業者ならオートロック解除
 ・N〇Kならブラックリスト登録
でもどうやって判断するんだ?画像分析ってなんか難しそうやなぁ

と言うことで今回は、やりたい事の一端に活用できそうな Amazon Rekognition を動かしてみます。
また、今後応用できるように Python で動作できる様にします。

流れ

Python 実行
Amazon S3 にImageを格納
Amazon Rekognition で要素を分析
こんな流れでいきます。

環境

Windows 10 Enterprise 上でWSL2を動かしています。
Ubuntu、Pythonを利用しています。

Version

$cat /etc/os-release
NAME="Ubuntu"
VERSION="20.04 LTS (Focal Fossa)"

$python3 -V
Python 3.8.10

>wsl -l -v
  NAME      STATE           VERSION
* Ubuntu    Running         2

Amazon Rekognitionとは?

アップロードした画像を元に各種分析を行ってくれるディープラーニングベースの視覚分析サービスです。
ここに画像をアップロードさせます。

例えばラベル検出だと何が写ってるのか判定してくれますね。

イメージ内の物体、概念、シーン、アクションに自動的にラベルを付け、信頼スコアを提供します

他にも"顔の分析"や複数の分析がありますが、今回はラベル検出を試してみます。

Amazon S3とは?

一言で言うとオンラインストレージです。
基本的なストレージの使い方と一緒でバックアップデータとして使えます。
また、AWSのサービスを使うS3を参照させれるのでこちらを利用していきます。

Amazon Simple Storage Service (Amazon S3) は、業界をリードするスケーラビリティ、データ可用性、セキュリティ、およびパフォーマンスを提供するオブジェクトストレージサービスです。

画像の用意

我が家に居た丁度いい熊人形
今回はシンプルに、端末内に保存された以下の画像を利用します。

応用する場合は、監視カメラの映像を画像で保存しアップロードする方法になると思います。
それはまた別の機会に…

参考用:
Cisco Meraki MVGenerate Device Camera Snapshot でカメラに写る映像をスナップショットとして保存できます。

AWS IAM

IAMユーザを作成して利用するAWS S3AWS Rekognitionだけの権限を与えてあげましょう。
私は気付かなかったので以下の様にまるごと権限与えちゃってますがドキュメントには
AmazonRekognitionFullAccessAmazonS3ReadOnlyAccessがあれば良いと記載されてますね。

引用元:開発者ガイド
Create or update an IAM user with AmazonRekognitionFullAccess and AmazonS3ReadOnlyAccess permissions. For more information, see Step 1: Set up an AWS account and create an IAM user.

私のIAM↓

「めんどくさっ!FullAccsecc持ってるルートユーザでええやろ!」
と適当に扱ってしまうと、クレカの請求がすごい事になる可能性があるので気を付けましょう。

AWSを利用するまでの工程やIAMユーザ作成については沢山記事がありますので割愛します。
ここではIAMについての解説と本当にあった怖い話を紹介しておきます。

Local → Amazon S3

まずは Amazon S3 にて格納するバケットを作成してください。
格納する箱だと思ってくれたらいいです。

AWS SDK for Python (Boto3) を利用して、AWSのサービスをPythonで簡単に利用させてもらいます。

AWS SDK for Python (Boto3) を使用すると、AWS の使用を迅速に開始できます。Boto3 を使用することで、Python のアプリケーション、ライブラリ、スクリプトを AWS の各種サービス(Amazon S3、Amazon EC2、Amazon DynamoDB など)と容易に統合できます。

ここからできるだけパーツ毎にコードを記載していきます。

※記載するコードについて
エラー処理やってなくね?とかこれ変じゃね?とかあったりと至らない部分が多々あると思いますが、生暖かい目で見てあげてください。
動けばええねんくらいでやらしてもらってます!

Amazon S3へのアップロード部分
def S3_upload(aws_bucket, aws_file, aws_key):
    print("S3にアップロード中")
    client = boto3.client('s3')
    client.upload_file(aws_file, aws_bucket, aws_key)
    return

boto3.clientの部分でサービスを指定してます。

client.upload_file の部分は configparser で管理してます。
aws_file 端末の画像格納FullPath
aws_key アップロード後のファイル名
aws_bucket S3で作成したバケット名

Amazon S3 → Amazon Rekognition

開発者ガイドを参考に要素を表示する部分を書いていきます。
利用するのは以下の要素ですね。

aws_key アップロード後のファイル名
aws_bucket Amazon S3で作成したバケット名

ラベル検出部分
def detect_labels(aws_key, aws_bucket):
    print("ラベル検出中")
    client = boto3.client('rekognition')
    response = client.detect_labels(Image={'S3Object':{'Bucket':aws_bucket,'Name':aws_key}},
        MaxLabels=10)
    print()
    for label in response['Labels']:
        print ("Label: " + label['Name'])
        print ("Confidence: " + str(label['Confidence']))
        print ("Instances:")
        for instance in label['Instances']:
            print ("  Bounding box")
            print ("    Top: " + str(instance['BoundingBox']['Top']))
            print ("    Left: " + str(instance['BoundingBox']['Left']))
            print ("    Width: " +  str(instance['BoundingBox']['Width']))
            print ("    Height: " +  str(instance['BoundingBox']['Height']))
            print ("  Confidence: " + str(instance['Confidence']))
            print()

        print ("Parents:")
        for parent in label['Parents']:
            print ("   " + parent['Name'])
        print ("----------")
        print ()
    return len(response['Labels'])

client = boto3.client('rekognition')で rekognition を利用します。
response['Labels'] でラベルの数だけ各要素の内容をprintさせてます。

実行

上記のコードを合体して実行します。
合体したコード↓

Amazon_Rekognition.py
Amazon_Rekognition.py
import boto3
import configparser

def S3_upload(aws_bucket, aws_file, aws_key):
    print("S3にアップロード中")
    client = boto3.client('s3')
    client.upload_file(aws_file, aws_bucket, aws_key)
    return

def detect_labels(aws_key, aws_bucket):
    print("ラベル検出中")
    client = boto3.client('rekognition')
    response = client.detect_labels(Image={'S3Object':{'Bucket':aws_bucket,'Name':aws_key}},
        MaxLabels=10)
    print()
    for label in response['Labels']:
        print ("Label: " + label['Name'])
        print ("Confidence: " + str(label['Confidence']))
        print ("Instances:")
        for instance in label['Instances']:
            print ("  Bounding box")
            print ("    Top: " + str(instance['BoundingBox']['Top']))
            print ("    Left: " + str(instance['BoundingBox']['Left']))
            print ("    Width: " +  str(instance['BoundingBox']['Width']))
            print ("    Height: " +  str(instance['BoundingBox']['Height']))
            print ("  Confidence: " + str(instance['Confidence']))
            print()

        print ("Parents:")
        for parent in label['Parents']:
            print ("   " + parent['Name'])
        print ("----------")
        print ()
    return len(response['Labels'])

def gather_credentials():
    """Gather Meraki credentials"""
    conf_par = configparser.ConfigParser()
    try:
        conf_par.read('credentials.ini')
        aws_bucket = conf_par.get('aws', 'bucket')
        aws_file = conf_par.get('aws', 'file')
        aws_key = conf_par.get('aws', 'key')
    except:
        print('Missing credentials or input file!')
        sys.exit(2)
    return aws_bucket, aws_file, aws_key

if __name__ == "__main__":
    (AWS_BUCKET,AWS_FILE,AWS_KEY) = gather_credentials()
    USER_DATA = {
        'AWS_BUCKET': AWS_BUCKET,
        'AWS_FILE': AWS_FILE,
        'AWS_FILE': AWS_KEY
    }

    S3_upload(AWS_BUCKET,AWS_FILE,AWS_KEY)
    detect_labels = detect_labels(AWS_KEY, AWS_BUCKET)
    print(str(detect_labels) + "個ラベルがありました。")

実行!

(venv) hmasayuk@:codes$ python3 Amazon_Rekognition.py
S3にアップロード中
ラベル検出中

Label: Toy
Confidence: 92.86068725585938
Instances:
  Bounding box
    Top: 0.03305918350815773
    Left: 0.2504766285419464
    Width: 0.6258938908576965
    Height: 0.9372327327728271
  Confidence: 56.228912353515625

Parents:
----------

Label: Figurine
Confidence: 57.18489456176758
Instances:
Parents:
----------

Label: Plush
Confidence: 55.58042526245117
Instances:
Parents:
   Toy
----------

3個ラベルがありました。
(venv) hmasayuk@:codes$

良い感じに出力されました。

TOY の要素が92%あって、フィギュアやぬいぐるみも要素にありますね。
Label: Toy
Confidence: 92.86068725585938

確認

Amazon S3を確認しましょう。
無事にアップロードされてますね。
ちなみに、もう一度コードを実行して同じ名前でアップロードすると、ファイルが上書きされます。

Amazon Rekognitionでどんな結果がでるのかブラウザから手動アップロードして確認してみます。

Python実行時と出力は一緒ですね。よかった。
こっちは熊の人形範囲が数値じゃなくて線で表示されてますね。

まとめ

初めてプログラミングの記事を書いたけど手ごわかった。
何をやってるのかわからない行や、無駄な行を調べながら書いていたので時間がかなりかかってしまった。
次は誰かの美しいコードやエラー処理方法を見て真似してから書きたいですね。

また、今回はラベル検出を試してみたが他にも分析方法があるのが分かった。
冒頭で話した「〇〇会社の人間」の分析・判定には少し近づいたと思います。
サービスを使いすぎると課金されてしまうので気をつけてくださいね。

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3