この記事は
2018 年ごろに発足した TJBot コミュニティ。ハンズオンイベントなどを通じて工作や IBM Cloud を体験できるステキなコミュニティです。
しかし、コロナ禍の影響でハンズオンイベントは休止...。さみしい時間を過ごしてるなかで遂に、TJBot zero コミュニティの活動が再開することになりました。
イベントなどを再開するにあたり、TJbot zero 用のSDカードイメージを見直すことになりました。
環境に関する課題は以下の通りです。
- Node-RED のバージョンが低い(Ver 1.0.1)
- すでに利用できない node や クラウドサービスがある
わたしもコミュニティの一員として「 Node-RED のバージョンが低い」の解決にチャレンジしました。
その手順の備忘録になります。
準備
コミュニティーのGitHubレポジトリ から SDカードのイメージを取得します。この記事では、TJBot Zero SD Card Image Release 2019-10-10(JPN) をベースに作業しています。
SDカードイメージを取得したら、お手持ちのSDカードライターなどを使ってSDカードに書き込みます。
(SDカードへのイメージ書き込み手順は割愛します)
Node-RED バージョンアップ
Node-RED 公式ページを参考に、Node-RED をバージョンアップします。
SSh でログイン
TJBot zero に ssh でログインします。
ssh xxx.xxx.xx.x -l pi
Node-RED と Node.js のアップグレード
インストールされている Node-RED と Node.js をアップグレードします。
今回の手順では、Node.js のバージョンを16から20にアップグレードします。
実行コマンド
bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) --node20
(完了するまでに20~30分くらい掛かります)
アップグレードが完了すると、「こんにちは、ぼくのなまえは てぃじぇいぼっとです」 とご挨拶してくれるはずです。
Node-RED にアクセス
ブラウザを起動し、Node-RED のエディタを表示します。
http://xxx.xx.x.x:1880/
このとき、OpenCV ノードが存在しない というエラーが表示されるのは正しいです。
新しい Node.js では、既存のOpenCVノードが実行できないみたいです。
OpenCV ノードの代替ノード作成
動かないなら作ればいいじゃない!の精神で、代替ノードを作成します。
参考記事
swap領域の拡張
初めに Swap領域のサイズを拡張しておきます。拡張しておかないと、途中でメモリエラーになります。
sudo vi /etc/dphys-swapfile
変更箇所
「CONF_SWAPSIZE=100」を「CONF_SWAPSIZE=2048」に変更して保存します。
設定を変更したら、 TJbot zero を再起動します。
cmake インストール
OpenCV のモジュールをビルドするためにcmakeをインストールします。
sudo apt install cmake
OpenCV ダウンロードとビルド準備
参考記事にならって、OpenCV-4.5.3 をダウンロードします。もっと新しいバージョンがリリースされていますが、ビルドエラーになったので先達はあらまほしき事なりです。
wget https://github.com/opencv/opencv/archive/refs/tags/4.5.3.tar.gz
tar -xf 4.5.3.tar.gz
cd  opencv-4.5.3
mkdir build
cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/usr/local
OpenCV のビルドとインストール
実際にライブラリをビルドしていきます。TJBot zero(RaspberryPI Zero) の環境では、ビルドが完了するまでに20時間以上かかります。
make
sudo make install
opencv4nodejs のインストール
Node-RED から OpenCV を利用するために Node.js のパッケージをインストールします。
カレントディレクトの移動
これ以降の作業は下記ディレクトリで行います
cd ~/.node-red
nan (2.18.0)
opencv4nodejs のライブラリをビルドするためにインストールします。このパッケージをインストールしないと、途中でビルドエラーになります。
npm install --save nan
opencv4nodejs のインストール
opencv4nodejs パッケージの本体をインストールします。インストールスクリプトに自動ビルド処理が記載されていますがエラーになってしまうようなので、自動ビルドを実行しないように設定します。
export OPENCV4NODEJS_DISABLE_AUTOBUILD=1
npm install --save opencv4nodejs
opencv4nodejs のライブラリをリビルド
cd node_modules\opencv4noejs\build
export OPENCV_LIB_DIR=/usr/local/lib
make
Node-RED で function node 定義
Node-RedでOpenCVするまでのメモ を参考に、opencv4nodejsをNode-RED で利用できるように設定します。
Node-RED 再起動後ブラウザで Node-RED エディタにアクセスし、もともと opencv node が配置されていた場所に function node を配置し、フローの接続を切り替えておきます。
そして、以下のスクリプトを貼り付けます。
function detectFace(img)
{
    const classifier = new cv.CascadeClassifier(cv.HAAR_FRONTALFACE_ALT2);
    const options = {
        minSize : new cv.Size(img.width,img.height),
        scaleFactor : 1.2,
        minNeighbors : 10,
    };
    const {
        objects,
        map
    } = classifier.detectMultiScale(
        img,
        options,
    );
    return objects.map(rect => (
        {
            rect,
            face : img.getRegion(rect).copy(),
        }
    ));
}
var image = cv.imdecode(msg.payload);
const ret = detectFace(image);
msg.payload = ret;
return msg;
デプロイすると...
いままでの手順が正しく進んでいた場合、デプロイが完了すると TJBot zero のカメラに人が映り込むと、手を振って挨拶してくれるはずです💞
(後ほど、各種スクショを貼り付け予定)
