コンテンツにスキップ

画像認識

物体を 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 ページは枠の内側から学習用の画像を切り出すため、枠の内側は常にカメラの生の画像のままです。

ボードの接続

  1. USB-C を接続します:コンピューターに IPRO7 UVC Cam という名前のカメラとシリアルポートが表示されます。表示されない場合、ボードは image モードではありません。次の手順に進んでください。

  2. Teach ページを開きます:Studio のレールで Teach をクリックします(macOS では Command+5、Windows では Ctrl+5)。ボードが別のモードの場合、ページ上部に The Reef is in … mode. と Switch to Teach が表示されます。ボタンを押し、ボードが再起動するのを待ちます(約 2 秒)。コンソールで mode image と入力しても切り替えられます。

  3. カメラ映像を確認します:Camera エリアに Reef のカメラ映像が表示され、中央に緑の枠があります。画像モデルをまだデプロイしていない場合、映像の上部に IPRO AI TEACH と NO MODEL が表示されます。

  4. 状態を確認します:ステータス行の 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 ボタン。デプロイの進行状況はその下に表示されます

クラスの作成と記録

  1. クラスに名前を付けます:一覧には最初から BACKGROUND、CLASS 1、CLASS 2 があります。名前をクリックすると変更できます。クラスを増やすには + Add class を押します(最大 8 クラス)。名前には英字、数字、スペース、アンダースコア、ハイフン、ピリオドを 15 文字まで使え、Studio が大文字に変換します。ボードは内蔵のビットマップフォントで名前を描画し、このフォントには漢字が含まれていません。

  2. BACKGROUND を記録します:BACKGROUND を選択し、枠の中を空にして、Hold to record を数秒間押し続けます。このクラスがあることで、ボードは「何もない」と答えられます。必ず記録してください。

  3. 各物体を記録します:クラスを選択し、物体を枠に入れて、Hold to record を数秒間押し続けます。記録中はプレビューの枠が赤くなり、REC とクラス名が表示されます。クラスの横の数字はクロップ数です。

  4. クロップを確認します:各クラスの記録後に Review を押し、物体が枠から半分はみ出しているものなど、不良なクロップを除外します。クラスを最初から記録し直すには Clear を押します。

記録のヒント:

  • 小さな物体はレンズに近づけて、枠の大部分を占めるようにします。
  • 記録中は物体をゆっくり回したり、近づけたり遠ざけたりして、モデルがさまざまな角度と距離を見られるようにします。似た見た目の 2 つのクラスは、角度によっては混同されることがあります。そのような角度では多めに記録してください。
  • 実際に使う照明と背景で記録します。学習では各クロップの左右反転コピーと 2 種類の明るさの変化が自動的に追加されるため、反転した映像を記録する必要はありません。
  • プレビューはデフォルトでは反転しておらず、カメラが見ているとおりに表示されます。鏡のように動かしたい場合は Mirror にチェックを入れます。学習には影響しません。

学習

  1. バックボーンを選びます:Train メニューで選びます(下表)。デフォルトは MobileNetV2 0.35 です。

  2. Train を押します:学習はコンピューターの CPU で実行され、通常は数秒で終わります。クロップのあるクラスが 2 つ以上必要で、足りない場合はページに Record at least two classes, then train. と表示されます。クロップのないクラスはスキップされます。

  3. 結果を確認します: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 でした。

デプロイ

  1. ボードを確認します:Put it on the board エリアでボードが見つかっており、ボードが実行しているクラス、または Board found, no model on it yet. が表示されています。

  2. Deploy を押します:Studio は Compile the model、Send and write、Restart the board の 3 つのステップを実行し、完了したものにチェックを付けます。

  3. カメラが戻るのを待ちます:ボードの再起動中はカメラ映像が消え、Deploying… the camera comes back when the board does. と表示されます。これは正常で、カメラは自動的に戻ります。

  4. 完了を確認します: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 の画像をダンプします

動作確認

  1. 各クラスの物体を枠に入れると、枠の左にその名前が表示され、枠の右ではその確率が最も高く、緑色で表示されます。
  2. 枠が空のとき、結果は BACKGROUND になります。
  3. 映像の下部のクラス数が Teach ページと一致します。
  4. USB-C を抜いた後や再起動の後も、モデルはボードに残っています。映像に NO MODEL が表示されなくなり、Put it on the board に Running <n> classes: … と表示されます。

サンプルの追加と再学習

学習スコアは、集めたクロップを区別できることを示すだけです。実際の場面でテストし、ボードが間違えたら、その角度や照明で追加記録してから、再度学習してデプロイします:

  1. 誤認識されたクラスを選択し、間違えたときの角度と照明で Hold to record を押し続けます。必要に応じて Review を押し、不良なクロップを除外します。
  2. Train を押します。クラスやクロップを変更した後は、学習エリアに The crops changed since training. Train again. と表示されます。
  3. Deploy を押します。

集めたデータは保存して再利用できます:

  • Save…:フォルダーを選ぶと、Studio はクラスごとにサブフォルダーを作り、クロップを PNG ファイルとして書き出します。
  • Open…:同じ構成のフォルダー(クラスごとに 1 つのサブフォルダー、.png または .jpg)を開くと、データを集め直さずにサンプルを追加したり再学習したりできます。128×128 の画像はそのままクロップとして使われ、それ以外のサイズはカメラのフレームとして扱われて中央の枠が切り出されます。フォルダー名がクラス名になります。
  • 同じフォルダーをコマンドラインから、ウィンドウを使わずに学習してモデルパッケージにし、デプロイすることもできます:

    ipro-ai train image <folder> --out cups.ipkg --backbone mnv2_035
    ipro-ai deploy cups.ipkg --switch
    

    --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 を記録し、学習してデプロイし直します

その他の問題はトラブルシューティングを参照してください。

次のステップ