1. はじめに
こんにちは!ネクスティ エレクトロニクス開発部員です。
私たちはネクスティ エレクトロニクスで各種エッジAIデバイスの技術サポートを担当しています。
このコラムではNXPのi.MX 93を利用した人物トラッキングカメラのデモをご紹介します。
1-1. エッジAIのメリットとi.MX 93の特長
近年、クラウドに依存しないエッジAIが注目を集めています。ネットワーク遅延を排除したリアルタイム性、通信データの削減による低消費電力、そして個人情報を外部に送信しないプライバシー保護はスマートデバイスや産業機器において大きな価値を持ちます。
本コラムではこれらのメリットを活かした具体例として、「人物の顔を検出し、サーボモータで追従するカメラ」のデモを紹介します。
このデモの核となるのが、NXPのi.MX 93です。
i.MX 93は最大0.5 TOPSの演算性能のNPU(Neural Processing Unit)を搭載し、TensorFlow LiteやONNXなどのAIモデルを効率的に実行できます。
CPUはArm Cortex-A55とリアルタイム制御に適したCortex-M33を組み合わせたハイブリッド構成により、画像処理とモータ制御を同時に安定して実現可能です。さらに、PWMやI²Cなど豊富なペリフェラルを備えており、AI推論とデバイス制御を一体化したシステム構築に最適なプラットフォームです。
以下ではFRDM i.MX 93開発ボードを利用して顔検出モデルの実行からサーボモータ制御、そして人物追従カメラの構築までをステップごとに解説します。
AI推論からモータ制御までを全てエッジデバイス単体で完結しているため、 クラウド通信による遅延がなく、低消費電力かつ高いリアルタイム性を実現しています。
ぜひこのデモを通じてi.MX 93の可能性を体感してください。
1-2. システム構成
USBカメラから入力された映像をOpenCVで取り込み、NPU上でリアルタイムに顔検出を行います。
画面内で最も大きく検出された顔(=最も近い人物)を追尾対象として選択します。
追尾対象の人物位置が画面中央からズレた場合、サーボモータを駆動して常に画面中央付近に収まるようにカメラの向きを自動調整します。
デモ機のカメラ部拡大と全体写真です。
1-3. i.MX 93NPUとeIQToolkitの概要
i.MX 93の大きな特長の一つが、NPU(Neural Processing Unit)をSoCに内蔵している点です。
i.MX 93は最大0.5TOPSの演算性能を持つNPUを搭載しており、画像認識や物体検出、顔検出といったAI推論処理を CPUに大きな負荷をかけることなく実行できます。
CPUのみでAI推論を行う場合、処理負荷の増大や消費電力の増加が問題になりがちですが、 NPUを活用することで、
- 低消費電力でのAI推論
- 安定したリアルタイム処理
- CPUリソースを他の制御処理に割り当てることが可能
といったメリットを得ることができます。
本デモでも、顔検出処理はNPU上で実行し、CPUは映像表示やサーボモータ制御を担当する役割分担を行っています。
NXPはAIのモデルを扱う環境としてeIQ Toolkitを提供しています。
TensorFlow LiteやONNXで作成したモデルを、 i.MXシリーズなどNXPのSoC/マイコン上で実行できる形式へ変換・最適化を行うことができます。
本デモでは既に用意されているモデルを使っているためeIQ Toolkitの説明は割愛しますが、 詳細についてeIQ Toolkitのホームページを確認いただければと思います。
2. NXP Yocto Project BSPについて
FRDM i.MX 93開発ボードはeMMCにNXP Yocto Project BSP(以下、BSPと記載します)が書き込まれた状態で出荷されていますが、今回はPWM機能を利用するため構成を変更する必要があります。
BSPのビルドの手順について、技術コラム i.MXの開発環境を構築してみた (Yocto編) として公開していますので合わせて参考にしていただければと思います。
それではBSPのビルドを行っていきましょう。
2-1. ホスト推奨環境
ビルドを行うPCの推奨スペックです。
| 項目 | 必要条件 |
|---|---|
| OS | Ubuntu20.04以降 |
| HDD | 最小50GB、推奨250GB以上 |
| CPUコア | 推奨8スレッド |
| メモリ | 推奨16GB以上 |
| USB | USB2.0またはUSB3.0を1つ以上搭載 |
2-2. ビルド手順(簡易版)
ビルドの流れを示します。詳細については参考リンクをご覧ください。
1 まずBSPのビルドに必要なコマンドをインストールします。
ターミナルを起動し、以下を実行してください。$はターミナルプロンプト記号です。
$ sudo apt-get install gawk wget git-core diffstat unzip texinfo gcc-multilib \ build-essential chrpath socat cpio python python3 python3-pip python3-pexpect \ xz-utils debianutils iputils-ping python3-git python3-jinja2 libegl1-mesa libsdl1.2-dev \ pylint3 xterm rsync curl zstd lz4 libssl-dev
2 repoユーティリティをインストールします。
$ mkdir ~/bin
$ curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
$ chmod a+x ~/bin/repo
$ export PATH=~/bin:$PATH
3 gitの設定を行います。
$ git config --global user.name "Your Name"
$ git config --global user.email "Your Email"
$ git config --list
4 BSPのセットアップを行います。
$ mkdir imx93-yocto
$ cd imx93-yocto
$ repo init -u https://github.com/nxp-imx/imx-manifest -b imx-linux-scarthgap -m imx-6.6.36-2.1.0.xml
$ repo sync
5 FRDM i.MX 93開発ボード用のレイヤを統合します。
$ cd ./sources # imx93-yocto/sourcesに移動します
$ git clone https://github.com/nxp-imx-support/meta-imx-frdm.git
6 以下のコマンドを実行してFRDM i.MX 93開発ボード用のBSP環境を構築します。
$ MACHINE=imx93frdm DISTRO=fsl-imx-xwayland source sources/meta-imx-frdm/tools/imx-frdm-setup.sh -b frdm-imx93
7 ビルドを行います。利用しているPCによりますが、この工程は数時間以上かかります。
$ bitbake imx-image-full
8 ビルドが終わったらSDカードにイメージを書き込みます。SDカードをFRDM i.MX 93開発ボードに差し込んで起動すればOKです。/dev/sdXには書き込むSDカードのパスを指定します。
イメージ名はディレクトリー内のwic.zstファイルを指定してください。
$ zstdcat tmp/deploy/images/<image_name>.wic.zst | sudo dd of=/dev/sdX bs=4M status=progress conv=fsync
2-3. 動作確認
SDカードをFRDM i.MX 93開発ボードに差し込みます。キーボード、マウス、ディスプレーを接続して電源を投入してください。
BSPが起動すると以下のような画面が表示されます。
3. サーボモータ制御
3-1. PWMの基本と設定
今回のシステムではMG90Dというホビー向けのサーボモータを利用しています。このサーボを駆動するには次のようなパルス信号が必要となります。i.MX 93にはTPM(Timer・PWM Module)という高精度なPWM信号を出力するペリフェラルが搭載されているのでこれを使って制御します。
ビルドしたBSPを書き込むとFRDM i.MX 93開発ボードのPWM信号の出力は基板上のRGB-LEDに接続された状態になります。そのためサーボモータを制御するためにはこの出力をヘッダーピンへ変更する必要があります。
BSPでPWMの出力ピンを変更するためにはビルド時にレイヤを追加、修正するなどの手順が必要になりますが、今回は簡易にDTBファイルを変更してPWMの出力ピンを変更することにします。
3-2. DTBファイルとは?
DTBファイルとはDevice Tree Blobファイルの略です。Linuxカーネルは起動時に自分が動作しているSoCのハードウェア構成を知る必要があります。この情報をバイナリ形式で格納したものがDTBファイルです。
DTBファイルはテキストで記述されたDTS(Device Tree Source)ファイルから変換されます。DTSファイルのハードウェア構成情報を修正することでPWMの出力先のピンを変更することが出来るようになります。
以下に具体的な手順を示します。
3-3. DTBファイルからDTSファイルへの変換
"2.NXP Yocto Project BSPについて"で書き込んだSDカードをホストPCで読み込みます。マウントされたドライブを見ると/bootディレクトリーが見えるはずです。このディレクトリーにあるimx93-11x11-frdm.dtbをホストPCの適当な作業ディレクトリーへコピーしてください。
DTBファイルはバイナリフォーマットなので、修正を行うにはソースファイルへ変換する必要があります。
もし、ホストPCにdtcが見つからない場合は以下のコマンドでインストールしてください。
$ sudo apt update
$ sudo apt install device-tree-compiler
$ dtc --version
バージョンが表示されればdtcがインストールされています。
DTBファイルをソースファイルに変換するには、以下のコマンドを実行します。
$ dtc -I dtb -O dts -o imx93-11x11-frdm.dts imx93-11x11-frdm.dtb
ディレクトリーにimx93-11x11-frdm.dtsが作成されれば成功です。
3-4. DTSファイルを修正して、PWM信号をヘッダーピンへ出力する
次にこのDTSファイルを修正して、PWM信号の出力先を変更します。
任意のテキストエディタでimx93-11x11-frdm.dtsをオープンしてください。
エディタで”pinctrl@443c0000”を検索し、続く"{}"の中に以下の内容を追加します。{}の内側であれば場所はどこでもOKです。
pinctrl@443c0000 {
....
+ tpm4grp {
+ fsl,pins = <0x24 0x1d4 0x00 0x01 0x00 0x19e>;
+ phandle = <0x80>;
+ }
....
};
この内容によりi.MX 93ピンコントローラの設定を変更しています。具体的にはPWM信号をGPIO_IO05から出力する設定となっています。
次に”pwm@424f0000”を検索し、先ほどと同様に{}の中に以下の内容を追加します。
pwm@424f0000 {
+ pinctrl-0 = <0x80>;
}
この内容により、先ほど設定したピンコントローラの出力先設定がPWMデバイス(TPM4-CH0)に反映されます。つまり、TPM4-CH0で生成されたPWM信号がGPIO_IO05から出力されようになります。
3-5. DTBファイルの更新
変更したDTSファイルは名前を変えてimx93-11x11-frdm-pwm.dtsとして保存しましょう。dtcコマンドでDTBファイルへ変換します。次のコマンドを実行してください。
$ dtc -I dts -O dtb -o imx93-11x11-frdm-pwm.dtb imx93-11x11-frdm-pwm.dts
変換されたimx93-11x11-frdm-pwm.dtbをSDカードの/bootディレクトリーへ書き込んでください。
3-6. u-bootの設定
FRDM i.MX 93開発ボードとホストPCをUSB-Cケーブルで接続します。ホストPCでUART通信ソフト(minicom, teratermなど)を起動します。ポート設定は以下のようにします。
| 項目 | 設定値 |
|---|---|
| 通信速度 | 115200 |
| データビット長 | 8 |
| ストップビット長 | 1 |
| パリティ | 無し |
FRDM i.MX 93開発ボードの電源を入れると、ターミナルにBSPのブートログが表示されます。
ターミナルでエンターキーを押してブートシーケンスを停止します。
以下のように入力して改造したDTBファイルを切り替えます。これでPWMペリフェラルの出力GPIOポートが変更されるようになりました。
$ setenv fdtfile=imx93-11x11-frdm-pwm.dtb
$ saveenv
次のコマンドで再起動します。
$ bootd
3-7. サーボモータの接続
ここまでの手順でPWM信号をGPIO_IO05から出力できるようになりました。
まず、サーボモータをFRDM i.MX 93開発ボードに接続しましょう。
サーボモータを制御するには3つの信号が必要です。
| ピン | ケーブルの色 | 解説 |
|---|---|---|
| PWM | 橙 | PWM信号 |
| VCC | 赤 | 電源 |
| GND | 茶 | グラウンド |
サーボモータは外部の負荷に応じて消費電力が大きく変わる場合があり、電源の安定性に影響を与える場合があります。
そのため本来はサーボモータへの電力は別の電源から供給したほうが良いですが、今回は小型のウェブカメラを動かすだけですのでFRDM i.MX 93開発ボードから供給することにします。
FRDM i.MX 93開発ボードのコネクターのピン配置以下のリンクを参照してください。
UM12181: FRDM-IMX93 Board User Manual
GPIO05, VCC, GNDはP11のEXPIコネクターから出力されています。
| ピン番号 | 名前 |
|---|---|
| 2, 4 | +5V |
| 6, 9, 14, 20, 25, 30, 34, 39 | GND |
| 29 | GPIO05(PWM) |
この記事では下の図のようにP2(+5V), P39(GND), P29(PWM) に接続しました。
3-8. サーボモータの制御
サーボモータが接続できたので、いよいよ制御してみましょう。
PWM信号の出力は/sys/class/pwm以下のファイルを通じて制御します。
まずPWMペリフェラルを有効化します。
# 3-4で設定したPWMペリフェラルの有効化
$ cd /sys/class/pwm/pwmchip4
$ ls
device export npwm power subsystem uevent unexport
# pwmを有効にする
$ echo 0 > export
# pwm0が見えるようになる
$ ls
device export npwm power pwm0 subsystem uevent unexport
次にpwm0のパラメーターを設定します。まずは有効化されたpwm0のファイルを見てみましょう。
$ cd pwm0
$ ls
capture duty_cycle enable period polarity power uevent
各ファイルの概要を以下にまとめます。
| ファイル名 | 解説 |
|---|---|
| capture | 入力モードで利用する場合に利用。今回は使いません。 |
| duty_cycle | PWMのON時間をナノ秒単位で指定します。 |
| enable | PWM出力の有効、無効を制御します(0: 無効、 1: 有効)。 |
| period | PWMの1サイクルの時間をナノ秒単位で指定します。 |
| polarity | PWM出力の極性を切り替えます。今回は使いません。 |
| power | 電源管理用。今回は使いません。 |
| uevent | カーネルが利用。今回は使いません。 |
つまり、PWM信号を出力するにはduty_cycle, period, enableの3つに書き込めばOKです。
3-1の図に示したように制御するサーボモータは周期が50ms、制御パルス幅は0.5-2.4msです。
したがって以下のようにファイルに書き込むとサーボが回転します。
# 1サイクルを50ms(= 50000000ns)に設定
$ echo 50000000 > period
# パルス幅を0.5ms(= 500000ns)に設定
$ echo 500000 > duty_cycle
# PWMを出力開始
$ echo 1 > enable
以降はduty_cycleに500000(0.5ms) - 2500000(2.5ms)の範囲で書き込めばモーターが回転します。
プログラムから制御する場合は、上で説明したファイルをオープンして書き込んでください。
4. 顔検出の実装
4-1. eIQモデルの紹介
i.MX 93上で動くAIデモをNXPが公開しています。
物体検出、手のジェスチャ検出、顔認識、画像分類のデモが含まれています。
詳細はNXPが公開している i.MX Machine Learning User’s Guide 9.eIQ demos をご確認ください。
4-2. 顔検出モデルの実行
各種のデモは/usr/bin/eiq-examples-gitディレクトリーに保存されています。
初期状態ではモデルが準備されていないためWeb上からモデルをダウンロード及び変換するpythonスクリプトを実行します。
$ cd /usr/bin/eiq-examples-git
$ python3 download_models.py
このpythonスクリプトはデモに使用するモデルのダウンロードと、i.MX 93のNPU(Ethos-U)で処理を行うためのVela変換を行います。
初期セットアップ後、下記コマンドで顔検出デモの実行を行うことができます。
$ cd face_recognition
$ python3 main.py -i /dev/video0 -d /usr/lib/libethosu_delegate.so
顔検出デモでは画面内に写った人の顔にバウンディングボックスを表示し、キーボードからその人物の名前を登録することができます。
詳細についてはi.MX Machine Learning User’s Guide 9.eIQ demosを参照してください。
5. 人物トラッキングカメラの構築
5-1. 追尾アルゴリズム
顔検出のモデルを使って顔を追尾するデモを作成します。
前の章で実行したデモではface_detection.pyで顔の座標を取得します。
この仕組みを応用して下記のような流れを実装します。
1. 顔の座標を取得
顔検出デモでは下記の部分で検出した顔の座標(x1,y1,x2,y2)を取得しています。
x1, y1, x2, y2 = box.astype(np.int32)
h, w, _ = img.shape
x1 = max(x1-PADDING, 0)
x2 = min(x2+PADDING, w)
y1 = max(y1-PADDING, 0)
y2 = min(y2+PADDING, h)
cv2.rectangle(img, (x1, y1), (x2, y2), (0,0,255), 2)
2. 顔の中心座標を計算
顔の座標(x1,y1,x2,y2)が取得できたので下記のようなコードで顔の中心座標を計算します。
cx = (x1 + x2) // 2
cy = (y1 + y2) // 2
3. 顔の中心座標のX値が画面中央から±20%に収まらない場合は中央側にカメラを移動
下記のような処理でX座標が中央から20%以上離れた場合にサーボを動かし、中央側にカメラを移動させます。
中央±20%で反応しないようにしているのはカメラが過敏に中央に戻そうとしてガタつくことを防ぐ目的です。
center_left = int(w * 0.4) # 中央20%の左端
center_right = int(w * 0.6) # 中央20%の右端
if cx < center_left:
# 画面の左側に顔がある → サーボを「左」に少し動かす
elif cx > center_right:
# 画面の右側に顔がある → サーボを「右」に少し動かす
else:
# 中央20%以内なら何もしない
5-2. 動作デモ
実際に作成したデモを動かしてみます。
カメラが正面を向いて人物の顔を認識しています。
正面から移動し、カメラに向かって右側に移動した状態です。
カメラが追尾して人物を中心に捉えるように回転しています。
同様にカメラに向かって左側に移動した状態です。
やはりカメラが追尾し、人物を中心に捉えるように回転しています。
まとめ
このようにi.MX 93 は優れたエッジAI性能とデバイスを制御する多数のペリフェラルを持つため簡単にエッジAIアプリケーションを構築することができます。
また、今回利用した顔検出モデル以外にもi.MX 93のデモではジェスチャー検出、画像分類、物体認識といった様々なデモが用意されており、 エッジAIの能力をすぐに試すことができます。
さらにエッジAIにはリアルタイム性、プライベート情報の保護、低消費電力という利点があります。
これらの特性を活かせば、以下のようなアプリケーションをはじめとして様々な製品やソリューションが考えられるのではないでしょうか?
- 移動台車、ロボット(人物検出、センサー・IO制御)
- スマートドア(人物検出、ジェスチャ検出、センサー・IO制御、Matterとの連携)
- ファクトリーオートメーション(人物検出、画像分類、センサー・IO制御)
本記事がお客様の課題を解決し、製品の付加価値を向上する手助けとなれれば幸いです。
また、ネクスティ エレクトロニクス開発部では今回ご紹介したi.MX 93 以外の i.MX シリーズを使用した製品開発や技術サポートを行っています。
本コラムでは概要についてご紹介しています。詳細についてはお知りになりたい場合は個別にお問い合わせください。
このほかにもお客様のご要望にマッチする様々な製品のご紹介できますので、ぜひお気軽にお問い合わせください。
参考リンク
お問い合わせ
関連技術コラム
関連製品情報

