はじめに
オプトテクノロジーズの伊藤です。
もはや私の投稿はアドカレドリブンなっています。
今回は、毎年恒例となった開発合宿でIoTをテーマにハックをしたのでご紹介します。
前談
前回の投稿では、会議室の利用状況をモニタすべく、デバイスのボタンを押すという極めてアナロジーな方式に着地したわけですが、どうしても会議開始時にボタンを押し忘れる人がいるんですよね…
で、そういう人に限って「カレンダーから勝手に予定が消えた」とか言うんすよ…(メール見ろし)
そんなこともあり、パイロット運用を一時中断し、別の方式を模索してました。
開発合宿にあたり
上記の記事にもありますが、開発合宿は複数名がチームを作って同じテーマに取り組むのですが、我々IoTチームのリーダーである @mshibuya 氏がこれまた シュッとしてバーン な人でして、知的好奇心をくすぐるおもちゃをガンガン買うんですね。
そのおもちゃの中にRaspberry Pi Zero&カメラなどもあり、カメラで撮影した静止画を画像認識し、会議室の在室を確認することにチャレンジしました。
アーキテクチャー
- ラズパイに繋いだカメラモジュールによって撮影したJPEGをローカルに保存
- ローカルに保存したJPEGをAmazon S3にアップロード
- Amazon S3にアップロードしたJPEGをAmazon Rekognitionで画像認識&判定
詳細
ラズパイに繋いだカメラモジュールで撮影したJPEGを保存
カメラを扱う為のライブラリをインストール
sudo apt-get update
sudo apt-get install python-picamera
以下のコードを実行(解像度は任意)
import time
import picamera
with picamera.PiCamera() as camera:
camera.resolution = (1280, 720)
camera.start_preview()
time.sleep(1)
camera.capture('room.jpg')
保存したJPEGをAmazon S3にアップロード
ShellでAWSコマンドを叩く為にライブラリをインストール
sudo apt-get install awscli
AWS SDK for Pythonをインストール
sudo pip install boto3
AWSの認証情報を設定
aws configure
AWS Access Key ID [None]: <Key ID>
AWS Secret Access Key [None]: <Access Key>
Default region name [None]: ap-northeast-1
Default output format [None]: json
以下のコードを実行(S3のバケットは予め作っておきバケット名を指定、ファイル名は上述で保存したもの)
import boto3
s3 = boto3.resource('s3')
s3.Bucket('S3のバケット名').upload_file('room.jpg', 'room.jpg')
Amazon S3にアップロードしたJPEGをAmazon Rekognitionで画像認識&判定
以下のコードを実行
今回は、Rekognition側で付与されたラベルの内、人間(Human)か人(Person)の信頼度が95%以上で「人がいる」と判定
ラベルと信頼度はいくつかのサンプル画像で試した上で肌感で決定
import boto3
client = boto3.client('rekognition')
response = client.detect_labels(Image={'S3Object':{'Bucket':'s3のバケット名','Name':'room.jpg'}})
counter = 0
for label in response['Labels']:
if (label['Name'] == 'Human' and label['Confidence'] >= 95) \
or (label['Name'] == 'Person' and label['Confidence'] >= 95):
counter = 1
break
if counter > 0
# 人がいる時の処理
まとめ
- Arduino より Raspberry Pi の方が素早く色々できる(汎用Linuxが載っているので拡張性が高い)
- Amazon Rekognition はそれなりに認識精度が高そう(パイロット運用していないからまだ言い切れはしない)
- 開発合宿では別のメンバーが AWS IoT Core や フロントエンド を担当し、ラズパイ間の通信をMQTTで繋いで、送受信したりした(それはまた別の機会に書くか本投稿をアプデするかも)
- パイロット運用の再開は年明け