<目的>
自分が留守にしているときの防犯や、来客などが気になったことはないですか。そこで防犯カメラですww。ですがコストがかかります。そこで自分で作ってみることにしました。普通の防犯カメラではつまらないので、ノンコーディング、つまり基本的にコードを書かないで作成してみました。
具体的にはラズパイカメラとopenCVで顔を認識してLINEでwebカメラのURLを送信します。URLはウェブカメラのストリーム配信しているもの、ラインを利用して自分でyes,noを判定、yesであればリアクションを返すようにします。
イメージスライド
<使用機器>
Raspberry Pi3 ModelB+
Raspberry Pi Camera Module V2
BUFFALO webカメラ BSWHD06MBK
MacBookPro macOS Mojava version10.14.3
<フロー>
・ラズパイ のセットアップ
・ラズパイカメラとopenCVで人を発見
・MQTTでenebularにpublish
・enebularでMQTTをsubscribe
・LINEでユーザーに人を認識したこととwebカメラのURLを送信
・ユーザーがカメラで確認して不審者かどうかを判別してLINEに返信する
・enebularでLINEを受信してリアクションをする
<実験方法>
Raspberry Piを使用する前に
Raspberry Piにnode-redをインストールする
openCVノードのインストール
camerapiのインストール
speakerapiノードのインストール
MQTTブローカーの作成
enebularのノードのフローを作成
Raspberry Piのフローを作成する
webカメラのセットアップ
連携させるテスト
ラズベリーパイを使用する前に
セキュリティ的には別のユーザーを作成することが推奨されますが、今回は実験であること、権限の変更が割と面倒であることからルートユーザーを使用します。
パスワードの変更とnode-redにパスワードをかけることを推奨します。
node-redのパスワード設定ははこちらのブログを参照にnode-redをインストールするときに行ってください(面倒であればやらなくても結果には影響しません)。
ルートユーザー以外では権限の変更等少しだけ難易度が上がります。
Raspberry Piにnode-redをインストールする
$ bash <(curl -sL https://raw.githubusercontent.com/node-red/raspbian-deb-package/master/resources/update-nodejs-and-nodered)
必要があれば
$ sudo apt-get install build-essential
を行なってください。
openCVのノードをインストールする
参考サイトの指示にしたがってインストールします。
https://www.npmjs.com/package/node-red-contrib-opencv
$ sudo apt-get install libopencv-dev $ cd ~/.node-red $ npm install node-red-contrib-opencv #(sudo)はつけない 必要があればnpm auditをする $ sudo npm audit
camerapiのインストール
$ cd $ sudo apt-get update $ sudo apt-get install python-picamera python3-picamera $ cd .node-red $ sudo npm install node-red-contrib-camerapi $ sudo npm audit
(こちらの作業は必要がある方だけされてください)
ユーザーの権限を確認して、必要があればユーザーをvideoグループに追加してrebootします。
$ sudo gpasswd -a user_name video $ sudo reboot permissionの変更 $ sudo chmod a+rw /dev/vchiq
speakerapiノードのインストール
参考サイトの指示にしたがってインストール
フローのパレットの管理からでもインストールできると思います。できない場合はコンソールからコマンドでインストールしてください。
https://flows.nodered.org/node/node-red-contrib-speaker
https://flows.nodered.org/node/node-red-contrib-speakerpi
$ npm install --unsafe-perm node-red-contrib-speaker
mpg321のインストール
$ sudo apt-get install mpg321 #mg321のインストール
$ amixer cset numid=3 1 #出力をアナログ(ヘッドフォンジャック)に固定
$ speaker-test -t sine -f 1000 #スピーカーのテスト $ alsamixer #音量の調整
MQTTブローカーの作成
過去記事を参考にサーバーにmosquittoブローカーをインストールしてください。
mqttブローカーを自分で用意するのが面倒であれば、「うこさん」のmqtt.uko.jp を利用してもいいと思います。
enebularのフローを作成する
enebularの使い方についてはこちらのurlを参考にしてください。
enebularを完全に理解する
ブラウザはFirefoxを推奨します。
MQTTを受信してLINEを送信する、LINEを受信してRaspberry Piに返す流れを作る。
githubの中のopencv_enebular-line.jsonを利用してフローを作成します。
node-redのメニューの読み込みからクリップボードを選択して貼り付けるのが楽です。
enebularでLINE送受信をすることにより、特別にサーバーを用意する必要がない
LINEMessagingAPIノードを使用するか、funtionノードでLINEの送受信を作成します。opencv_enebular-line.jsonの中ではfunctionノードを利用して実装しています。
functionノードの中身
var post_request = { "headers": { "content-type": "application/json; charset=UTF-8", "Authorization": " Bearer " + "Channel Access Token" }, "payload": { "to": "UserId", "messages": [ { "type": "text", "text": "カメラの前に誰かいます確認して、怪しければ「はい」怪しくなければ「いいえ」を返信してくださいhttp://999.999.999.999:8080/stream.html" } ] } }; return post_request;
Channel Access TokenとUserIdはラインで設定したものを使用してください。
なお、カメラのアドレスhttp://999.999.999.999:8080/は自分のIPアドレスを入力してください。
LINEの必要情報についてはこちらのサイトで作成してください。
こちらのサイトも参考になります。
Raspberry Piのフローを作成する
githubのraspi_nodered_opencv.json を利用してフローを作成する
webカメラのセットアップ
ノンコーディングで行うにはopenCVで認識した画像をそのまま扱うのは難しいので
別にカメラを立ち上げて使用することにしました。
MJPG-streamerを利用してカメラサーバーを立ち上げます。
https://www.hiramine.com/physicalcomputing/raspberrypi/webcamstreaming.html
MJPG-streamerをインストールします
ホームディレクトリから
$ sudo apt-get install subversion libjpeg-dev imagemagick $ svn co https://svn.code.sf.net/p/mjpg-streamer/code/mjpg-streamer mjpg-streamer $ cd mjpg-streamer $ make
インストールが終了したら立ち上げてみます。
$ cd mjpg-streamer $ sudo ./mjpg_streamer -i "./input_uvc.so -f 10 -r 320x240 -d /dev/video0 -y -n" -o "./output_http.so -w ./www -p 8080"
で立ち上げて、ブラウザからRaspberry Piの8080のポートにアクセスします。
連携して稼働させる
node-redを立ち上げて、カメラサーバーを立ち上げてみて、ラズパイカメラに顔を写して認識させてみます。この時webカメラとラズパイカメラが別々に動いていることを確認してください。
<結果>
node-redのopenCVを利用して顔認識後LINEの受信を確認しました。
LINEで送信されてきたURLにアクセスすることにより、状況を確認できました。
LINEに返信することによりアクションを起こすことができました。
<考察>
node-redとenebularを併用することによりノンコーディングで気軽にププロトタイプを作成することができますが、顔判定用のカメラは光の外乱の影響を受けやすいのでそこは気にする必要があります。
顔を認識するタイミングを人感センサを併用して調整したり、LINEを送信するタイミングを調整することによりもう少し扱いやすくなるかも知れません。
<感想>
ノンコーディングでは実装できているのだが、ラズベリーパイを使いなれない人には環境構築するのに時間がかかるかもしれません、特にユーザーを変更していたりするとpermissionの変更等でハマることが多かったのでバージョンによる癖がありそうです。
<参考URI等>
ラスベリーパイにNode-redを入れる Node-red user group Japan
openCVノードのインストール https://www.npmjs.com/package/node-red-contrib-opencv
openCVノードのgithub https://github.com/zuhito/node-red-contrib-opencv
カメラパイノードのインストール https://flows.nodered.org/node/node-red-contrib-camerapi
webカメラ で動画ストリーミング https://www.hiramine.com/physicalcomputing/raspberrypi/webcamstreaming.html
raspberrypiにmp3再生ソフトmpg321をインストールする