v4.5.6¶
v4.5.6 は機械学習に関する大型リリースです。TensorFlow の tf C モジュールは、TensorFlow Lite Micro(TFLM)を基盤とする新しいエンジン非依存の ml パッケージに置き換えられ、画像からテンソルへの変換は image.to_ndarray() に移行し、デュアルコアボードは Open-AMP に移行しました。いくつかの破壊的変更があるため、ML スクリプトをアップグレードする前に以下をお読みください。
ハイライト¶
新しい
mlパッケージ — 旧tfモジュールはエンジン非依存のmlパッケージ(ml.Model、ml.preprocessing、ml.utils、ml.apps)として書き直されました。tfはエイリアスとして残されています。TFLM バックエンド — 廃止された
libtfは、アップストリームベースの TensorFlow Lite Micro に置き換えられました。推論が約 20% 高速になり、ライブラリも小型化しています。Open-AMP デュアルコア — GIGA と Portenta H7 は、M7/M4 コア間通信に Open-AMP/RPMsg を使用するようになりました(旧 CM4 機構は削除されました)。
オンボード Bluetooth — Nicla Vision、Portenta H7、GIGA で CYW43 Bluetooth ファームウェアが有効になりました。
MicroPython 1.23.0、ulab 6.5.2(4 次元 ndarray のサポートを含む)。
破壊的変更: ML API が大幅に変更され、ほとんどのボードで Haar カスケードがデフォルトで無効になりました。破壊的変更を参照してください。
新機能¶
mlパッケージ —predict()(roi、callback、複数入力リスト対応)を備えたml.Model、テンソルごとの shape/dtype/scale/zero-point 属性、ml.preprocessing.Normalization、ml.utils(NMS)、およびml.apps(listen()とノンブロッキングのtimeout=-1ストリーミング、さらにdraw_predictions()を備えた純粋な Python 実装のMicroSpeechキーワードスポッター)。組み込みモデルシステム —
models/index.txtに列挙されたモデルが、ボードごとに条件付きで埋め込まれます(すべての ML ボードで FOMO、マイク搭載ボードで音声モデル)。image.to_ndarray(dtype, buffer=...)— 画像を ulab ndarray に変換します(オプションでインプレース変換も可能)。生の配列からの
Image()— 新しいshape=、strides=、scale=キーワード引数により、生のピクセルリストからグレースケール/RGB565 画像を構築できます。アンチエイリアス対応の
draw_circle()。sslモジュールが、GIGA、Nicla Vision、Portenta H7、Nano RP2040 Connect、OpenMV 4/4P/PRO/PT、RT1060、Pico でファームウェアに組み込まれました。音声 —
audio.init()にsamples=キーワード(チャンネルあたりの PDM サンプル数)が追加されました。gain_dbが DFSDM マイク(例: Nicla Vision)にも適用されるようになりました。デバッグプロトコル — 新しい
GET_STATEコマンドは、実行/テキスト/JPEG フラグ、フレームのジオメトリ、テキストを 1 つのパケットで返し、ホストとの往復通信を削減します。コア間通信のための Open-AMP vuart の例。
その他の変更と改善¶
MicroPython を 1.23.0 に更新。ulab を 6.5.2 に更新し、4 次元 ndarray をサポート。
推論の高速化 — ML バックエンドは呼び出し間で状態/メモリを保持します(約 20% 高速化、LSTM 系モデルもサポート)。
get_similarity()がdraw_imageバックエンド上で再実装されました(より広範なフォーマット/演算をサポート)。morph()とmean()フィルタ群がキーワード引数のパースに移行しました。mask=が可変な画像を受け付けるようになりました。メモリレイアウトの再設計 — DMA 領域を 2 のべき乗にアライメント、並べ替え可能な GC ブロック、複数ヒープに対応。低 RAM ボードでの初期ヒープの断片化が軽減され、RT1060 では追加の GC ヒープが得られます。
WiFi(CYW43)がソフトリセット時にデアクティベートされるようになりました。SPI-TV ディスプレイは、よりスムーズな更新のため、キャッシュからフレームバッファ領域のみをフラッシュします。
バグ修正¶
カメラとセンサー:
STM32 と i.MX RT のフレームバッファ/センサー経路における、画像データを破損させる可能性のあった偶発的な CPU キャッシュ無効化を修正しました。
i.MX RT ボードでの MLX90640/MLX90641 サーマル I2C 読み取りを修正しました(大きな転送がチャンク分割されるようになりました)。
機械学習:
ml.Modelのload_to_fbの処理、入力bytearrayのサイズ算出、ndarray のndimチェック、Normalizationの画像フォーマット/形状の検証を修正しました。
画像 / システム:
欠落していた
image.BLACK_BACKGROUND描画ヒント定数と、画像/テンソルのバッファ長の健全性チェックを追加しました。コレクタが使用中のバッファを解放してしまう可能性のあった FIR と音声の GC ルートポインタを修正しました。
Servo Shield の例が
SoftI2Cを使用するようになり、OpenMV RT ボードでも動作するようになりました。
ハードウェアとボードのサポート¶
Arduino GIGA — HM01B0 / HM0360 センサーのサポート、Open-AMP デュアルコア。
Bluetooth — Nicla Vision、Portenta H7、GIGA での CYW43 BT ファームウェア。
Portenta H7 — Open-AMP M7/M4 RPMsg。
OpenMV RT1060 — 追加の GC ヒープブロック(より多くの Python メモリ)。
破壊的 API 変更¶
v4.5.5 から v4.5.6 の間でユーザーに見える API の破壊的変更です。範囲: modules/ 内の Python C モジュールと scripts/libraries/ 内の Python ライブラリ。
各変更にはその影響度がタグ付けされています:
major — それを使用していたほとんどのスクリプトで修正が必要です。
minor — 限定的な API。それを使用していたスクリプトにのみ影響します。
behavior — 同じ API ですが結果が異なります。調整済みのスクリプトを再確認してください。
tooling — Python API ではなく、デュアルコア/ボード機構に影響します。
変更はその順序で影響度ごとにグループ化されています。コードの移植だけが目的の場合は、末尾の 移行チェックリスト に進んでください。各コミットハッシュは GitHub 上の差分にリンクしています。
tf モジュールが ml パッケージに置き換え (major)¶
TensorFlow の tf C モジュールは、エンジン非依存の ml パッケージに書き直されました(tf は後方互換のためのエイリアスとして残されていますが、新しいコードでは ml を使用してください)。モジュールレベルの関数 tf.load、tf.load_builtin_model と detect()/segment()/分類メソッドは削除されました。代わりに ml.Model を構築して predict() を呼び出してください。ml.Model(path) はモデルのみを返すようになりました((labels, model) のタプルではありません)。ラベルは model.labels 属性です。predict() は ulab の ndarray を返すようになり(float のタプルではありません)、複数入力モデル(リストを渡す)をサポートします。NMS は ml.utils に移動し、入力の正規化は ml.preprocessing.Normalization に移動しました。旧 ml.py は現在 ml.apps になっています。
コミット: c7228cbb4、6c212409c、3e37f46db、9a186f4e2、70b89f474、3f8491cb0、4506682c2、8b38f3837
image.unpack() を削除 — to_ndarray() を使用 (major)¶
短命だった image.unpack() は削除されました。代わりに image.to_ndarray(dtype, buffer=...) で画像をテンソルに変換し、scale/mean/stdev の正規化は旧来の組み込み画像スケーリング経路ではなく ml.preprocessing.Normalization で適用してください。
Image() の生配列 scale 引数 (minor)¶
生のピクセル配列から Image を構築する際、scale 引数は (scale, add) ではなく (min, max) の範囲を取るようになりました。
コミット: 7b79fb4c7
ほとんどのボードで Haar カスケードがデフォルトで無効化 (behavior)¶
フラッシュ領域を節約するため、Haar カスケードによる顔検出(find_features() / image.HaarCascade())は、Arduino GIGA、Nicla Vision、Portenta H7、OpenMV 3、OpenMV 4 / 4 Plus / PRO、OpenMV Pure Thermal でデフォルトで無効になりました。これらのボードで Haar カスケードを使用するスクリプトは、この機能を有効にしてファームウェアを再ビルドする必要があります。
コミット: 6ce27c910
スクリプトの中断とテンソルのスケーリング (behavior)¶
USB デバッガは、強制的な PendSV ジャンプではなく MicroPython の VM アボート機能を介して実行中のスクリプトを中断するようになりました(よりクリーンですが、中断ポイントは異なります)。SCALE_S128_127 入力スケーリングは、誤ったゲインなしで 0〜255 を −128〜127 にマッピングするよう修正されました。旧来の(誤った)スケーリングに依存しているモデルは異なる結果を生成します。
CM4 コプロセッサが Open-AMP に置き換え (tooling)¶
GIGA / Nicla Vision / Portenta H7 における非推奨の CM4 コプロセッサファームウェア機構は削除され、Open-AMP/RPMsg に置き換えられました。デュアルコアのコードは Open-AMP モデルに移行する必要があります(vuart の例が提供されています)。
移行チェックリスト¶
v4.5.6 へのクリーンな移植には、通常以下の作業が必要です:
ML コードを
mlに移植します。ml.Model(path)を構築し、predict()を呼び出し、model.labelsを読み取り、ndarray出力を想定し、正規化をml.preprocessing.Normalizationに、NMS をml.utilsに移動します(ml パッケージの変更)。image.unpack()をimage.to_ndarray()に置き換えます(unpack の削除)。Image()の生配列scale引数を(min, max)の範囲に更新します(Image scale の変更)。影響を受けるボードで Haar カスケードを使用している場合は、この機能を有効にして再ビルドしてください(Haar カスケードの変更)。
SCALE_S128_127に依存していたモデルを再検証します(スケーリングの変更)。デュアルコアのコードを Open-AMP に移行します(CM4 の変更)。