ローコードおよびノーコードの プラットフォームは、過去数年間で人気が急激に高まっています。 これらのプラットフォームを使用すると、コーディングの知識がほとんどまたはまったくないユーザーでも、最小限のコーディングでアプリを20倍高速に構築できます。 それらは、エキスパート開発者にとって不可欠なツールになるまで進化しました。 このようなプラットフォームは非常に視覚的であり、ユーザーフレンドリーなモジュラーアプローチに従います。 したがって、アプリを作成するには、ソフトウェアコンポーネントを所定の位置にドラッグアンドドロップする必要があります(これらはすべて視覚的に表現されています)。
Node-RED は、イベント駆動型アプリケーション向けのローコードプログラミング言語です。 これは、ハードウェアデバイス、API、およびオンラインサービスを新しく興味深い方法で結び付けるためのプログラミングツールです。 Node-RED にはブラウザベースのフローエディタも用意されており、パレット内のさまざまなノードを使用してフローを簡単に結び付けることができます。 したがって、シングルクリックでランタイムにデプロイできます。 もう一度、リッチテキストエディタを使用してエディタ内でJavaScript関数を作成できます。 最後に、Node-REDには、便利で再利用可能な関数、テンプレート、またはフローを保存できる組み込みライブラリが付属しています。
Node-REDの軽量ランタイムは Node.js上に構築されており、Nodeのイベント駆動型のノンブロッキングモデルを最大限に活用しています。 これにより、Raspberry Piやクラウドなどの低コストのハードウェアでネットワークのエッジで実行できます。 Nodeのパッケージリポジトリには225,000を超えるモジュールがあり、パレットノードの範囲を簡単に拡張して新しい機能を追加できます。Node-RED で作成されたフローは JSON を使用して保存され、共有目的で簡単にインポートおよびエクスポートできます。 オンラインフローライブラリを使用すると、最適なフローを公開できます。
ユーザーは、 Node-RED Docker公式イメージをDocker Hubから1億回以上ダウンロードしています。 この大幅なダウンロード率を推進しているのは何ですか? 開発ワークフローを合理化すると同時に、Node-RED開発者がプロジェクトに合わせたツール、アプリケーションスタック、デプロイ環境を選択して革新する自由を提供するDockerコンテナに対する需要はますます高まっています。 Node-RED公式イメージは amd64
、arm64v8
arm32v6
arm32v7
s390x
などの複数のアーキテクチャもサポートしています。
Node-REDのコンテナ化が重要なのはなぜですか?
Node-REDプロジェクトには、インストール可能なサードパーティノードの巨大なコミュニティがあります。 また、コミュニティは通常、 奇数番号のノードバージョンの使用を推奨していないことに注意してください。 このアドバイスは、Nodeの互換性の問題を修正する可能性があるため、新しいユーザーにとっては注意が必要です。
Docker コンテナで Node-RED アプリを実行すると、ユーザーは適切なデフォルトと環境変数によるカスタマイズをすばやく開始できます。 ユーザーは互換性の問題を心配する必要がなくなりました。 次に、Dockerを使用すると、ユーザーはコンテナ化されたNode-REDアプリケーションを構築、共有、実行でき、すべてのスキルレベルの開発者がアクセスできるようになります。
アプリケーションのビルド
このチュートリアルでは、Node-RED を使用して小売店の商品検出システムを構築する方法を学習します。 まず、Docker を使用せずに IoT Edge デバイスで Node-RED を手動でセットアップします。 次に、1行のコマンドを使用してDockerコンテナ内で実行する方法を学習します。 最後に、Node-REDを使用してこの検出システムを構築およびデプロイするのにDockerコンテナがどのように役立つかを確認します。 飛び込みましょう。
ハードウェアコンポーネント
- Seeed Studio reComputer J1010 with Jetson Nano
- USB/IP カメラ モジュール
- イーサネットケーブル/ USB WiFiアダプタ
- キーボードとマウス
ソフトウェアコンポーネント
Seeed Studio の再コンピューターと開発環境の準備
このデモでは、Seeed Studio reComputer を使用しています。 Seeed Studio reComputer J1010 は、Jetson Nano 開発キットを搭載しています。これは、組み込み開発者が最新のAIにアクセスできるようにする、小型で強力な手のひらサイズのコンピューターです。 NVIDIA Jetson Nano システム オン モジュール (SoM) を中心に構築され、エッジ AI アプリケーション向けに設計されています。
配線する
WiFiアダプタ/イーサネットケーブル、キーボード/マウス、およびUSBカメラをreComputerシステムに接続し、電源ケーブルを使用して電源を入れます。 手順に従って、システムの初期起動を実行します。
開始する前に、システムにNodeがインストールされていることを確認してください。 次に、次の手順に従って、Edge デバイスで Node-RED をセットアップします。
ノードのインストール.js
システムに最新の安定バージョンのNode.jsがインストールされていることを確認します。
curl -fsSL https://deb.nodesource.com/setup_16.x | sudo -E bash - sudo apt-get install -y nodejs
ノード.jsと npm のバージョンを確認する
上記のインストーラーは、Node.jsとnpmの両方をインストールします。 それらが正しくインストールされていることを確認しましょう。
# check Node.js version nodejs -v v16.16.0 # check npm version npm -v 8.11.0
ノード RED のインストール
ノード RED をインストールするには、ノードに付属の npm コマンドを使用できます.js
sudo npm install -g --unsafe-perm node-red changed 294 packages, and audited 295 packages in 17s 38 packages are looking for funding run `npm fund` for details found 0 vulnerabilities
ノード RED の実行
コマンドを使用して、 node-red
ターミナルで Node-RED を起動します。
node-red 27 Jul 15:08:36 - [info] Welcome to Node-RED =================== 27 Jul 15:08:36 - [info] Node-RED version: v3.0.1 27 Jul 15:08:36 - [info] Node.js version: v16.16.0 27 Jul 15:08:36 - [info] Linux 4.9.253-tegra arm64 LE 27 Jul 15:08:37 - [info] Loading palette nodes 27 Jul 15:08:38 - [info] Settings file : /home/ajetraina/.node-red/settings.js 27 Jul 15:08:38 - [info] Context store : 'default' [module=memory] 27 Jul 15:08:38 - [info] User directory : /home/ajetraina/.node-red 27 Jul 15:08:38 - [warn] Projects disabled : editorTheme.projects.enabled=false 27 Jul 15:08:38 - [info] Flows file : /home/ajetraina/.node-red/flows.json 27 Jul 15:08:38 - [info] Creating new flow file 27 Jul 15:08:38 - [warn] --------------------------------------------------------------------- Your flow credentials file is encrypted using a system-generated key. If the system-generated key is lost for any reason, your credentials file will not be recoverable, you will have to delete it and re-enter your credentials. You should set your own key using the 'credentialSecret' option in your settings file. Node-RED will then re-encrypt your credentials file using your chosen key the next time you deploy a change. --------------------------------------------------------------------- 27 Jul 15:08:38 - [info] Server now running at http://127.0.0.1:1880/ 27 Jul 15:08:38 - [warn] Encrypted credentials not found 27 Jul 15:08:38 - [info] Starting flows 27 Jul 15:08:38 - [info] Started flows
その後、ブラウザに移動して Node-RED エディタ http://localhost:1880
にアクセスできます。
ログ出力には、いくつかの重要な情報が共有されます。
- インストールされているノードのバージョン - RED およびノード.js
- パレットノードを読み込もうとしているときに発生したエラー
- 設定ファイルとユーザーディレクトリの場所
- 現在使用されているフローファイルの名前
Node-RED は、フローエディタにアクセスするためのウェブアドレスを提供する Node.js ベースのランタイムで構成されます。 ブラウザでアプリケーションを作成するには、パレットからワークスペースにノードをドラッグし、そこからノードを配線し始めます。 ワンクリックで、Node-REDはアプリケーションをランタイムにデプロイし、そこで実行されます。
ドッカーコンテナでのノードREDの実行
Node-RED の公式イメージは、可能な限りスリムに保つために 、ノード.jsアルパインLinux イメージに基づいています。次のコマンドを実行して、コンテナーの /data ディレクトリと呼ばれる node_red_data
名前付きボリュームを作成してマウントします。 これにより、フローの変更を保持できます。
docker run -it -p 1880:1880 -v node_red_data:/data --name mynodered nodered/node-red
これで、または http://<ip_address_Jetson>
:1880
を使用して http://localhost:1880 Node-RED エディターにアクセスできるようになりました。
小売店の商品検出システムの構築と実行
完全に機能する小売店の品目検出システムを構築するには、次の手順に従います。
構成ファイルを書き込む
カスタムテーマやカスタムnpmパッケージなど、Node-RED構成を追加するいくつかのファイルを定義する必要があります。
まず、"node-red-config"という空のフォルダを作成します。
mkdir node-red-config
ディレクトリを に変更 node-red-config
し、次のコマンドを実行して新しい NPM パッケージをセットアップします。
npm init
このユーティリティは、 package.json
ファイル作成プロセスを順を追って説明します。 最も一般的な項目のみをカバーし、賢明なデフォルトを推測しようとします。
{ "name": "node-red-project", "description": "A Node-RED Project", "version": "0.0.1", "private": true, "dependencies": { "@node-red-contrib-themes/theme-collection": "^2.2.3", "node-red-seeed-recomputer": "git+https://github.com/Seeed-Studio/node-red-seeed-recomputer.git" } }
フォルダ内に node-red-config
という settings.js
ファイルを作成し、以下の内容を入力します。このファイルは、Node-RED サーバー、ランタイム、およびエディターの設定を定義します。 主にエディターの設定を変更します。 個々の設定の詳細については、 ドキュメントを参照してください。
module.exports = { flowFile: 'flows.json', flowFilePretty: true, uiPort: process.env.PORT || 1880, logging: { console: { level: "info", metrics: false, audit: false } }, exportGlobalContextKeys: false, externalModules: { }, editorTheme: { theme: "midnight-red", page: { title: "reComputer Flow Editor" }, header: { title: " Flow Editor&amp;amp;lt;br/&amp;amp;gt;", image: "/data/seeed.webp", // or null to remove image }, palette: { }, projects: { enabled: false, workflow: { mode: "manual" } }, codeEditor: { lib: "ace", options: { theme: "vs", } } }, functionExternalModules: true, functionGlobalContext: { }, debugMaxLength: 1000, mqttReconnectTime: 15000, serialReconnectTime: 15000, }
この画像 をダウンロードして、フォルダの下に置く node-red-config
ことができます。この画像ファイルの場所は、 settings.js
先ほど作成したファイル内で定義されています。
スクリプトを書く
次のコマンドを実行して、空のファイルを作成します。
タッチ docker-ubuntu.sh
色付きの出力を印刷するために、まずシェルスクリプトでいくつかの色を定義しましょう。 これは、後でスクリプトを実行するときに出力として反映されます。
IBlack='\033[0;90m' # Black IRed='\033[0;91m' # Red IGreen='\033[0;92m' # Green IYellow='\033[0;93m' # Yellow IBlue='\033[0;94m' # Blue IPurple='\033[0;95m' # Purple ICyan='\033[0;96m' # Cyan IWhite='\033[0;97m' # White
このコマンド sudo
を使用すると、通常のユーザーは昇格された特権でコマンドを実行できるため、特定の管理タスクを実行できます。 このスクリプトには管理者権限を伴う複数のタスクの実行が含まれるため、「sudo」ユーザーとしてスクリプトを実行しているかどうかを常に確認することをお勧めします。
if ! [ $(id -u) = 0 ] ; then echo "$0 must be run as sudo user or root" exit 1 fi
Jetson 用の reComputer は、16 GB の eMMC と共に販売されています。 このすぐに使用できるハードウェアには、Ubuntu 18.04LTSとNVIDIA JetPack 4.6がインストールされているため、使用可能な残りのユーザースペースは約2GBです。 これは、一部のプロジェクトでトレーニングと展開に reComputer を使用する上で大きな障害になる可能性があります。 したがって、不要なパッケージやライブラリを削除することが重要な場合があります。 このコードスニペットは、含まれているすべてのパッケージと Docker イメージをインストールするのに十分なストレージがあることを確認します。
必要なストレージ容量がある場合は、次のセクションに進みます。 それ以外の場合、インストーラーはデバイススペースを解放するかどうかを尋ねます。 「はい」に「y」と入力すると、不要なファイルとパッケージが削除され、スペースが空きます。
storage=$(df | awk '{ print $4 } ' | awk 'NR==2{print}' ) #if storage &amp;amp;gt; 3.8G if [ $storage -gt 3800000 ] ; then echo -e "${IGreen}Your storage space left is $(($storage /1000000))GB, you can install this application." else echo -e "${IRed}Sorry, you don't have enough storage space to install this application. You need about 3.8GB of storage space." echo -e "${IYellow}However, you can regain about 3.8GB of storage space by performing the following:" echo -e "${IYellow}-Remove unnecessary packages (~100MB)" echo -e "${IYellow}-Clean up apt cache (~1.6GB)" echo -e "${IYellow}-Remove thunderbird, libreoffice and related packages (~400MB)" echo -e "${IYellow}-Remove cuda, cudnn, tensorrt, visionworks and deepstream samples (~800MB)" echo -e "${IYellow}-Remove local repos for cuda, visionworks, linux-headers (~100MB)" echo -e "${IYellow}-Remove GUI (~400MB)" echo -e "${IYellow}-Remove Static libraries (~400MB)" echo -e "${IRed}So, please agree to uninstall the above. Press [y/n]" read yn if [ $yn = "y" ] ; then echo "${IGreen}starting to remove the above-mentioned" # Remove unnecessary packages, clean apt cache and remove thunderbird, libreoffice apt update apt autoremove -y apt clean apt remove thunderbird libreoffice-* -y # Remove samples rm -rf /usr/local/cuda/samples \ /usr/src/cudnn_samples_* \ /usr/src/tensorrt/data \ /usr/src/tensorrt/samples \ /usr/share/visionworks* ~/VisionWorks-SFM*Samples \ /opt/nvidia/deepstream/deepstream*/samples # Remove local repos apt purge cuda-repo-l4t-*local* libvisionworks-*repo -y rm /etc/apt/sources.list.d/cuda*local* /etc/apt/sources.list.d/visionworks*repo* rm -rf /usr/src/linux-headers-* # Remove GUI apt-get purge gnome-shell ubuntu-wallpapers-bionic light-themes chromium-browser* libvisionworks libvisionworks-sfm-dev -y apt-get autoremove -y apt clean -y # Remove Static libraries rm -rf /usr/local/cuda/targets/aarch64-linux/lib/*.a \ /usr/lib/aarch64-linux-gnu/libcudnn*.a \ /usr/lib/aarch64-linux-gnu/libnvcaffe_parser*.a \ /usr/lib/aarch64-linux-gnu/libnvinfer*.a \ /usr/lib/aarch64-linux-gnu/libnvonnxparser*.a \ /usr/lib/aarch64-linux-gnu/libnvparsers*.a # Remove additional 100MB apt autoremove -y apt clean else exit 1 fi fi
このコードスニペットは、必要なソフトウェア(curl、 docker、 nvidia-docker2、およびDocker Compose)がインストールされているかどうかを確認します。
apt update if ! [ -x "$(command -v curl)" ]; then apt install curl fi if ! [ -x "$(command -v docker)" ]; then apt install docker fi if ! [ -x "$(command -v nvidia-docker)" ]; then apt install nvidia-docker2 fi if ! [ -x "$(command -v docker-compose)" ]; then curl -SL https://files.seeedstudio.com/wiki/reComputer/compose.tar.bz2 -o /tmp/compose.tar.bz2 tar xvf /tmp/compose.tar.bz2 -C /usr/local/bin chmod +x /usr/local/bin/docker-compose fi
次に、以下のスニペットに示すように、node-red $HOME
ディレクトリを作成し、すべての Node-RED
構成ファイルをデバイスのホームディレクトリにコピーする必要があります。
mkdir -p $HOME/node-red cp node-red-config/* $HOME/node-red
次のスニペットを使用すると、スクリプトで Docker Compose CLI を使用してコンテナー サービスを起動できます。
docker compose --file docker-compose.yaml up -d
注: Docker 作成ファイルの作成方法については、次のセクションで説明します。
スクリプト内で、、 detection
およびvideo view
に対応する3つのNode-REDブロック video input
を持つカスタムNode-REDテーマパッケージをインストールするコマンドを指定しましょう。後でこれらのノードに戻ります。
docker exec node-red-contrib-ml-node-red-1 bash -c "cd /data &amp;amp;amp;&amp;amp;amp; npm install"
最後に、スクリプトに埋め込まれた以下のコマンドを使用すると、コンテナを再起動し node-red-contrib-ml-node-red-1
てテーマの変更を実装できます。
docker restart node-red-contrib-ml-node-red-1
最後に、スクリプト docker-ubuntu.sh
を .
作成ファイル内でサービスを定義する
と同じディレクトリ docker-ubuntu.sh
内で次のコマンドを実行して、空のファイルを作成します。
touch docker-compose.yaml
ファイル内に docker-compose.yml
次の行を追加します。 これらは、アプリケーションの起動時に Docker が同時に開始するサービスを指定します。
services: node-red: image: nodered/node-red:3.0.1 restart: always network_mode: "host" volumes: - "$HOME/node-red:/data" user: "0" dataloader: image: baozhu/node-red-dataloader:v1.2 restart: always runtime: nvidia network_mode: "host" privileged: true devices: - "/dev:/dev" - "/var/run/udev:/var/run/udev" detection: image: baozhu/node-red-detection:v1.2 restart: always runtime: nvidia network_mode: "host"
アプリケーションには、次の部分があります。
- Docker イメージによってサポートされる 3 つのサービス: Node-RED
node-red
アプリ、dataloader
、およびdetection
- サービス コンテナーは
dataloader
、Pub/Sub メッセージング パターンを使用して OpenCV ビデオ ストリームを (USB Web カメラまたは RTSP 対応 IP カメラから) にport 5550
ブロードキャストします。 サービス コンテナーが USB カメラ デバイスにアクセスできるようにするには、特権:true を渡す必要があることに注意してください。 - サービスコンテナは
detection
上記のビデオストリームを取得し、YOLOv5のTensorRT実装を使用して推論を実行します。 これは、リアルタイムで物体を識別できる物体検出アルゴリズムです。
スクリプトを実行する
ターミナルを開き、次のコマンドを実行します。
sudo ./docker-ubuntu.sh
これらのスクリプトが完全に実行されるまでに約2〜3分かかります。
サービスを表示する
スクリプトが実行されたら、コンテナサービスが稼働していることを確認できます。
docker compose ps CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES e487c20eb87b baozhu/node-red-dataloader:v1.2 "python3 python/pub_…" 48 minutes ago Up About a minute retail-store-items-detection-nodered-dataloader-1 4441bc3c2a2c baozhu/node-red-detection:v1.2 "python3 python/yolo…" 48 minutes ago Up About a minute retail-store-items-detection-nodered-detection-1 dd5c5e37d60d nodered/node-red:3.0.1 "./entrypoint.sh" 48 minutes ago Up About a minute (healthy) retail-store-items-detection-nodered-node-red-1
アプリにアクセスするには、アクセスしてください http://127.0.0.1:1880/
。
組み込みノード (video input
、、 detection
および video view
) がパレットに表示されます。
ノードをパレットからワークスペースに1つずつドラッグして、ノードを配線してみましょう。 まず、パレットからワークスペースにドラッグ video input
してみましょう。 「ビデオ入力」をダブルクリックして次のプロパティを表示し、「ローカルカメラ」を選択します。
手記: ここでローカルカメラを選択して、接続されたUSBウェブカメラからビデオストリームを取得します。 ただし、RTSPを介してIPカメラからビデオストリームを取得することもできます。
Node-REDがデフォルトで「COCOデータセット」モデル名を選択することがわかります。
次に、パレットからワークスペースにドラッグします Video View
。 を Video View
ダブルクリックすると、[ プロパティ ]セクションですでに選択されていることがわかります msg.payload
。
ノードを接続する
すべてのノードをワークスペースに配置したら、ノードをワイヤリングします。 ノードは、ノードのポート上でマウスの左ボタンを押し、宛先ノードにドラッグしてマウスボタンを離すことによって、一緒に配線されます(次のスクリーンショットを参照)。
右上隅でトリガー Deploy
して、デプロイ プロセスを開始します。 これで、Node-REDがアイテムを検出するときにプロセスが機能していることを確認 detection
できるはずです。
結論
ソフトウェア開発をモダナイズする最終的な目標は、価値の高いソフトウェアをより迅速にエンドユーザーに提供することです。 Node-REDやDockerなどのローコードテクノロジーは、アイデア出しからソフトウェア配信までの時間を短縮することで、これを達成するのに役立ちます。 Docker は、最新の AI アプリケーションの構築、実行、共有のプロセスを加速するのに役立ちます。
Docker公式イメージは、慣れ親しんだ技術スタックに関係なく、独自のアプリケーションを開発するのに役立ちます。 1 つの YAML ファイルで、Docker Compose が Node-RED アプリを簡単に構築するのにどのように役立つかを示しました。 Docker Composeを使用して、実際のマイクロサービスアプリケーションを開発することもできます。 いくつかの追加手順を実行するだけで、このチュートリアルを適用しながら、はるかに複雑なアプリケーションを構築できます。 ハッピーコーディング!