監視カメラで人を検出する方法は画像処理による動体検知等様々あるが、
ディープラーニングを用いてみようと思い立った。
そのときのいくつかの、トラブルシューティングについての備忘録である。
####1. 使用するモデルについて
(1)Masked-RCNNを使用してみる
RaspberryPi3では重すぎてうまく動かなかった・・・
RaspberryPiのスワップ領域を広げたり、様々試みたがダメだった。
(2) MobileNet SSD v2を使用してみる
こちらのサイトを参照
ラズパイ上で訓練済みモデルを使って物体検出をしてみた
MobileNetはエッジデバイスでも動かせるように軽量化されているため、RaspberryPiには最適かも。
上記サイトで紹介されているリンクから学習済みモデルをそのままダウンロードして使用してみると、RaspberryPiでもサクサクと動いた。
で、ここでは、このMobileNet SSD v2をベースに機能を拡張していく。
####2. サンプリング間隔と熱暴走
(1)サンプリング間隔
上記のモデルを使用して、以下のようなフローのプログラムを作成。
【カメラ画像取得】
↓
【AIによる物体識別】
↓
【「人間」と識別されるフレームが存在するか判定】
↓
【存在すればLINE通知を送信】
この一連のフローの実行に2~3秒程度かかった。
このフローをそのままループさせて実行。
すると、数分後には処理が停止し、RaspberryPiが固まってしまった。
熱暴走のようである。
vcgencmd measure_temp
上記コマンドで、CPU温度を確認すると、85℃くらいまで跳ね上がっている。
やはり、かなりCPUに負荷がかかっているようだ。
そこで、ループの間にsleep()を挟み、サンプリング間隔を長めにとってみた。
確かにサンプリング間隔が長いほどCPU温度の上昇率は抑えられたが、温度上昇が続くことは変わらなかった。
そして、時間の差こそはあれ、熱暴走することがわかった。
(2)RaspberryPi冷却
Amazonで、冷却ファン付のRaspberryPiケースを1000円程度で購入。
Miuzei 最新Raspberry Pi 3B+ ケース
冷却ファンの威力は素晴らしかった。
上記の処理でsleep()を挟まなくても、CPU温度が47℃前後からほとんど変化しなくなった。
半日実行しつづけても全く問題なく、熱暴走から解放された。
(3)通知をリモートから停止する
人を検知時に無条件にLINE通知を送るようにしたが、留守中の家に家族が帰宅したときにLINE通知が送信され続けるので、通知送信をリモートから止められる仕組みが必要だった。
そこで、無料のSalesforce Developerエディションを活用。
カスタムオブジェクトを作成し、パラメータ名とパラメータ値を項目として作成する。
このカスタムオブジェクトに欲しいパラメータをデータとして登録する。
RaspberryPi側のプログラムでは、作成したカスタムオブジェクトから欲しいパラメータ値をSalesforceの REST API で取得し、値に応じてLINE通知をするかしないかを選択できるようにした。
これで、リモートからSalesforceのサイトにアクセスし、カスタムオブジェクトのレコードのパラメータ値を変更することで、LINE通知する/しないを切り替えられるようになった。
同じ仕組みで、他にもきめ細かい制御をリモートから行うことができるはず。