NXPの車載CAN/LINトランシーバー製品の特徴を徹底解説
車載ネットワーク製品をお探しのECU開発メーカー様向けに、車載環境の厳しい条件に耐えることのできる、NXPの車載CAN/LINトランシーバー製品の特徴について解説します。
- NXP Semiconductors N.V.
- NEXT Mobility
- ICT・インダストリアル

NXPの車載向けLEDドライバーの紹介
NXPの車載向けLEDドライバーをご紹介します。定電圧・定電流や高精度PWM、I2C/SPI対応で、複数LEDや表示器の調光に適した製品群です。
- NXP Semiconductors N.V.
- NEXT Mobility

NXPのNPUを搭載したi.MX/MCXによるエッジAIソリューションをご紹介
利用が急増しているエッジAIについて、実際の機器を踏まえて解説します。NXPがリリースしている、NPUを搭載したプロセッサー、マイコンをご紹介します。
- NXP Semiconductors N.V.
- NEXT Mobility
- ICT・インダストリアル
- スマートファクトリー・ロボティクス

NXPの車載ミリ波レーダー製品の紹介
先進運転支援システム(ADAS)において重要なセンサー車載ミリ波レーダーの概要と、その市場をリードするNXPの先進的なレーダー製品ファミリーをご紹介します。
- NXP Semiconductors N.V.
- NEXT Mobility
- ICT・インダストリアル
- スマートファクトリー・ロボティクス







