エッジでのノーコードAIビジョンを使用した小売店の商品検出システムの構築と展開

小売店の品目検出

ローコードおよびノーコードの プラットフォームは、過去数年間で人気が急激に高まっています。 これらのプラットフォームを使用すると、コーディングの知識がほとんどまたはまったくないユーザーでも、最小限のコーディングでアプリを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公式イメージは amd64arm64v8arm32v6arm32v7 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 の再コンピューターと開発環境の準備

このデモでは、Seeed Studio reComputer を使用しています。 Seeed Studio reComputer J1010 は、Jetson Nano 開発キットを搭載しています。これは、組み込み開発者が最新のAIにアクセスできるようにする、小型で強力な手のひらサイズのコンピューターです。 NVIDIA Jetson Nano システム オン モジュール (SoM) を中心に構築され、エッジ AI アプリケーション向けに設計されています。

配線する

WiFiアダプタ/イーサネットケーブル、キーボード/マウス、およびUSBカメラをreComputerシステムに接続し、電源ケーブルを使用して電源を入れます。 手順に従って、システムの初期起動を実行します。

アイテム検出USBカメラ

リコンピュータシステム

開始する前に、システムに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;amp;lt;br/&amp;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;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;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を使用して、実際のマイクロサービスアプリケーションを開発することもできます。 いくつかの追加手順を実行するだけで、このチュートリアルを適用しながら、はるかに複雑なアプリケーションを構築できます。 ハッピーコーディング!

参照:

フィードバック

「エッジでノーコードAIビジョンを使用した小売店の商品検出システムを構築して展開する」に関する0の考え