UNOQでMIPI-CSI2とUSBのカメラを使ってみた

本サイトはアフィリエイト広告を利用しています。
AI

Arduino® UNO Qの強力なLinux側コア(Qualcomm QRB2210)を使い、MIPI-CSI2カメラとUSBカメラを使った、高速なエッジAI(YOLO-Proでの物体検出)を実行します。

また、MIPIカメラの画質調整や、ハードウェアの各種性能測定(消費電流やメモリ割り当て)といった、UNO Qを使いこなすための測定結果もまとめて紹介します。

 

スポンサーリンク

UNOQでMIPI-CSI2とUSBのカメラを使ってみた

Arduino® UNO Qの強力なLinux側コア(Qualcomm QRB2210)を使い、MIPI-CSI2カメラとUSBカメラを使った、高速なエッジAI(YOLO-Proでの物体検出)を実行します。

また、MIPIカメラの画質調整や、ハードウェアの各種性能測定(消費電流やメモリ割り当て)といった、UNO Qを使いこなすための測定結果もまとめて紹介します。

 

 

 

プロジェクト・GitHubのリンク先

コンテストに提出したプロジェクトのリンク先は下記です

Attention Required! | Cloudflare

 

GiHubのリンク先は下記です

GitHub - iotengineer22/unoq-edge: This repository present solution for the Invent the Future with Arduino UNO Q and App Lab
This repository present solution for the Invent the Future with Arduino UNO Q and App Lab - iotengineer22/unoq-edge

 

UNOQ用のMIPI-CSI2の追加ボード

UNOQにMIPI-CSI2のカメラを使うには追加アドオンボードが必要です。

下記オープンソースのボードを利用しました。

GitHub - RevLmt/camboard-uno-q: shield for uno q
shield for uno q. Contribute to RevLmt/camboard-uno-q development by creating an account on GitHub.

 

 

実際に使うカメラはラズパイのカメラでOKです。

IMX219が搭載されているV2カメラを利用しています。

 

PCBWayでのボード作成

今回MIPI-CSI2のボード作成するにあたり、PCBWay様で作成させていただきました。

PCBWayで実装含めて対応していただき、正常に動作が出来ました。

この場を借りてお礼申し上げます。

中国基板試作&製作メーカー - 基板クイック試作

 

納品状態も問題なく、実装含めて約1~2週間で対応していただきました。

 

 

MIPI-CSI2カメラ(IMX219)のLinuxセットアップ

Qualcomm Linux側でPi Camera v2を動かすには、適切なデバイスツリーオーバーレイと、カーネルの選択が必要です。

 

デバイスツリーオーバーレイ(Powerfix)の適用

電源制御とエラーを解消するため、オーバーレイ(.dtbo)を結合して適用します。

 

 

カーネルのロールバックと検証

不具合を防ぐため、実績のある安定したカーネルバージョン 6.16.7 に固定して再起動します。

 

 

再起動後、必要なツールをインストールして検証します。

 

 

PythonによるEdge Impulseモデル(.eim)の実行

Linux Host側では、Edge Impulse Studioで出力したコンパイル済みの実行モデル(.eim)を使用します。

 

.eimモデルのロードと画像データのパック

Python SDKを使用して .eim を初期化し、フレームをモデル要求フォーマット(32ビット浮動小数点数)に変換します。

推論プログラムのコードの詳細は、下記GitHubで公開しています。

unoq-edge/src/mipi-cam/object-detect at main · iotengineer22/unoq-edge
This repository present solution for the Invent the Future with Arduino UNO Q and App Lab - iotengineer22/unoq-edge

 

 

WebUIからのリアルタイム画像キャリブレーション

生のカメラモジュールは、照明環境によって、「緑被り」や「コントラスト低下」が発生しがちです。

そこで、Web画面から動的にパラメータを調整できる画像処理フィルターを実装しました。

 

CLAHEとRGBゲインの調整コード

OpenCVを使い、暗室や曇ったレンズ用の除霧フィルター(CLAHE)と、手動のRGBゲイン調整をフレーム適用前に掛け合わせます。

 

 

実際のデモ動画は下記です。

 

徹底検証:ボトルネックと性能測定結果

本プロジェクトの構築を通して得られた、ハードウェアの各種測定データを紹介します。

 

① SPIクロックの違いによる転送速度(4MHz vs 8MHz)

SPIカメラから320x240 RGB565の画像を、マイコンのRAMに吸い上げる速度を測定しました。

 

* SPIクロック 4MHz: 984 ms

* SPIクロック 8MHz: 677 ms (31.2% の高速化)

マイコン側で動画レートでの取得を目指すには、Linux kernel側へ高速なSPI slaveドライバーを設定するなどの、さらなる最適化が必要です。

 

② マイコンSRAM(768KB)の割り当て内訳

STM32U585のRAM使用状況の内訳です。

 

* ビデオダブルバッファ: 440,000 Bytes (57.3%)

* TFLite テンソルアリーナ: 153,936 Bytes (20.0%)

* メインスレッドスタック: 32,768 Bytes (4.3%)

* 画像縮小用ワークスペース: 18,432 Bytes (2.4%)

* 合計RAM使用量: 87.6%

このため、メモリを静的に割り当て、平均化プーリングによって96x96に縮小して入力する設計が、非常に有効であることが分かります。

③ 各カメラ動作時の消費電流

5V給電下におけるシステムの全体的な消費電流を測定しました。

 

* UNO Q アイドル状態: 85 mA (~0.43 W)

* SPIカメラ動作中 (MCU + 推論): 296 mA (~1.48 W) — 差分 211 mA

* MIPI-CSI2カメラ動作中 (Linux + YOLO): 491 mA (~2.46 W) — 差分 406 mA

* USBカメラ動作中 (Linux + YOLO): 730 mA (~3.65 W) — 差分 645 mA

* 3カメラ同時配信中 (推論なし): 913 mA (~4.57 W) — 差分 828 mA

結果からの洞察:

同じYOLOモデルを実行する状況において、MIPIカメラはUSBカメラと比べて消費電力を約37%削減できました。

MIPIカメラはUSBコントローラ層を介さずに、低オーバーヘッドのDMA転送を行うため、省電力設計が求められる用途で非常に有利です。

 

まとめ

Arduino® UNO Qという、Linuxとマイコンが1つになったユニークなボードを駆使した、マルチカメラAIシステムを紹介しました。

 

* STM32側: 低消費電力を活かしたPIRセンサー起動とマイコンAI

* Linux側: 高画質な複数ストリーミングと、YOLOによる高速物体検出

 

エッジAI、RTOS、Linuxカメラ制御など、多くの面白い機能が体験できる構成となりました。

みなさんもぜひ、Arduino UNO Qを動かしてみてください!

コメント