Arduino UNO Qを使った基板外観検査機製作に挑戦 Part 2: 開発環境のセットアップ

Arduino UNO Qと組込み機械学習エンジン「Edge Impulse」を使用してプリント基板の外観検査システムの構築を目指しています。
このシリーズの記事では、Arduino UNO Q(066-5593)と組込み用機械学習エンジンEdge Impulseを使ったAI/MLモデルのトレーニングにより、プリント基板製造工程の外観チェックをAI化させる事を目的にしています。
パート1では、想定するユースケース、およびUNO Qのハード構成や高度なプロトタイピングを実現する開発環境App Labについて紹介しました。今回のパート2では、ハードのセットアップ、Arduino開発環境のApp LabとEdge Impulseの起動と実行、そしてモデル学習用の基板の準備までを見ていきます。
なお一般的に機械学習 (ML) は人工知能 (AI) の一部と見なされており、このシリーズ記事中は両方の用語が同じ意味で使用される場合があります。
ハードのセットアップ

私が用意した開発環境用ハードとしては、Arduino UNO Q、USB PD電源アダプタ、HDMIモニター、USBカメラ、USBワイヤレスキーボード/マウスドングル、およびこれら全てを繋いだUSB-Cハブで構成されています。UNO Q単体で開発ワークステーションとして使用できるのはとても便利ですが、実際にはほとんどの作業をネットワーク経由のPCから制御できるため、モニター、キーボード、マウスはほとんど必要ありませんでした。
三脚に取り付けられた Logitech製ウェブカメラ。
UNO Qの初回電源投入時、ユーザーアカウントやWi-Fi設定などの初期設定を行います。これは、接続されたキーボード、モニター、マウスを使うか、もしくは別のコンピューター上のApp LabとUNO QをUSBケーブルで直接接続して操作できます。

初期セットアップでは、UNO Q上のMCUとMPUの両方のファームとソフトウェアが最新のものにアップデートされます。App Labが接続されるたびに、デバイスのファーム、ソフトウェア、さらにはApp Lab IDE自体も最新版にアップデートされます。
通常、この手のボードの初期セットアップとアップデートには多大な労力が必要とされますが、Uno Qのように箱から出してすぐに使えるというのはとても快適な体験でした。
万が一、アップデート失敗やストレージのトラブルなどがあった場合は、Arduino Flasherを使用して最新のイメージまたは特定のイメージを再フラッシュできます。
App Lab 入門

Uno Qの統合開発環境(IDE)である「App Lab」は、Linux版は単一の実行ファイルとしてパッケージ化されています。またWindowsやmacOS用のインストーラはこちらからダウンロードできます。さらに、Uno Qのスタンドアローンモードでは、App Labがプリインストールされておりすぐ使える状態になっています。
USBケーブルやWi-Fiで接続されているPC上でApp Labを起動すると、自動的にUno Qボードが検出され、ボードを選択すると、初期設定時に設定したパスワードの入力を求められます。

サンプルプログラムの「Detect Objects on Camera(カメラでオブジェクト検出)」を使って設定を確認します。上の画面のようひ、メインエディタ上でこのサンプルプログラムのREADMEファイルが表示されており、左端のナビゲーションからBrick、MCU Sketchライブラリ、メインアプリケーションファイルのタブを開くことができます。

ファイルapp.yamlには、アプリケーション名、アイコン、説明、および使用されるブリックなどのメタデータが含まれています。

Video Object Detection ブリックをクリックすると、これがどのように機能するかについての説明が表示されます。

main.pyでは、このブリック用のPythonモジュールとWeb UIブリック用のモジュールがインポートされていることがわかります。UIのインスタンスが作成され、ビデオオブジェクトのストリームが設定され、オブジェクトが検出されたときに呼び出されるコールバックが登録されています。

アプリケーションのユーザー インターフェイスを提供する HTML を調べることができます。

