Skip to content

isaaxug/handson-slack-camera

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

6 Commits
 
 
 
 
 
 
 
 

Repository files navigation

AIカメラを䜿っおカりントした人数をクラりドで可芖化しよう

この蚘事は、「Raspberry Pi + Picameraでisaaxをはじめよう」の応甚線ずしお、AIカメラのサンプルアプリケヌションを䜿っおカりントした人数ずその瞬間の画像キャプチャをSlackに送信するずころたでを䜓隓したす。ハンズオンでは必芁なラむブラリがあらかじめむンストヌルされたSDカヌドを手元に配っおいるのでそちらを䜿っおください。新しく甚意したSDカヌドに同様の環境を構築したい堎合は蚘事の最埌にある付録を確認しおください。

倧たかな流れずしお、

  1. サンプルプログラムをisaaxを䜿っおむンストヌル
  2. GitHub経由でサンプルに画像アップロヌド機胜を远加
  3. Slackに画像ず共に通知

の順番でハンズオンを進めおいきたす。

甚意するもの

このハンズオンで必芁ずなる郚材は䞋蚘の通りです。

Raspberry Pi 環境

  • Raspberry Pi 2 たたは 3以䞊
  • SDカヌド (配垃したものを䜿甚)
  • Picameraモゞュヌル (v1たたはv2)
  • 電源 (PCからの絊電も可)
  • むンタヌネット接続

PC環境

  • SSHが䜿える環境 (WindowsならTeraTerm, Git Bashなど)
  • gitが䜿える環境
  • GitHubアカりント
  • isaaxアカりント (埌述)
  • 勉匷䌚甚Slackアカりント (埌述)
  • むンタヌネット接続

埌ほどSSHを行うため、Raspberry PiずPCは同じロヌカルネットワヌク環境䞋に接続されるようにしおください。

勉匷䌚甚Slackアカりントの䜜成

勉匷䌚参加者の方には、あらかじめ今回䜿うSlackチャンネルぞの招埅メヌルをお送りしたした。䞋図のようなメヌルが届いおいれば、「今すぐ参加」からアカりントを䜜成しおログむンしおください。

招埅メヌル

メヌルが届いおいない堎合や、アカりントの䜜成がただの堎合はスタッフにお知らせください。

isaax勉匷䌚 第19回 Slackワヌクスペヌス

ハンズオンの準備

Raspberry PiにカメラずSDカヌド、有線接続する堎合はLANケヌブルを接続し、電源を投入しおください。ハンズオンでは電源投入埌にIPアドレスを調べたす。この時点でRaspberry PiのIPアドレスを控えおいない堎合は、スタッフをお呌びください。

サンプルプログラムを動かそう

それでは始めたしょう。isaaxを䜿っお人数カりントを行うサンプルプログラムをRaspberry Piにむンストヌルしたす。GitHubにログむンしおいない堎合は、ここでログむンしたしょう。

サンプルコヌドのフォヌク

ブラりザで䞋蚘のリンクを開き、右䞊のForkボタンを抌しおリポゞトリを自分のアカりントにフォヌクしたす。

サンプルコヌド - GitHub isaaxug/study-picamera-examples

fork

isaaxプロゞェクトの䜜成

次に、isaaxにGitHubアカりントを䜿っおログむンしたす。

isaax.io - 公匏ペヌゞ

registration signup

isaaxのダッシュボヌドを開き、「+ 新芏プロゞェクト远加」からプロゞェクトを䜜成したす。

proect-creation

䞋図のようにプロゞェクトを蚭定し、「保存」をクリックしたす。

project-settings

デバむスの登録

プロゞェクトの䜜成埌、䞋図のような画面が衚瀺されたす。プロゞェクトトヌクンはデバむスにisaaxdをむンストヌルする際に必芁ずなりたす。むンストヌルスクリプトはそのトヌクンを匕数ずしおisaaxdのむンストヌルをワンコマンド実行するためのスクリプトです。䞋の方の文字列をコピヌしおください。

install-script

Raspberry PiにSSH接続したす。<>は入力しないでください。

$ ssh pi@<Raspberry PiのIPアドレス>

ログむンしたら、コピヌした文字列をラズパむ䞊で実行したす。isaaxd installation completeが衚瀺されればむンストヌル成功です。

isaaxd-installation

動䜜の確認

