v4.5.6

v4.5.6 は機械学習に関する大型リリースです。TensorFlow の tf C モジュールは、TensorFlow Lite Micro(TFLM)を基盤とする新しいエンジン非依存の ml パッケージに置き換えられ、画像からテンソルへの変換は image.to_ndarray() に移行し、デュアルコアボードは Open-AMP に移行しました。いくつかの破壊的変更があるため、ML スクリプトをアップグレードする前に以下をお読みください。

ハイライト

  • 新しい ml パッケージ — 旧 tf モジュールはエンジン非依存の ml パッケージ(ml.Modelml.preprocessingml.utilsml.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()roicallback、複数入力リスト対応)を備えた ml.Model、テンソルごとの shape/dtype/scale/zero-point 属性、ml.preprocessing.Normalizationml.utils(NMS)、および ml.appslisten() とノンブロッキングの 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.Modelload_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.loadtf.load_builtin_modeldetect()/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 になっています。

コミット: c7228cbb46c212409c3e37f46db9a186f4e270b89f4743f8491cb04506682c28b38f3837

image.unpack() を削除 — to_ndarray() を使用 (major)

短命だった image.unpack() は削除されました。代わりに image.to_ndarray(dtype, buffer=...) で画像をテンソルに変換し、scale/mean/stdev の正規化は旧来の組み込み画像スケーリング経路ではなく ml.preprocessing.Normalization で適用してください。

コミット: 9848eed12de0d46fa6

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 にマッピングするよう修正されました。旧来の(誤った)スケーリングに依存しているモデルは異なる結果を生成します。

コミット: e758a0f95a4d97c572

CM4 コプロセッサが Open-AMP に置き換え (tooling)

GIGA / Nicla Vision / Portenta H7 における非推奨の CM4 コプロセッサファームウェア機構は削除され、Open-AMP/RPMsg に置き換えられました。デュアルコアのコードは Open-AMP モデルに移行する必要があります(vuart の例が提供されています)。

コミット: 3cc57fea493f2d4c41

移行チェックリスト

v4.5.6 へのクリーンな移植には、通常以下の作業が必要です:

  1. ML コードを ml に移植します。ml.Model(path) を構築し、predict() を呼び出し、model.labels を読み取り、ndarray 出力を想定し、正規化を ml.preprocessing.Normalization に、NMS を ml.utils に移動します(ml パッケージの変更)。

  2. image.unpack()image.to_ndarray() に置き換えます(unpack の削除)。

  3. Image() の生配列 scale 引数を (min, max) の範囲に更新します(Image scale の変更)。

  4. 影響を受けるボードで Haar カスケードを使用している場合は、この機能を有効にして再ビルドしてください(Haar カスケードの変更)。

  5. SCALE_S128_127 に依存していたモデルを再検証します(スケーリングの変更)。

  6. デュアルコアのコードを Open-AMP に移行します(CM4 の変更)。