Web ブラウザーのクライアント側で実行される JavaScript コードとともに、Uno Q への WebSocket 接続を確立し、オブジェクトが検出されたときなどに Web ページを更新します。

アプリケーションを起動するには、[実行] ボタンをクリックするだけです。起動中はコンソールに白いテキストが出力され、アプリケーションが起動に成功し実行中になると緑色に変わります。

Uno QのIPアドレスは、IDE下部のステータスバーで確認できます。また、ストレージ使用量、RAM使用量、CPU使用率も確認できます。

Uno Q に SSH で接続しarduinoユーザーとしてログイン、以前と同じパスワードを使用してdocker psを実行すると、2つのコンテナーが起動、1 つがポート 7000 にバインドされていることが確認できます。

ウェブブラウザでUno QのIPアドレスとポート7000を指定すると、UIが読み込まれました。ワイヤレスマウスをカメラの下に置くと、AIモデルは予想通り、高い確度でこれを検出しました。
プロセス全体は非常にシンプルで、必要に応じてサンプルのコピーを保存し、それを編集して独自のアプリケーションを作成することもできます。
次は、AIモデルのトレーニングとデプロイのタスクを簡素化するEdge Impulseについて詳しく見ていきましょう。
Edge Impulseのセットアップ
AIモデルの選択や学習は、利用可能なモデルと対象ハードウェアへの適合性を評価し、トレーニングパイプラインを策定し、様々なパラメータを調整し、データを収集・処理し、トレーニングとテストを繰り返していくため、時間のかかるプロセスになりがちです。
Edge Impulseは、エッジデバイスにおけるこのタスクを大幅に簡素化し、豊富な機能を備えた無料の開発者プランを提供しています。
アカウントを作成し、Arduino UNO Q の Edge Impulse ドキュメントを参照して、SSH 経由でボードに接続しました。セットアッププロセスでは、Node.jsのパッケージリポジトリを設定し、他の依存関係とともにインストールしました。
次に、Edge Impulse Linux CLIをインストールし、edge-impulse-linuxコマンドでUno QをEdge Impulse Studioに接続させまた。
カメラを統合

残念ながら、最初の実行ではLogitech製ウェブカメラ C920 Proが検出されませんでしたが、Edge Impulseのフォーラムを検索することで簡単に解決策を発見しました。これはカメラを操作するために使用しているプラグインが原因で、GStreamerの起動引数をオプションで指定することで解決できました。
libcamera プラグインを使用するデバイスでは --gst-launch-args が不要になるように、Edge Impulse ソフトウェアが更新される可能性があります。

フォーラム投稿から別のカメラ用の Gstreamer 引数を単にコピーするのではなく、gst-device-monitor-1.0コマンドを実行して正しい文字列を確認しました。
$ edge-impulse-linux --gst-launch-args "libcamerasrc camera-name='/base/soc\@0/usb\@4ef8800/usb\@4e00000-1.3:1.0-046d:08e5' ! video/x-raw,width=640,height=480 ! videoconvert ! jpegenc"
Logitech C920 Pro ウェブカメラ用のコマンド。
次に、CLI ツールからカメラのデバイス名を入力するよう要求されました。

コマンドは正常に完了し、UNO Q が Edge Impulse Studio のプロジェクトに接続されました。

特に便利な機能は、デバイスを接続すると、Web インターフェースを使用してカメラをプレビューし、直接データのサンプリングを開始できることです。
もっと良いカメラを
一通りの学習をすすめていくうちに、当社の用途ではより極小SMD部品を鮮明に撮影したり手動での制御が必要であったため、現在のLogitechのC920は適さないことが明らかになってきました。

