IoTデバイス向けのデプロイサービス「isaax(アイザックス)」を使ってみます。

今回は、RaspberryPiにカメラを接続し、サンプルアプリケーションを動かします。 isaaxを使ってインストール・ストリーミングで動作確認・プログラム修正して画像認識までを楽しく体験しましょう。

サンプルプログラムに必要なライブラリは、勉強会で配布したmicroSDに事前にインストールしています。

ご自身で環境構築もされる場合は下記コマンドをRaspberry Piで実行し、ライブラリをインストールする必要があります。

 

sudo apt-get update && sudo apt-get upgrade
sudo apt-get install build-essential cmake pkg-config
sudo apt-get install libjpeg-dev libtiff5-dev libjasper-dev libpng12-dev
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev libv4l-dev
sudo apt-get install libxvidcore-dev libx264-dev
sudo apt-get install libgtk2.0-dev libgtk-3-dev
sudo apt-get install libatlas-base-dev gfortran
sudo apt-get install python3-dev python3-pip
sudo pip3 install numpy opencv-python picamera[array] imutils flask pyzbar
sudo apt install libqtgui4 libqt4-test
sudo apt install libilmbase12 libopenexr22 libgstreamer1.0-dev

 

用意するもの

Raspberry Pi 環境

  • Raspberry Pi 2 または 3
  • SDカード
  • Picameraモジュール (v1またはv2)
  • 電源 (PCからの給電も可)
  • インターネット接続(ワークショップでは有線LANを使います)

PC環境

  • ssh 、gitコマンドをインストール
  • GitHubまたはBitbucketアカウント
  • isaaxアカウント(後述)
  • インターネット接続

IoTっぽく、ヘッドレス(キーボード、マウス、ディスプレイは繋がない)でやっていきます。 

Picameraの向きに注意しましょう!もし逆になっていた場合は、電源をOFFにしたあとフラットケーブルの方向を合わせて接続し直してください。

環境設定

Raspberry Pi

Raspbian を microSDカードにインストールし、ネットワークにつなぎます(ワークショップでは、LANケーブルを使ってRaspberry Piをネットワークに接続します)。ハンズオンではあらかじめ必要な環境は構築済みのSDカードを使用しています。

 

 

サンプルプログラムを動かしてみよう

プロジェクトの作成

デバイスにデプロイするアプリケーションをGitHubまたはBitbucketにリポジトリとして作成します。今回は、あらかじめ用意したサンプルコードをフォークして作成します。

※以前勉強会に参加した方ですでにプロジェクトを作成されている方は、フォーク元のリポジトリに加えられた変更を反映するか、新しくプロジェクトを作り直す必要があります。

プロジェクトをフォークする(GitHubのみ)

サンプルコードのリポジトリを開き、右上のForkボタンを押してリポジトリを自分のアカウントにフォークします。

 

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

 

 

isaaxにGithubアカウントでログインします。

 

 

 

isaaxのダッシュボードを開き、「+ 新規プロジェクト追加」からプロジェクトを作成します。

 

モーダルが開くので、下図のように詳細情報を入力します(プロジェクト名、 説明は任意)。

[保存]ボタンを押してプロジェクトの作成は終了です。

 

 

デバイスの登録

さて、実際にプログラムが動作するIoTデバイスをプロジェクトに登録します。

実際には、isaaxdをデバイスにインストールするだけです。isaaxdは私たちがデバイスにインストールするアプリケーションの管理(起動、停止、ログの収集等)を担っています。

 

isaaxdのインストール

プロジェクトの作成後、下図のような画面が表示されます。プロジェクトトークンはデバイスにisaaxdをインストールする際に必要となります。インストールスクリプトはそのトークンを引数としてisaaxdのインストールをワンコマンド実行するためのスクリプトです。背景が黒い方の文字列をコピーしてください。

Raspberry PiにSSH接続します。

ssh pi@<ip address>

 

コピーした文字列をraspberry piのターミナルで実行します。

