画像認識¶
物体を 1 つずつ数秒間 Reef のカメラの前にかざし、コンピューターで学習してボードにデプロイします。以後、ボードの NPU がカメラ映像中央の枠内にあるものを分類し、その答えをカメラ映像上に描画します。すべて IPRO AI Studio の Teach ページで行い、コードは不要です。
前提条件¶
- Edge AI ファームウェアを書き込んだ IPRO7AI Reef EVK。Edge AI ファームウェアの書き込みを参照してください。
- OV5640 カメラモジュール:ボードの電源を切った状態でケーブルを FPC1 に差し込み、SW7 を CAM にします。カメラケーブルを抜き差しするときは、必ず先に USB-C を抜いてください。
- Reef の USB-C とコンピューターを接続する USB-C データケーブル。
- インストール済みで、カメラの使用が許可された IPRO AI Studio。IPRO AI Studio のインストールを参照してください。
仕組み¶
- OV5640 は 1280×720 で撮影し、ISP が 2 つの出力を同時に生成します。1 つは 640×360 のプレビューで、MJPEG に圧縮して標準の USB カメラ(UVC)としてコンピューターに送ります。もう 1 つは中央の枠で、NPU 用に 128×128 に縮小します。
- プレビュー中央の枠は、モデルが見る範囲とまったく同じです。Teach ページはプレビューから同じ枠を学習用の画像(「クロップ」)として切り出します。
- モデルは固定された MobileNet バックボーンと分類層で構成されます。学習するのは最後の層だけなので、コンピューターの CPU で数秒で終わります。すべての層は NPU で実行されます。
- デプロイ時、Studio はモデルとクラス名を USB シリアルポート経由で送ります。ボードはサイズ、CRC-32、モデル形式を確認し、問題がない場合にのみモデルを Flash に書き込み、自動的に再起動します。
- ボードは結果を枠の外側に描画します。Teach ページは枠の内側から学習用の画像を切り出すため、枠の内側は常にカメラの生の画像のままです。
ボードの接続¶
-
USB-C を接続します:コンピューターに IPRO7 UVC Cam という名前のカメラとシリアルポートが表示されます。表示されない場合、ボードは
imageモードではありません。次の手順に進んでください。 -
Teach ページを開きます:Studio のレールで Teach をクリックします(macOS では Command+5、Windows では Ctrl+5)。ボードが別のモードの場合、ページ上部に
The Reef is in … mode.と Switch to Teach が表示されます。ボタンを押し、ボードが再起動するのを待ちます(約 2 秒)。コンソールでmode imageと入力しても切り替えられます。 -
カメラ映像を確認します:Camera エリアに Reef のカメラ映像が表示され、中央に緑の枠があります。画像モデルをまだデプロイしていない場合、映像の上部に
IPRO AI TEACHとNO MODELが表示されます。 -
状態を確認します:ステータス行の Board に
on USBと表示され、Put it on the board エリアにボードで動作している内容が表示されます(例:Board found, no model on it yet.またはRunning 3 classes: …)。
Teach ページ¶
| エリア | 内容 |
|---|---|
| ステータス行 | Board(ボードが見つかると on USB)、Crops(集めた画像の枚数)、Held-out accuracy(検証用に取り分けたクロップでのスコア)、Last deploy(前回のデプロイにかかった時間) |
| Camera | Reef のカメラ映像。緑の枠がモデルの見る範囲で、枠の外側にはボードが描画した結果が表示されます。左下の Mirror はプレビューを左右反転するだけで、学習には影響しません。デフォルトはオフです |
| Hold to record | 押している間、選択中のクラスを毎秒 5 枚のクロップで記録し、離すと止まります。ボタンにはクラス名が表示されます(例:Hold to record CLASS 1) |
| Classes | クラスの一覧。各行に名前、クロップ数、最新のサムネイル、Review(クロップを見て不良なものを除外)、Clear(そのクラスのクロップをすべて削除)、Remove(クラスを削除。BACKGROUND は削除できません)があります。一覧の上には Open…、Save…、+ Add class があります |
| Train | バックボーンのメニューと Train ボタン。学習結果はその下に表示されます |
| Put it on the board | ボード上のモデルと Deploy ボタン。デプロイの進行状況はその下に表示されます |
クラスの作成と記録¶
-
クラスに名前を付けます:一覧には最初から BACKGROUND、CLASS 1、CLASS 2 があります。名前をクリックすると変更できます。クラスを増やすには + Add class を押します(最大 8 クラス)。名前には英字、数字、スペース、アンダースコア、ハイフン、ピリオドを 15 文字まで使え、Studio が大文字に変換します。ボードは内蔵のビットマップフォントで名前を描画し、このフォントには漢字が含まれていません。
-
BACKGROUND を記録します:BACKGROUND を選択し、枠の中を空にして、Hold to record を数秒間押し続けます。このクラスがあることで、ボードは「何もない」と答えられます。必ず記録してください。
-
各物体を記録します:クラスを選択し、物体を枠に入れて、Hold to record を数秒間押し続けます。記録中はプレビューの枠が赤くなり、
RECとクラス名が表示されます。クラスの横の数字はクロップ数です。 -
クロップを確認します:各クラスの記録後に Review を押し、物体が枠から半分はみ出しているものなど、不良なクロップを除外します。クラスを最初から記録し直すには Clear を押します。
記録のヒント:
- 小さな物体はレンズに近づけて、枠の大部分を占めるようにします。
- 記録中は物体をゆっくり回したり、近づけたり遠ざけたりして、モデルがさまざまな角度と距離を見られるようにします。似た見た目の 2 つのクラスは、角度によっては混同されることがあります。そのような角度では多めに記録してください。
- 実際に使う照明と背景で記録します。学習では各クロップの左右反転コピーと 2 種類の明るさの変化が自動的に追加されるため、反転した映像を記録する必要はありません。
- プレビューはデフォルトでは反転しておらず、カメラが見ているとおりに表示されます。鏡のように動かしたい場合は Mirror にチェックを入れます。学習には影響しません。
学習¶
-
バックボーンを選びます:Train メニューで選びます(下表)。デフォルトは MobileNetV2 0.35 です。
-
Train を押します:学習はコンピューターの CPU で実行され、通常は数秒で終わります。クロップのあるクラスが 2 つ以上必要で、足りない場合はページに
Record at least two classes, then train.と表示されます。クロップのないクラスはスキップされます。 -
結果を確認します:
Trained in <seconds> s: <percent> of held-out crops rightと表示され、ステータス行の Held-out accuracy が更新されます。
各クラスのクロップの 4 枚に 1 枚は学習から除外され、学習後のモデルの採点に使われます。これが Held-out accuracy です。1 回の記録のクロップは互いに似ているため、このスコアはクラスを区別できることを示すもので、新しい場面で正しく認識できることを示すものではありません。除外できるほどのクロップがない場合、ページに Too few crops to hold any out for checking. と表示されます。
結果に <A> taken for <B> (<n>x) と表示された場合、クラス A の n 枚のクロップが B に分類されたことを意味します。通常は記録中に物体が枠から出たことが原因です。両方のクラスで Review を押し、そのクロップを除外してから再度学習します。
| メニューの選択肢 | 特徴 | モデルサイズ |
|---|---|---|
| MobileNetV2 0.35(デフォルト) | より高精度 | 461 KB |
| MobileNetV1 0.25 | より高速、サイズは約半分 | 237 KB |
メニューに表示される NPU 時間はおおよその値です。INTELPRO の測定では、Edge AI ファームウェア 2.0.0 で MobileNetV2 0.35 をボードの NPU で実行した場合、1 回あたり約 10.5 ms でした。
デプロイ¶
-
ボードを確認します:Put it on the board エリアでボードが見つかっており、ボードが実行しているクラス、または
Board found, no model on it yet.が表示されています。 -
Deploy を押します:Studio は Compile the model、Send and write、Restart the board の 3 つのステップを実行し、完了したものにチェックを付けます。
-
カメラが戻るのを待ちます:ボードの再起動中はカメラ映像が消え、
Deploying… the camera comes back when the board does.と表示されます。これは正常で、カメラは自動的に戻ります。 -
完了を確認します:
On the board in <seconds> sと、ボードが新たに認識できるクラスを含むIt now recognises …が表示されます。
ボードはモデルを書き込む前に確認します。モデルが拒否された場合、ボード上の既存のモデルはそのまま残り、すぐにもう一度デプロイできます。書き込み中に電源やケーブルが切れた場合、スロットが 1 つしかない画像ツールはモデルのない状態になり、カメラ映像に NO MODEL: DEPLOY INTERRUPTED と表示されます。もう一度デプロイしてください。
ボード上での結果確認¶
デプロイ後、物体を枠に入れます。ボードの NPU がリアルタイムで分類し、結果をカメラ映像上に描画します:
| 位置 | 内容 |
|---|---|
| 上部 | IPRO AI TEACH、1 回あたりの NPU 時間、1 秒あたりの実行回数 |
| 枠の左 | 最上位のクラスとその信頼度 |
| 枠の右 | 全クラスの確率。最上位のものは緑 |
| 下部 | モデルのクラス数(例:3 CLASSES) |
Reef はこれを自身の USB カメラ映像に描画するため、Studio に限らず、USB カメラを開けるプログラムであればどれでも表示できます。
コンソールでも状態を確認できます:
| コマンド | 機能 |
|---|---|
teach |
モデルの状態、リアルタイムの確率付きのクラス一覧、NPU の実行レート、USB 接続 |
teach print on / teach print off |
すべての結果をコンソールに出力します |
teach mirror on / teach mirror off |
ボードが送るカメラ映像を左右反転します(デフォルトはオフ。Teach ページはカメラ本来の向きを必要とするため、通常はオフのままにします) |
teach dump |
現在 NPU に入力している 128×128 の画像をダンプします |
動作確認¶
- 各クラスの物体を枠に入れると、枠の左にその名前が表示され、枠の右ではその確率が最も高く、緑色で表示されます。
- 枠が空のとき、結果は BACKGROUND になります。
- 映像の下部のクラス数が Teach ページと一致します。
- USB-C を抜いた後や再起動の後も、モデルはボードに残っています。映像に
NO MODELが表示されなくなり、Put it on the board にRunning <n> classes: …と表示されます。
サンプルの追加と再学習¶
学習スコアは、集めたクロップを区別できることを示すだけです。実際の場面でテストし、ボードが間違えたら、その角度や照明で追加記録してから、再度学習してデプロイします:
- 誤認識されたクラスを選択し、間違えたときの角度と照明で Hold to record を押し続けます。必要に応じて Review を押し、不良なクロップを除外します。
- Train を押します。クラスやクロップを変更した後は、学習エリアに
The crops changed since training. Train again.と表示されます。 - Deploy を押します。
集めたデータは保存して再利用できます:
- Save…:フォルダーを選ぶと、Studio はクラスごとにサブフォルダーを作り、クロップを PNG ファイルとして書き出します。
- Open…:同じ構成のフォルダー(クラスごとに 1 つのサブフォルダー、
.pngまたは.jpg)を開くと、データを集め直さずにサンプルを追加したり再学習したりできます。128×128 の画像はそのままクロップとして使われ、それ以外のサイズはカメラのフレームとして扱われて中央の枠が切り出されます。フォルダー名がクラス名になります。 -
同じフォルダーをコマンドラインから、ウィンドウを使わずに学習してモデルパッケージにし、デプロイすることもできます:
--backboneはmnv2_035(MobileNetV2 0.35)またはmnv1_025(MobileNetV1 0.25)です。
仕様¶
| 項目 | 仕様 |
|---|---|
| カメラ映像(USB カメラ) | 640×360 MJPEG、USB Full-Speed |
| モデルの入力 | 中央の枠(プレビューの x 192-447、y 52-307)を 128×128 RGB に縮小 |
| クラス数 | 2~8(BACKGROUND を含む) |
| クラス名 | 最大 15 文字:英大文字、数字、スペース、アンダースコア、ハイフン、ピリオド |
| 学習 | 固定した MobileNet バックボーン、最後の層のみ、コンピューターの CPU で実行 |
| モデル | MobileNetV2 0.35(461 KB、全 63 層を NPU で実行)または MobileNetV1 0.25(237 KB) |
| ボード上の NPU 時間 | MobileNetV2 0.35 で約 10.5 ms。モデルの読み込みは約 0.74 秒 |
| モデルスロット | 画像モデルスロット、容量 508 KB |
ヒント¶
- BACKGROUND クラスを必ず用意してください。 これがないと、枠が空でもボードは既知のクラスのどれかを選びます。
- 画像認識には「わからない」という答えがありません。 教えていない物体は最も似たクラスに分類され、信頼度が高くなることもあります。映像に入りうるほかの物体には、クラス(例:OTHER)を追加して記録してください。
- 判定に使われるのは枠の内側だけです。枠の外側にしかない物体は認識されません。
トラブルシューティング¶
| 症状 | 原因 | 対処 |
|---|---|---|
カメラの一覧に IPRO7 UVC Cam がない。Studio に No board with the Teach firmware on USB. と表示される |
ボードが image モードではない、Edge AI ファームウェアが動作していない、またはケーブルが充電専用 |
Teach ページで Switch to Teach を押すか、コンソールで mode image と入力します。データ通信対応のケーブルを使います |
Camera エリアに Looking for the IPRO7 UVC Cam… が表示され続ける |
同上 | 同上 |
| macOS で Camera エリアにカメラの権限に関するメッセージが表示される | IPRO AI Studio にカメラの権限がない | OS の権限を参照してください |
| macOS でどのプログラムにもカメラ映像が表示されない | ほかのプログラムがまだカメラを使用している | そのプログラムを終了し、USB-C を抜き差しします |
コンソールに no camera answers が繰り返し表示される |
カメラが接続されていない、または SW7 が CAM になっていない | USB-C を抜き、カメラケーブルを確認して、SW7 を CAM にします |
映像に NO MODEL: NO MODEL IN MFG と表示される |
画像モデルがまだデプロイされていない | 学習してから Deploy を押します |
映像に NO MODEL: DEPLOY INTERRUPTED と表示される |
前回のデプロイが完了していない | もう一度デプロイします |
映像に NO MODEL: WRONG MODEL と表示される |
スロットに別の種類のモデルが入っている | もう一度デプロイします |
Camera エリアに The board went away. Waiting for it… と表示される |
ボードが再起動中(デプロイ後やモード切り替え後)、または USB-C が抜かれた | デプロイ後であれば正常で、カメラは自動的に戻ります。戻らない場合は USB-C を抜き差しします |
学習結果に <A> taken for <B> と表示される |
記録中に物体が枠から出た | 両方のクラスで Review を押し、不良なクロップを除外して、再度学習します |
| 実際の使用で、あるクラスが別のクラスとしてよく認識される | 一部の角度や照明でのデータが不足している、または 2 つの見た目が似ている | その角度と照明で追加記録し、学習してデプロイします |
| 枠が空なのに物体のクラスが報告される | BACKGROUND クラスがない、またはそのデータが少ない | BACKGROUND を記録し、学習してデプロイし直します |
その他の問題はトラブルシューティングを参照してください。
次のステップ¶
- 声紋認識:同じ Reef に、誰が話しているかを教えます。
- ブラウザー版の画像 Teach:Studio を使わずに、Chrome または Edge で同じ流れを行います。