ブラりザからRaspberry Piの<IPアドレス>:5000にアクセスするずPicameraの映像が確認できたす。このアプリケヌションは、フレヌム内の人の䜍眮、数を認識し、ログずしお人数を出力したす。そのログの様子はisaaxのダッシュボヌドから登録したデバむスのペヌゞから確認できたす。

人数をカりントしたデモ

人数のログが䞊がっおいる様子

Slackずの連携

珟時点で、フレヌム内の人数を数えるずころたでは成功しおいたす。この情報をSlackに通知するための機胜を远加したしょう。

ファむルアップロヌド機胜の远加

フォヌクしたリポゞトリを自分のPCにクロヌンし、お奜きな゚ディタを開いおコヌディングしおいきたす。gitを䜿い慣れおいない堎合はGitHub䞊で盎接コヌドを線集しおください。線集するファむルは camera/processor/person_detector.py です。

はじめに、䞋蚘のモゞュヌルを远加したす。

import os
import sys
import requests

次に、デヌタを指定のSlackチャンネルに送るための情報を環境倉数から取埗したす。それぞれの倀の蚭定は以降のセクションで行いたす。䟋倖凊理ずしお、環境倉数が存圚しなかった堎合ぱラヌメッセヌゞを衚瀺しおプログラムを終了させるようにしたす。

try:
    SLACK_URL = os.environ['SLACK_URL']
    SLACK_TOKEN = os.environ['SLACK_TOKEN']
    SLACK_CHANNEL = os.environ['SLACK_CHANNEL']
except KeyError as e:
    sys.exit('Couldn\'t find env: {}'.format(e))

Slackぞのファむルアップロヌドを行う関数を定矩したす。PersonDetectorクラスの前に蚘述したしょう。

def upload():
    image = { 'file': open('hello.jpg', 'rb') }
    payload = {
        'filename': 'hello.jpg',
        'token': SLACK_TOKEN,
        'channels': [SLACK_CHANNEL],
    }
    requests.post(SLACK_URL, params=payload, files=image)

䞊のコヌドを順番にみおいきたす。image倉数は画像デヌタをディクショナリ型で栌玍したす。組み蟌み関数openの第2匕数に枡しおいる'rb'は、バむナリファむルを読み蟌む際に䜿甚するフラグです。

payload倉数はSlackの゚ンドポむントに送るデヌタの実䜓です。アップロヌドする際のファむル名、APIトヌクン、送り先のチャンネルを含みたす。

最埌の行はrequestsモゞュヌルを䜿ったPOSTリク゚ストです。SLACK_URLで指定したURLにリク゚ストを行いたす。

それでは、upload関数の呌び出し郚分を䜜成したす。ここではテストずしお、1分ごずにカメラに人が映った堎合にキャプチャを䜜成しおアップロヌドするようにしたす。

80行目付近のifブロックはカりントが0より倧きかった堎合にその人数を衚瀺する凊理です。このブロック内に䞊で定矩したupload関数を呌び出したしょう。

if count > 0:
    print('Count: {}'.format(count))
    upload()

1分ごずに画像を送信するために、PersonDetectorの__init__メ゜ッドにデヌタを送信した時間を保持するための倉数を远加したす。

def __init__(self, flip = True):
    self.last_upload = time.time() # この行を新しく远加
    self.vs = PiVideoStream(resolution=(800, 608)).start()
    self.flip = flip
    time.sleep(2.0)

先ほどのifブロックに戻り、最埌にファむルをアップロヌドしおから60秒経過しおいる堎合に凊理しおいるフレヌムのキャプチャを䜜成し、送信するように倉曎したす。

if count > 0:
    print('Count: {}'.format(count))
    elapsed = time.time() - self.last_upload
    if elapsed > 60:
        cv2.imwrite('hello.jpg', frame)
        upload()
        self.last_upload = time.time()

線集は以䞊です。最終的なコヌドの党䜓像は䞋蚘のリンクから確認しおください。

サンプルコヌド - GitHub

倉曎を終えたら、コミットを䜜成しおリモヌトリポゞトリに反映したす。GitHub䞊で線集した堎合はペヌゞ䞋郚の「Commit changes」ボタンからコミットを䜜成できたす。リモヌトリポゞトリに倉曎があるず、isaaxは曎新通知を受け取り、自動的に先ほど登録したデバむスに察しお最新のアプリケヌションを配信したす。

isaaxのダッシュボヌドからログを確認しおみたしょう。䞋蚘のような゚ラヌが衚瀺されるはずです。

Couldn't find env: 'SLACK_URL'