上記画像のように[### isaaxd installation complete]が出力されればインストール成功です。この時点でデバイスにリポジトリの最新のコードが配信されます。

動作を確認しよう

ブラウザからRaspberry Piの<IPアドレス>:5000にアクセスするとPicameraの映像が確認できます。本来はより高い解像度、フレームレートで表示できますが、ネットワークの帯域を節約するためにフレームレートを3FPSまで落としています(サンプルコードの該当箇所)。

サンプルは、motionJPGでWebストリーミングするプログラムです。

isaax関連のログはデバイス上に

/var/log/isaaxd.log … isaaxdのログ

/var/isaax/log/project.log … ユーザーアプリケーションのログ

として保存されます。

また、配信されたプログラムは`/var/isaax/project/`に配置されます。isaaxd, ユーザーアプリケーションともにsystemdのサービスとして自動起動するように登録されます。

 

ダッシュボードの基本

ダッシュボードに戻り、登録したデバイスの状態を確認しましょう。プロジェクトトークンのモーダルを閉じ、クラスターをクリックします。

クラスターはプロジェクトに対して複数作成することができ、その下に紐付くデバイスをグループごとに分けるための機能です。この機能によって、開発中のデバイスと本番のデバイスを切り分けるといった応用的な操作が可能になります。

特になにも操作せずにデバイスを登録した場合は下図のように「DEFAULT」というクラスターが自動的に作成され、そこにデバイスが紐付きます。

クラスターページを開くと「最近のデバイス」に先ほど登録したデバイスが表示されます。「バージョン」はインストールされているisaaxdのバージョンを、「リビジョン」はインストールされているアプリケーションのコミットID(Gitで作成した履歴ごとに付与されるID)をそれぞれ示しています。デバイスをクリックしましょう。

下図はデバイスの詳細ページになります。赤色の丸で囲われたボタンをクリックするとインストールしたアプリケーションのログを確認することができます。ラズベリーパイが期待する動作をしないときなどはこちらにエラーログが上がっている可能性があります。そのほか、割り当てられているIPアドレスの確認やアプリケーションの起動・停止などの機能を備えています。

アプリケーションの更新

最後に、アプリケーションの更新方法について説明します。

一度Raspberry Piからログアウトし、PC上で先ほどフォークしたリポジトリのcamera/main.pyを編集します。

編集方法は主に2つあり、最も簡単なのはgithub上でファイルを開いて編集してしまう方法です。

この方法は簡単なのですが、複数ファイルを同時にpushしたり好みのエディターが使えないため、手を加えるファイルや回数が多くなる場合は避けた方が無難です。

もう一つの方法はローカルPCにクローンし、好みのエディターで編集し、エディターの機能でpushしたり、コマンドラインでpushする方法です。

こちらの方が難易度は上がりますが、複数のファイルを同時にpushし変更記録をスッキリさせたり、pushするまでに間違いに気がつけば簡単に修正できます。 (このテキストではgit cloneする方法は割愛します)

 

編集可能な状態になったら、main.pyの2行目をコメントアウトし、4行目コメントを外します。

この部分では、OpenCVを使った動体検知の処理を読み込んでいます。

from flask import Flask, render_template, Response 
# from processor.simple_streamer import SimpleStreamer as VideoCamera 
# from processor.pedestrian_detector import PedestrianDetector as VideoCamera 
from processor.motion_detector import MotionDetector as VideoCamera 
# from processor.qr_detector import QRDetector as VideoCamera 
# from processor.face_detector import FaceDetector as VideoCamera 
# from processor.person_detector import PersonDetector as VideoCamera

変更を終えたら、リモートリポジトリに反映します。

GitHubから直接編集した場合は、画面下方の「Commit changes」ボタンをクリックします。

数秒待ったのち、<IPアドレス>:5000をリロードして変更が反映されていれば更新成功です。このようにデバイスがネットワークに繋がっていれば、遠隔でもデバイスのアプリケーションを更新することが可能です。

 

時間に余裕がある方は…

下記課題に取り組んでみましょう。

 

課題1

先ほどまでのアップデートの容量でcamera/main.pyのインポートするモジュールを変更し、顔認識を行うようにしましょう。読み込むモジュールはcamera/processor/face_detector.pyです。

 

課題2

課題1で読み込ませたファイル、camera/processor/face_detector.pyは顔を認識した際に緑色の枠線を描画しています。42行目、cv2.rectangle()に変更を加え、任意の色で枠線を表示するように変更しましょう。

 

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

 

課題3

同じファイル、camera/processor/face_detector.pyに変更を加え、認識した顔の数をフレーム内に描画する処理を追加しましょう。フレームに文字列を描画するにはputText()を使います。

PyOpenCV putText

 

補足

isaax.jsonについて

今回使用したリポジトリのファイルには、isaax.jsonというファイルが含まれています。isaax.jsonにはデバイス上でユーザーアプリケーションを実行する際に必要な情報が含まれています。例えば、nameはデバイス上で常駐化する際のアプリケーション名となります。

サンプルコードのリポジトリにはisaax.jsonがあらかじめ配置されていて、今回は新たに作成しなくてもそのまま使えるようになっています。

{
   "name": "pifeed",
   "version": "",
   "description": "",
   "main": "main.py",
   "author": "",
   "license": "",
   "language":"python",
   "scripts": {
      "start":"python3 -u camera/main.py"
   }
}

 

事後学習のために

isaaxについてより深く知るためには、公式のドキュメントを読んだり、コミュニティで質問してみましょう。

無料の勉強会も開催しているので、ハンズオンしたい方はこちらにもご参加ください。

本格的にIoTの開発を学びたい場合は、有料の講座もご利用ください。

SNSでもIoTに関する情報を発信しています。フォローお願いします。