1. 前提
@SSS-NorimitsuTakahashi さんのLocal Edition (v1.2.2, v1.3.0) 触ってみた!!でAITRIOSのLocal Editionのチュートリアルが紹介されているのですが、記事内のバージョンがv1.2.2ないしv1.3.0と古く内容が違う部分があるので、2024.12.07時点の最新版であるv1.4.0の内容で紹介します。
※作業しながらではなく記憶を遡って書いている部分があるので、もし実際と違う部分があればごめんなさい。
2. 準備物
2.1 ハード
Windows OS PC
自分はWindows 11 Home 23H2インストール済みのPCを使用しています。
なお、宅内LANへの接続はWi-Fiです。
AIH-IVRW2
期間限定なのかわかりませんが、購入した2024.11.30時点では定価¥29,800のところ¥5,000以下で販売されています。
まずはお試しでの使用なので、この機種を選択しています。
2.2. ソフト
AITRIOS Local Edition
AITRIOSは当初クラウドと接続して使用する仕様だったそうなのですが、AIモデルの開発(学習)や推論結果の確認を全てローカルネットワーク内で完結できるLocal Editionが追加されました。
これも購入した2024.11.30時点で6ヵ月のライセンスが定価¥33,000のところ¥15000以下になっています。
公式の方から積極的にアナウンスはされていないのですが、ライセンスは一度買ったら永久に使い続けられるのではなく期間限定で6ヵ月と1年間の2種類です。
自分は永久ライセンスだと勘違いしてました…
3. AITRIOS Local Editionのインストール
Local Editionのライセンス購入先から、local_edition_1.4.0.zip をダウンロードできるかと思うので適当な場所で解凍します。
圧縮状態で約5.6GB、解凍して11.2GBなので、もしPCを使い込んで空き容量が乏しくなっていたら注意です。
解凍すると中身はこのような構造になっていると思います。
(ファイルの数が多いので、今回の手順で扱わないファイルは省略しています)
Local Edition v1.4.0/
├── Local_Edition_get_started_for_AIH-IVRW2_ja_v1.4.0_00.pdf
│
├── Brain Builder/
│ ├── Neurala_BrainBuilderForAITRIOS_24.09.7_00_GettingStarted_LocEdt.pdf
│ ├── Neurala_BrainBuilderForAITRIOS_24.09.7_00_Windows_CPU_Installer.zip
│ │
│ └── Neurala_BrainBuilderForAITRIOS_24.09.7_Windows_CPU_Installer/
│ ├── BBTrialLicense****.WibuCmRaU
│ ├── Neurala_BrainBuilderForAITRIOS_24.09.7_Windows_CPU_amd64.exe
│ │
│ └── Files/
│
├── EdgeApp/
│ ├── vision_app_classification_v1.1.2_signed.aot
│ └── vision_app_objectdetection_v1.1.2_bb24.09.7.aot
│
├── EdgeDeviceFW/
│
└── Local Console/
└── local-console-setup-4.0.18.exe
3.1. Local Console
まずはLocal Consoleフォルダ内のインストーラを実行してLocal Consoleをインストールします。
Local Consoleはローカル環境でAITRIOSのエッジデバイスの管理や撮影・推論のコントロール、AIモデルのエッジデバイスへのデプロイなどを行うためのソフトです。
途中、いくつかライセンス条項の確認ダイアログが出てきた気がしますが、目を通したうえでAgreeを選択しました。
v1.3.0以前ではWSLのインストールがあったそうなのですが、v1.4.0では簡素化されて不要になったのはありがたいところです。
3.2. Brain Builder (Local Studio)
次にBrain Builder (Local Studio)をインストールします。
Brain BuilderはローカルPCで実行できるAI学習ツールです。
Classification(分類)とObjectDetection(物体検出)の2種類のAIモデルをAIの基礎知識なしに作成できるツールです。
local_edition_1.4.0.zip を解凍したフォルダ内のBrain Builderフォルダはこのようになっています。
この中の Neurala_BrainBuilderForAITRIOS_24.09.7_00_Windows_CPU_Installer.zip を解凍します。
なお、 Neurala_BrainBuilderForAITRIOS_24.09.7_00_GettingStarted_LocEdt.pdf は英文ですがBrain Builderの使用方法が記載されているので、頑張って自力で理解するか英→日翻訳サービスを使って日本語で読み込んでください。
(自分は英語ができない人なので、Google翻訳で日本語に翻訳してもらいました。)
解凍するとこのようなファイルが確認できるので、 Neurala_BrainBuilderForAITRIOS_24.09.7_Windows_CPU_amd64.exe のインストーラを実行します。
3.3. CodeMeter User Runtime
BrainBuilderの使用に期間限定のライセンス登録が必要になるので、ライセンスをアクティベートするためのソフト:CodeMeter User Runtimeが必要です。
上のリンク先に飛んで、CodeMeter User Downloadからインストーラをダウンロードしてインストールします。
インストールできると Neurala_BrainBuilderForAITRIOS_24.09.7_Windows_CPU_Installer フォルダ内の BBTrialLicense****.WibuCmRaU が実行できるようになるので、ダブルクリックしてCodeMeter User Runtimeにてライセンス認証します。
このライセンスは試用ライセンスで、10日間使用できます。
試用ライセンスを使い切ったらLocal Edition購入時についてくる6ヵ月ないし1年間のライセンスに切り替えましょう。
Local Edition購入時の6ヵ月ないし1年間のライセンスは、一度有効にしてしまうとカウントダウンが始まってしまうので、試用ライセンス切れのタイミングで有効にするのがよいです
これでLocal ConsoleとBrain Builderが使えるようになったはずです。
4.エッジデバイスの登録・管理
Local_Edition_get_started_for_AIH-IVRW2_ja_v1.4.0_00.pdf のP.8~18に記載があるので、ここでは簡単に説明します。
Local Consoleの左上・Provisioningタブを選択し、Connectを選択するとAIH-IVRW2をローカルネットワークに接続するためのQRコードを生成するための画面が表示されます。
Device Nameで登録したいデバイス名(初期値はDefault)、Wi-Fi SSIDのトグルスイッチをONにしてSSID名とパスワードを入力し、GenerateをクリックするとQRコードが表示されます。
これをAIH-IVRW2に読み込ませて、問題なく認識できればOKです。
AIH-IVRW2とMQTTで接続できれば、Provisioningタブの下に表示されるPreview Cameraでカメラのリアルタイム映像が(間欠的に)表示されるはずです。
5. Brain BuilderでAIモデル作成
AITRIOS公式サイトでBrain Builderの使用方法も紹介されているのですが、2024.12.07時点では2024.11.08のバージョンでのドキュメントになっていますし英語なので、自分の手順を紹介します。
5.1. kaggleで学習用モデルを入手
AITRIOS自身で学習用の画像を撮影するのが学習用モデルの撮影環境と推論時の撮影環境が一致して失敗が少ないと思いますが、まずはお試ししたいときは学習用モデルも手っ取り早く作りたいので、kaggleから学習用のデータセットを入手します。
↓のリンク先からkaggleユーザーが共有しているデータセットを選択し、学習用画像データを入手しましょう。
自分は自動車の分類用にはこのモデルを使用しました。
自動車の検出用にはこのモデルを使用しました。
5.1.1. YOLO形式データセットをKITTI形式データセットに変換
Local Edition v1.4.0付属のBrain Builder VIA:24.09.7-CPU ではKITTI型データセットしか使えません。
世の中の画像物体認識用のデータセットはYOLO形式のデータセットなので、変換しないとBrain Builderでは使用できません。
なので、YOLO形式データセットをKITTI形式データセットに変換します。
下図は自分なりに調べたYOLO形式とKITTI形式のフォーマットの違いです。
KITTIはLidarなどから得られた3Dの点群データに対して使用することが多いようです。
手作業ではめちゃくちゃめんどくさい作業ですが、ChatGPTの力を借りて変換スクリプトをPythonで作成しました!
これで簡単にYOLO形式のデータセットからKITTI形式のデータセットを用意できます。
使い方はReadmeにも書いていますが、のように--data_dirのあとにデータセット保存先のフォルダを指定すると自動的にKITTI形式データセットに変換するようにしています。
(フォルダパスはフルパスでも相対パスでもどちらでも有効です。)
python YOLO_TO_KITTI.py --data_dir "C:\Users\Username\datasets"
もし画像ファイル、YOLO形式のラベルファイル、KITTI形式のラベルファイルの保存先を個別に指定する場合は以下のようになります。
python YOLO_TO_KITTI.py --yolo_labels "C:\Users\Username\datasets\yolo_labels" --images "C:\Users\Username\datasets\images" --kitti_labels "C:\Users\Username\datasets\kitti_labels"
変換後はKITTI形式のラベルファイルはkitti_labelsのフォルダの中に生成されるので、YOLO形式のラベルファイルは削除してKITTI形式のラベルファイル保存先のフォルダはlabelsにリネームしてください。
5.2. Brain Builderで学習
初めてBrain Builderを起動するとログインを求められます。
最初はアカウント登録していないはずなので、アカウントの作成で新規にアカウントを作成しましょう。
Local Editionの購入時にライセンスは購入時のメールアドレスと紐づく旨の注意書きがあったので、Brain Builderのログインメールアドレスはライセンス購入時のメールアドレスと合わせておいた方が無難だと思います。
無事ログインできると、このような画面になると思います。
最初にプロジェクトの作成を選択して、新規のプロジェクトを作成します。
(自分自身が区別できればなんでもいいです)
プロジェクトができるとこのような画面になりますので、左上のデータセットの作成を選択します。
この画面で作成したいAIモデルのモデル名を入力し、どのAIモデルを作成したいのか(Classifier:分類 / Detector:物体検出)を選択します。
5.2.1. Classifier(分類)のモデルを作成
まずはCarTypeというモデル名でClassifierのAIモデルを作成してみます。
※Detector:物体検出AIモデルを作成する場合は5.2.2. Detector(物体検出)のモデルを作成を参照ください。
このような画面に移行すると、アップロードデータを選択します。
日本語訳が変ですが、上を選択するとアップロードした画像データを自動的に学習用(Train)と検証用(Validate)に4:1で分けてくれるようです。
下を選択するとzipファイルで圧縮したデータの中にTrainフォルダとValidフォルダがあれば、それぞれ学習用・検証用として使い分けてくれるようですね。
学習用データも検証用データも後から選択できるので、ここは用意したデータや自分の使い方で選択すればよいと思います。
今回は上を選択します。
また選択肢が2つ出てきます。
ファイルベースの方はファイルのアップロード時にクラスを選択したうえで学習用データをアップロードします。
フォルダベースの方は、あらかじめクラス名でフォルダを作って分類済みの学習用データをzipファイルで圧縮してアップロードします。
今回、kaggleでクラス分類済みの学習用データを使用するので、フォルダベースの方を選択してアップロードします。
ちなみに今回使用する学習・検証用のモデル画像はこんな構造を想定しています。
(フォルダ別にクラス分けされており、学習用と検証用はBrain Builderで分けてもらう)
CarType.zip
├── Bus/
│ ├── image_0001.jpg
│ ├── image_0002.jpg
│ └── …
│
├── Car/
│ ├── image_0001.jpg
│ ├── image_0002.jpg
│ └── …
│
└── motorcycle/
├── image_0001.jpg/
│ ├── image_0002.jpg
│ └── …
│
└── Truck/
├── image_0001.jpg
├── image_0002.jpg
└── …
アップロードが完了すると、このようにダッシュボードタブでクラスと学習用の画像データが確認できます。
もし分類が間違っていた場合は、学習タブで再選択できます。
評価タブで学習分類器(Learning Classifier)での評価結果の確認、テストタブで検証用画像を使っての確認はすぐにできるのですが、エッジデバイスへのデプロイには Static Classifier での学習結果が必要になります。
全く同じ正解率にはなりませんが、学習データが推論に対して問題ないと判断できればStatic Classifierを選択しましょう。
Pythonで細かく学習内容をチューニングして精度を詰めるような使い方はできませんが、期間(学習時間)やパフォーマンスを選択してある程度AIモデルの判定精度を詰めることはできます。
ビルドをボタンをクリックすると、学習が始まります。
ローカルPCのCPUのみで学習を行うので、PCの性能によって所要時間は大きく変わります。数時間~十数時間は見ておいた方がいいです。
学習中にスリープしたりすると学習に失敗するので、ノートPCの場合は外部電源に接続して電源の設定を変えるなどしてスリープしないようにしましょう
学習結果はこのようになります。
学習用モデルにもよると思いますが、やっぱり100%正答というわけにはいかないようですね…
エクスポートタブでStatic Classifierで作成したAIモデルをダウンロードできるので、ダウンロードしましょう。
{モデル名}-imx500.zipのAIモデルファイルがダウンロードできます。
これでBrain BuilderでのClassifierモデルの作成は完了です。
{モデル名}-imx500.zipのAIモデルファイルは解凍しておきましょう。
解凍すると{モデル名}.zipもあるので、これも解凍しておきます。
解凍するとこのような構造になっているはずです。必要なファイルは矢印をつけた3つです。
CarType-imx500/
├── ****_brain_metadata.json
├── CarType.zip
├── classification_ppl_parameters_sample.json <-
├── config.json
├── LICENSE
├── README.md
├── vision_app_classification_v1.1.1.wasm
│
└── CarType/
├── ****-static.keras
├── ****-static.tflite
├── deploy.json
├── input_norm.json
├── labels.txt <-
├── mct_brain_MemoryReport.json
├── network.fpk
├── network.pkg <-
├── network_info.txt
└── packerOut.zip
なお、classification_ppl_parameters_sample.jsonはこのように手を加える必要があります。
{
"header" :
{
"id" : "00",
"version" : "01.01.00"
},
"dnn_output_classes" : 4, <-AIモデルのクラス数を指定
"max_predictions" : 4 <-予測出力の最大数を指定。値はAIモデルのクラス数以下にする
}
ここまでできたら、6. AIモデルのデプロイ・推論結果の確認に進んでください。
5.2.2. Detector(物体検出)のモデルを作成
最初はClassifierの場合とほぼ変わりありません。
データセット名を入力しDetectorを選択してデータセットの作成です。
この画面に移行したら、参照ボタンで学習用画像データのzipファイルを選択してアップロードの開始をクリックします。
データ形式はこのような構造を想定しています。学習用と検証用の画像はあらかじめ分けてあり、imagesフォルダに画像データ、labelsフォルダにKITTI形式のデータセットラベルのテキストデータが入っています。
画像データとテキストデータのファイル名は合わせてください。
car_position.zip
├── Train/
│ ├── images/
│ │ ├── 0001.jpg
│ │ ├── 0002.jpg
│ │ └── …
│ │
│ └── labels/
│ ├── 0001.txt
│ ├── 0002.txt
│ └── …
│
└── Validate/
├── images/
│ ├── 0001.jpg
│ ├── 0002.jpg
│ └── …
│
└── labels/
├── 0001.txt
├── 0002.txt
└── …
もしラベルファイルがなかったり、アップロードした学習データのラベルの分類や位置に誤りがあれば、注釈タブで設定・修正できます。
イチからこれをやるのはめちゃくちゃ大変なので、5.1. kaggleで学習用モデルを入手で紹介したようにデータセットファイルをあらかじめ入手しておくのが楽ですね。
Classifier以上に時間がかかりますが、期間(学習時間)を選択してビルドをボタンをクリックし、学習を行います。
ローカルPCのCPUのみで学習を行うので、PCの性能によって所要時間は大きく変わります。数時間~十数時間は見ておいた方がいいです。
学習中にスリープしたりすると学習に失敗するので、ノートPCの場合は外部電源に接続して電源の設定を変えるなどしてスリープしないようにしましょう
学習が終わったら評価タブで結果を確認できます。
あんまりいい結果ではないですね…学習用画像が複雑だったり、夜間の画像で識別しにくかったりしたのが原因かもしれないです。
エクスポートタブでDetectorで作成したAIモデルをダウンロードできるので、ダウンロードしましょう。
{モデル名}-imx500.zipのAIモデルファイルがダウンロードできます。
これでBrain BuilderでのDetectorモデルの作成は完了です。
{モデル名}-imx500.zipのAIモデルファイルは解凍しておきましょう。
解凍すると{モデル名}.zipもあるので、これも解凍しておきます。
解凍するとこのような構造になっているはずです。必要なファイルは矢印をつけた3つです。
car_position-imx500/
├── car_position.zip
├── config.json
├── detection_ppl_parameters_sample.json <-
├── LICENSE
├── README.md
├── vision_app_objectdetection_v1.1.2.wasm
│
└── car_position/
├── ****-nanodet-plus-m-1.5x.keras
├── ****-nanodet-plus-m-1.5x.onnx
├── ****-plus-m-1.5x.txt
├── deploy.json
├── input_norm.json
├── labels.txt <-
├── mct_brain_MemoryReport.json
├── network.fpk
├── network.pkg <-
├── network_info.txt
└── packerOut.zip
なお、detection_ppl_parameters_sample.jsonはこのように手を加える必要があります。
{
"header" :
{
"id" : "00",
"version" : "01.01.00"
},
"dnn_output_detections" : 300, <-AIモデルが検出するオブジェクトの最⼤数。300に固定。
"max_detections" : 5, <-検出されるオブジェクトの最⼤数。dnn_output_detections以下にする。
"threshold" : 0.3, <-物体検出の信頼度閾値を指定します。この値以下の物体は無視される。デフォルトは0.3
"input_width" : 320, <-テンソル幅を320に固定
"input_height" : 320 <-テンソル高さを320に固定
}
6. AIモデルのデプロイ・推論結果の確認
AIモデルのデプロイ・推論にはLocal Consoleにて4.1. エッジデバイスの登録・管理で登録したデバイスと接続できていることが前提です。
6.1. AIモデルのデプロイ
Local ConsoleのDeloymentタブで、エッジデバイス、AIモデル(network.pkg)、アプリケーションを選択します。
アプリケーションはLocal Editionのzipファイルを解凍した Local Edition v1.4.0\EdgeAppの中にあります。
Classifier:分類の場合は vision_app_classification_v1.1.2_signed.aot を選択し、Detector:物体検出の場合は vision_app_objectdetection_v1.1.2_bb24.09.7.aot を選択します。
Local Edition v1.4.0
├── Brain Builder/
│
├── EdgeApp/
| ├── classification.fbs
| ├── ClassifierPPLParameterSample.json
| ├── DetectorPPLParameterSample_after_v24.09.json
| ├── objectdetection.fbs
| ├── vision_app_classification_v1.1.2_signed.aot <-Classifier:分類用
| └── vision_app_objectdetection_v1.1.2_bb24.09.7.aot <-Detector:物体検出用
│
├── EdgeDeviceFW /
└── Local Console /
デバイスとファイル2つを選択できたら、Deployボタンを押してデプロイを実行します。
この時、エッジデバイスがオフラインもしくは未接続状態だとデプロイがいつまでたっても終わらないので、必ず接続できている状態で実行してください。
また、4.1. エッジデバイスの登録・管理でカメラ映像をプレビューしていても失敗するので、プレビューは停止しておいてください。
数分かかりますが、デプロイできたらこのようにvision_app_****.aotとnetwork.pkgの両方がDeployingからSuccessに変わります。
いつまでたってもDeployingのままかFailに変わったなら失敗しているので、上の注記を読んで再度実行してください。
6.2. 推論結果の確認
まずはLocal ConsoleのInterfaceタブでEnvironmentを設定します。
エッジデバイスとラベルファイル、PPLパラメータファイル(修正済みのclassification_ppl_parameters_sample.json もしくは detection_ppl_parameters_sample.json)を選択し、Applyをクリックします。
その右側にあるStartを押すとエッジデバイスで推論した結果をリアルタイムで確認でき、Stopを押すと終了します。
Inference Control内のSetボタンを押すとカメラの画角内でどの範囲を対象にするのか選択でき、Applyでエッジデバイスに反映します。
また、推論結果はLabelとJsonで切り替えることができます。
7. 肝心の推論結果の精度ってどうなん?
Xアカウントで結果をポストしていました。
Brain BuilderでのAIモデルの評価結果である程度分かっていましたが、Detector(物体検出)は12時間以上学習に時間かけたにもかかわらず、精度はいまいちです。
kaggleから落としてきた学習モデルデータを確認すると、ラベルの分類や選択範囲が一部適当でした。
データを作った研究室の大学生がサボったのかもしれません
人間が目視でも視認しにくい夜のハイウェイの渋滞中の画像でも頑張ってラベリングしようとしている雰囲気は感じられるのですが、明瞭な画像できちんと判別してくれないのは悲しいので、きちんと明瞭な画像を使っでAIモデルを作ったほうがいいのかもしれません。
Classifier(分類)の方もクラス間であまり有意差が無いのがちょっと意外でしたが、Detectorに比べればきちんと検出しているように感じます。
ただ、海外(特に北米)の自動車の画像をベースに学習しているので、日本のトラックやSSなどのバイクでは誤ってCarと誤分類するすることがありました。(アメリカンバイクだときちんとmotorcycleと判定されることが多い)
自動車のように使用車両やデザインにお国柄が出るようなものは、極力その土地の画像を使った方がいいのだと思います。
8. おわりに
手のひらに乗るエッジカメラ単体でAIが動くのと、時間はかかるけどAIの知識無くても簡単に学習モデル作れるのに素直に感動しました。
ただ、精度の高いAIモデルを作るには事前の学習用画像の見極めや、実際に使用したい環境と近いモデル画像を用意する必要があるように感じます。
Brain Builderは操作は簡単ですが細かいチューニングができないので、精度の高いAIモデルを作成するには苦労する気がします。
第三次AIブームのきっかけになった2006年のディープラーニング登場から2024年時点で約20年(!)が経過し、ある程度判定精度が手の内にできるようになった人もいるはずなので、自作のAIモデルでもAITRIOSで使用できるようになるといいなぁと思います。