技術一課の鎌田です。個人的に画像処理に興味があり、深層学習に基づく画像認識サービスであるAmazon Rekognitionを、OJT期間の終わりを機に触ってみました。
やったこと
Raspberry Pi3に接続しているウェブカメラの前から、人がいなくなったことを検知してSlackにアラートを上げるスクリプトを、Rekognitionで使えるCLIの一つ、detect-labels
を使って作ってみました。
コード
while : do fswebcam test.jpg aws s3 cp test.jpg s3://your bucket name --acl bucket-owner-full-control rm test.jpg aws rekognition detect-labels \ --image '{"S3Object":{"Bucket":"your bucket name","Name":"test.jpg"}}' \ --region us-east-1 \ --profile adminuser \ > test.json if ! cat test.json | grep "Person" > test.txt; then curl -X POST --data-urlencode 'payload={"channel": "#mychannel", "username": "webhookbot", "text": "Your employee gone somewhere!!", "icon_emoji": ":ghost:"}' https://yourincominghookurl fi sleep 5 done
上記をrekognition.sh
として保存し、sh rekognition.sh
とコマンドラインで実行することにより試すことができます。
実行結果
<着席時> 撮影画像は以下です。
ターミナルのログは、S3のアップロードで止まっています。
<離席時> 撮影画像は以下です。
Slackの画面に、無事通知が来ています。
コードの説明
最初に、fswebcamというウェブカメラ撮影用のソフトウェアを実行しています。 私が使ったRaspberry Pi3には、次のコマンドで簡単にインストールすることができます。sudo apt-get install fswebcam
次に、RekognitionにS3を参照させるためaws s3 cp test.jpg s3://bucket name --acl bucket-owner-full-control
で撮影した画像をS3にアップし、rm
でローカルのファイルを削除しています。
aws rekognition detect-labels
コマンドでは幾つかオプションが設定できるのですが、Rekognitionは東京リージョンに来ていないためus-east-1
を指定しています。なお、--profile
を指定することで簡単にクレデンシャル情報やリージョンを切り替えることができます。詳細はこちらの公式ドキュメントをご覧ください。
実行結果をtest.json
に保存して、人が写っていることを表すPerson
という文字列がtest.json
に含まれているかgrep
で確認して、含まれていなければSlackのincoming webhookを叩けるURLに対してpostが行くようになっています。含まれていればS3にアップロードして終わりです。今回5秒おきに処理をかけていますが、sleep
の値を変更すれば調整可能です。
なお、test.jsonの中身はそれぞれ以下のようになっています。
<離席時>
{ "Labels": [ { "Confidence": 64.150146484375, "Name": "Chair" }, { "Confidence": 64.150146484375, "Name": "Furniture" }, { "Confidence": 59.35727310180664, "Name": "Backpack" }, { "Confidence": 59.35727310180664, "Name": "Bag" }, { "Confidence": 53.25450897216797, "Name": "Electronics" }, { "Confidence": 53.25450897216797, "Name": "Monitor" }, { "Confidence": 53.25450897216797, "Name": "Screen" }, { "Confidence": 53.25450897216797, "Name": "TV" }, { "Confidence": 53.25450897216797, "Name": "Television" } ], "OrientationCorrection": "ROTATE_0" }
<着席時>
{ "Labels": [ { "Confidence": 99.32459259033203, "Name": "Human" }, { "Confidence": 99.32510375976562, "Name": "People" }, { "Confidence": 99.32510375976562, "Name": "Person" }, { "Confidence": 76.46696472167969, "Name": "Portrait" }, { "Confidence": 76.46696472167969, "Name": "Selfie" }, { "Confidence": 54.43049240112305, "Name": "Face" }, { "Confidence": 53.01808166503906, "Name": "Head" } ], "OrientationCorrection": "ROTATE_0" }
AWS側の操作としては、S3バケットを用意しておくだけですが、Slackでincoming webhookの設定を行う必要があります。こちらについては
当社エンジニア、坂本の記事にわかりやすくまとまっています。
http://blog.serverworks.co.jp/tech/2016/02/16/lambda-cloudwatch-alarm-to-slack/
Rekognitionで何ができるか
Amazon Web Servicesのブログには、下記のように書いてあります。
もし多数の写真の集合を持っているなら、Amazon Rekognitionを使ってタグやインデックスをつけることができます。Rekognitionはサービスなので、インフラについて設定や実行方法、またはスケールについて全く心配することなく、毎日数百万枚の写真を処理できます。画像の検索や、タグベースの閲覧、そしてあらゆる種類の対話的な発見モデルを実装することができるでしょう。 Rekognitionをいくつかの異なる認証とセキュリティの文脈で使うことができます。従業員がセキュアな場所に入る時に、ウェブカメラに映る顔と社員バッジの写真を比較することができます。関心があったり心配している物体や人に対して、写真を解析することで視覚的な監視を実行することもできます。 閲覧者のデモグラフィックデータを収集する”賢い”マーケティング広告を作ることもできます。
当社は社内に特定の社員しか入れないセキュリティルームがあるのですが、現在その制御はICカードで行っています。ICカードを不正に利用し、悪意のある人が入ってしまう可能性がゼロとは言い切れません。Rekognitionを使用すれば、現在の認証フローに顔認証を容易に組みこむことができるので、開発コストをかけずにセキュリティを強化することができます。
まとめ
思いついてから30分くらいで実装ができました。APIを使うと高度な処理も簡単に書けてしまうので、知っているか知らないかで大きく開発効率が変わると思いました。今回は人を対象にしましたが、ペットを対象にして、脱走したら通知がくるなどのアレンジをしても面白いと思います。ぜひおためしください。