そのため、ウェブカメラではなくデジタル顕微鏡のFortex HD5-MIC USB 2.0に置き換えることにしました。 (028-3421) Cマウントズームレンズ、LEDリング照明、HDMI出力に加え、USB出力も備えています。当初は、フォーカスとフレーミングを素早く簡単に行えるよう、顕微鏡をモニターに直接接続してセットアップしていました。しかし、HDMI出力とUSB出力を切り替える手間を省くため、Uno Qにユーティリティツールのguvcviewをインストールしました。
$ sudo apt update && sudo apt install guvcview
するとUno Q に接続されたモニターを使用して、ユーティリティをローカル側で制御できるようになりました。

もちろん、別のLinuxコンピュータから接続し、sshの-Yオプションを使用してグラフィカル出力をローカルシステムに転送することもできます。ただし、このようなX11アプリケーションを転送する場合、フレームレートの低下の可能性に注意する必要があります。(カメラの設定のみに使用する場合は、通常は問題になりません。)

学習用の基板を固定するため、中央下部の8つのSMDランジスタがはっきりと見えるよう、テープで固定したシンプルな固定具をMDFのレーザーカットで作成しました。
USB 顕微鏡でサポートされているフォーマットをリスト出力するためにv4l2ctlを実行しました。
$ v4l2-ctl --device=/dev/video0 --list-formats-ext
その結果、次の出力が得られました。

その結果、4つの解像度レベルで、かつMJPEG または H.264 でエンコードされたビデオを 30 fps でストリーミングできると判断しました。
USB顕微鏡をEdge Impulse Linux CLIで使用したところ、ストリームサイズと、それほど高速ではないブロードバンドのアップロード速度が原因と思われる安定性の問題が発生しました。しかし、ご安心ください。Edge Impulseは、スマートフォンで画像をキャプチャしたり、Amazon S3、Google Cloud Storage、Microsoft Azure Blob Storageなどのクラウドストレージバケットを追加したり、コンピューターから画像をアップロードしたりするなど、豊富なデータ取得オプションを提供しています。
そのため、Studio でのビデオ フィードとキャプチャは便宜上のものであり、最終的には ML モデルが Uno Q で実行されるため、静止画をキャプチャして手動でアップロードすることにしました。いつかこの点に戻って、より安定した Gstreamer パイプラインを構築できるかどうかを確認し、Edge Impulse Studio 内から直接プレビューとサンプリングを行えるようにする予定です。
$ gst-launch-1.0 v4l2src device=/dev/video0 num-buffers=1 ! image/jpeg, width=640, height=480, framerate=30/1 ! filesink location=PCBA-01.jpg
上記のパイプラインは、カメラを640x480解像度、30フレーム/秒で設定し、1フレームをJPEGファイルにキャプチャします。もちろん、カメラや画像フォーマットによってコマンドは異なりますが、重要なのは、デバイス上での画像キャプチャとフォーマットに関しては、GstreamerとLinuxエコシステムの柔軟性をすべて活用できるということです。
もう一つのCLI
Edge Impulse Linux CLIはLinuxデバイス上でのデータ収集と推論実行に使用されますが、もう一つのCLI「Edge Impulse CLI」はローカルデバイスの制御、インターネットに接続されていないデバイスのデータ同期のためのプロキシとしての機能、そしてローカルファイルのアップロードと変換に使用されます。私たちのケースでは、これは画像のアップロードに役立ち、画像をラップトップにコピーしてWebブラウザでアップロードするという追加の手順を省くことができます。
以前に Node.js をインストールしていたので、次のコマンドで Edge Impulse CLI を UNO Q にインストールできました。
$ sudo npm install -g edge-impulse-cli
テスト学習用のボード

機械学習のモデルトレーニングとテストのために、完成品の基板と、部品を取り外した基板をいくつか用意してました。
次のステップ
ハードのセットアップと検証、ツールの設定、学習用ボードの準備が整いました。次回のパート3では、画像のキャプチャ、MLモデルのトレーニング、そしてそのパフォーマンステストを行います。その後、これらを物理的な入出力と統合するアプリケーションの構築に取り掛かります。
— Andrew Back
コメント