ラズべリーパイとAWSで画像認識をしてみました。
AWS(アマゾンのクラウド)を使うことで、誰でも簡単に画像認識を始めれます。
設定方法から実際にカメラを使った画像認識まで紹介していきます。
AWSとラズパイで画像認識!クラウドの力を借りてみた
ラズパイのカメラで撮った写真をAWSで画像認識してみました。
Pythonで「カメラ撮影」+「AWSでの画像認識」をまとめて実施させています。
AWSはしっかりと撮影した写真の「テニスボール(+人の手)」を画像認識できていました。
AWSの画像認識の結果ではテニスボールの信頼度は「99.999…%」でした。
AWSの設定方法からPythonのプログラム含めて紹介していきます。
実際のテストの様子も動画で紹介しています。
プログラム起動後に「カメラ撮影+画像認識」されている様子が分かります。
AWSに個人で登録する
最初は下記リンクに従ってAWS(アマゾンのクラウド)の登録を進めます。
個人でも自由に登録が可能です。
無料枠も十分にあるので、少しAWSに体験してみる程度ならば無料で試せます。
※今回の画像認識のテストでも無料枠内で実施出来ました。
https://aws.amazon.com/jp/register-flow/
今回の記事以外でもラズベリーパイをAWS IoTに接続した記事も紹介しています。
ラズパイをIoTデバイスとして登録するのに参考になると思います。(リンク先はこちら)
AWSにラズパイを接続!GPIOの信号をクラウドに送信してみた
S3のバケット作成
AWS S3(AWSのオンラインのストレージサービス)でバケットを作成します。
AWSで画像認識する上で、一旦はクラウド上に写真を保存する必要があるためです。
Amazon S3から「バケットを作成」があるので任意の名前を入力して作ります。
一応リージョンは「東京」にしています。
今回のテストレベルでは他はデフォルト設定で問題ありませんでした。
AWSのアクセスキーの作成
PythonのプログラムでAWSで画像認識するために、アクセスキーが必要になります。
AWSコンソール画面右上にある、各個人IDタブの「マイセキュリティ情報」から作成します。
「アクセスキー」の箇所で「新しいアクセスキーの作成」があります。
「アクセスキー ID」と「シークレットアクセスキー」を控えておきます。
ラズベリーパイとAWSで画像認識する
ラズベリーパイでAWSで画像認識できるように各種設定・カメラ接続をしていきます。
AWSのSDKのインストールやアクセスキーの管理なども実施していきます。
ラズパイのカメラを接続
ラズパイのカメラを接続しておきます。
基本的にラズパイのカメラコネクタに挿すだけで使用できます。
黒いコネクタ側を少し持ち上げてから銀色の端子が見える方を(Micro)HDMI側にして差し込めば完成です。
ケーブルを差し込んだら、黒いコネクタは押し込んでおきます。これで取り付け完了です。
ラズベリーパイのカメラの起動方法
ラズパイのカメラはデフォルトでは動作しませんので、設定を変更する必要があります。
但し変更といっても簡単です。「設定」⇒「Raspberry Piの設定」を選択します。
あとは「インターフェイス」のタブで「カメラ」を有効にしてOKをクリックします。
再起動後にはカメラが使えるはずです。
ラズベリーパイのカメラの基本的な使い方に関しては下記記事で紹介しています。
ラズパイでカメラの使い方!Pythonとコマンドの基本・応用例を紹介
AWS SDK for Python (Boto3)をインストール
今回はラズパイのPythonのプログラムからAWSの画像認識させます。
ラズパイに必要なSDK(Boto3)を下記コマンドでインストールします。
設定管理ファイル(configparser)をインストール
configparserでAWSの設定ファイル(.ini)を作成します。
AWSで作成した「アクセスキー ID」と「シークレットアクセスキー」の流出防止します。
ラズパイに下記コマンドでインストールします
iniファイルを作成する
PythonとconfigparserでAWSの設定ファイル(config.ini)を作成します。
下記順番でコンソールに入力していけば、config.iniファイルが作成されています。
(最後「…」と出る箇所はEnterを押してもらえれば大丈夫です。)
「アクセスキー ID」と「シークレットアクセスキー」は各個人のを入力してください。
参考にさせていただいた記事
今回の設定・プログラム作成で参考にさせていただいたのが下記Qiita記事です。
https://qiita.com/banquet_kuma/items/560787299b83fb924ff7
著者・運営者の方にはこの場を借りて深くお礼申し上げます。
Pythonでカメラ撮影+AWSの画像認識
「カメラ撮影」+「AWSの画像認識」をラズパイのPythonでプログラムします。
ラズパイにはデフォルトでPythonがインストールされており、誰でも簡単に使用できます。
初心者の方でも大丈夫です。下記記事で使い方を紹介しています。(リンク先はこちら)
ラズベリーパイでプログラミング入門!Pythonの簡単な始め方
Pythonのプログラム
実際のプログラムが下記です。
プログラム起動後の2秒後にカメラ撮影して写真「test.jpg」を保存します。
その後AWSで画像認識して、認識結果表示した写真「test_rekognition.jpg」も保存します。
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 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 |
# AWSを使用するためのライブラリを読み込む import boto3 # iniファイルを使用するためのライブラリを読み込む import configparser # 認識結果を表示するためのライブラリを読み込む from matplotlib import pyplot as plt from PIL import Image import random #ラズパイのカメラを使用するためのライブラリを読み込む import time import picamera #ラズパイのカメラで2秒後に撮影する with picamera.PiCamera() as camera: camera.resolution = (640, 480) camera.start_preview() time.sleep(2) camera.capture('test.jpg') #configparserのインスタンスを作る ini = configparser.ConfigParser() #あらかじめ作ったiniファイルを読み込む ini.read("/home/pi/cert/config.ini", "UTF-8") # 認識させるファイルを指定する filename = "test.jpg" #画像を開いて、サイズを取得する img = Image.open(filename) img_width = img.size[0] img_height = img.size[1] # 使用するバケットを指定する bucket = "Amazon S3のバケット名" # 使用するリージョンを指定する region = "ap-northeast-1" # サービスを利用するための識別情報(iniファイルの中身)を読み込む access_key = ini["AWS_KEY"]["awsaccesskeyid"] secret_key = ini["AWS_KEY"]["awssecretkey"] # サービスへの接続情報を取得する session = boto3.Session( aws_access_key_id=access_key, aws_secret_access_key=secret_key, region_name=region ) # S3サービスに接続する s3 = session.client("s3") # Rekognitionサービスに接続する rekognition = session.client("rekognition") # ファイルを読み込む with open(filename, "rb") as f: # 読み込んだファイルをS3サービスにアップロード s3.put_object(Bucket=bucket, Key=filename, Body=f) # S3に置いたファイルをRekognitionに認識させる res = rekognition.detect_labels( Image={"S3Object": {"Bucket": bucket, "Name": filename}}) # Rekognitionの認識結果を表示する print("Detected labels for " + filename) print() for label in res["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() # 画像と枠を表示させる colors = {} for label in res["Labels"]: label_name = label["Name"] if label_name not in colors: colors[label_name] = (random.random(), random.random(), random.random()) for instance in label["Instances"]: bb = instance["BoundingBox"] rect = plt.Rectangle( (bb["Left"] * img_width, bb["Top"] * img_height), bb["Width"] * img_width, bb["Height"] * img_height, fill=False, edgecolor=colors[label_name], ) plt.gca().add_patch(rect) plt.imshow(img) plt.savefig("test_rekognition.jpg") #plt.show() # S3サービスにアップロードしたファイルを削除する s3.delete_object(Bucket=bucket, Key=filename) |
※AWSの設定ファイル(config.ini)は筆者は「/home/pi/cert/」に保存しています。
※Amazon S3のバケット名に関しては各自で入力した名前を指定してください。
※リージョンは(筆者は)東京「ap-northeast-1」にしています。
実際のテスト動画
冒頭でも紹介しましたが、実際のテストの様子も動画で紹介しています。
プログラム起動後に「カメラ撮影+画像認識」されている様子が分かります。
ラズパイでカメラ撮影した写真
プログラム起動の2秒後にカメラで解像度640x480の写真が取れています。
「test.jpg」という名前でプログラムと同じフォルダに保存されています。
AWSの画像認識した後の写真
AWSで画像認識して、認識した結果箇所の枠を追記した写真が下記となります。
テニスボール(と人の手)が認識された箇所が色枠で記載されています。
「test_rekognition.jpg」という名前でプログラムと同じフォルダに保存されています。
AWSからの画像認識の結果
AWSから画像認識の結果はPythonのシェル画面に出てきます。
今回のテニスボールの信頼度結果は「99.999…%」でした。
今回のテスト結果を下記に貼り付けておきます。
「テニスボール」と「人の手」の信頼度(Confidence)、認識した枠(領域)が表示されています。
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 44 45 46 47 48 49 50 |
Detected labels for test.jpg Label: Tennis Ball Confidence: 99.9998550415039 Instances: Bounding box Top: 0.389507919549942 Left: 0.3096392750740051 Width: 0.22051315009593964 Height: 0.28033536672592163 Confidence: 99.9998550415039 Parents: Tennis Ball Sport Person ---------- Label: Ball Confidence: 99.9998550415039 Instances: Label: Person Confidence: 99.9998550415039 Instances: Bounding box Top: 0.4408959150314331 Left: 0.00487551698461175 Width: 0.5167486667633057 Height: 0.4087013304233551 Confidence: 98.00035858154297 Parents: ---------- Label: Tennis Confidence: 99.9998550415039 Instances: Label: Sport Confidence: 99.9998550415039 Instances: Label: Human Confidence: 99.9998550415039 Instances: Label: Sports Confidence: 99.9998550415039 Instances: Label: Sphere Confidence: 73.76881408691406 Instances: |
まとめ
今回はラズパイとAWSの画像認識に関して紹介させていただきました。
記事をまとめますと下記になります。
AWSを始めてみるにもラズベリーパイ(raspberry pi)はちょうど良いデバイスかと思います。
カメラも簡単に接続できますので画像認識のテストも楽です。
是非皆さまも試してみて下さい。
コメント