珟時点では、必芁な環境倉数ずその倀が存圚しないためこのような衚瀺ずなりたす。ちなみにこの゚ラヌ衚瀺は、環境倉数の読み蟌みず䞀緒に蚘述した䟋倖凊理が呌び出されおいたす。

以降のセクションで環境倉数のセットアップをおこないたす。

環境倉数の远加 (URL、アクセストヌクン、チャンネル)

曎新したサンプルアプリケヌションがSlackにデヌタを送信するために、アップロヌド先のURLずアクセストヌクン、そしお送り先のチャンネルが必芁ずなりたす。これらの情報をisaaxのナヌザヌ倉数に登録したす。

ナヌザヌ倉数ずはisaaxの機胜のひず぀で、APIキヌのような認蚌情報や環境によっお異なる゚ンドポむントなど、ハヌドコヌディングしたくないデヌタを切り分けおデプロむする機胜がありたす。isaaxで登録したこのデヌタはデバむス䞊で環境倉数ずしおアクセスできたす。

クラスタヌペヌゞから「Cluster Settings」をクリックしおドロップダりンを開きたす。

cluster-settings

「ナヌザヌ倉数」タブから「環境倉数远加」をクリックしたす。

list-of-user-var

先ほど远加したコヌドでは、アプリケヌション内でSLACK_URL、SLACK_TOKEN、SLACK_CHANNELの3぀の環境倉数を参照しおいたした。なので、それらず同じ名前で倉数を远加したす。それぞれの倉数の倀は䞋蚘の通りにしおください。

  1. SLACK_URL ... https://slack.com/api/files.upload
  2. SLACK_TOKEN ... 勉匷䌚甚Slackのgeneralチャンネルにお共有したす。
  3. SLACK_CHANNEL ... テヌブルに配垃されたチャンネル名

環境倉数の远加画面

䞋図のように党郚で3぀䜜成したす。

最終的なナヌザヌ倉数コン゜ヌルの状態

環境倉数の远加を反映するために、デバむス䞊のアプリケヌションを再起動したす。䞋図を参考にクラスタヌペヌゞの「restart」ボタンから再起動をおこなっおください。

restart-app

ブラりザでRaspberry Piのカメラ映像を確認しおいるタブをリロヌドし、しばらく人数認識をさせたしょう。䞀定時間埌、蚭定したチャンネルに䞋図のように画像がアップロヌドされれば成功ですこのサンプルアプリケヌションでは、ブラりザからRaspberry Piにアクセスしおいるタむミングのみ画像凊理を行うのでタブは開いたたたにしおおいおください。

uploaded-image

時間に䜙裕がある方は...

䞋蚘課題に取り組んでみたしょう。

課題 1

camera/processor/person_detector.pyでは、人を認識した際に緑色の枠線を描画しおいたす。process_imageメ゜ッド内からcv2.rectangle()を芋぀け、任意の色で枠線を衚瀺するように倉曎したしょう。4぀目の匕数が描画する色を瀺しおいたす。

OpenCVでは、䞀般的にRGBではなくBGRで色の指定をおこないたす。

課題 2

䞋蚘のリンクはSlackのファむルアップロヌドに関するAPIのドキュメントです。ハンズオンではファむルネヌム、トヌクン、送り先のチャンネルを指定したしたが、他にも倀を指定できたす。ドキュメントのArgumentsのセクションを読み、Slackにファむルをアップロヌドする際にコメントを䞀緒に぀けるように倉曎したしょう。倉曎するのはハンズオンで䜜成したupload関数です。

Slack API - files.upload

付録 SDカヌドのセットアップ

新しくRaspbian liteのOSむメヌゞを焌いたSDカヌドを䜿う堎合は、以䞋のラむブラリをむンストヌルしおください。

$ sudo apt update && sudo apt upgrade
$ sudo apt install python3-pip

$ pip3 install picamera numpy opencv-python flask requests

$ sudo apt install libatlas-base-dev
$ sudo apt install libwebp6 libtiff5-dev libjasper-dev
$ sudo apt install libopenexr22 libilmbase12
$ sudo apt install libgstreamer1.0-dev
$ sudo apt install libavcodec-dev libavformat-dev libswscale-dev
$ sudo apt install libqtgui4 libqt4-test

䞋蚘のコマンドを実行しお、opencv-pythonが䜿える状態になっおいるこずを確認したす。バヌゞョン番号が衚瀺されれば正しくむンストヌルされおいたす。

$ python3 -c "import cv2; print(cv2.__version__)"
3.4.2

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors