v4.7.0

v4.7.0 は主要な機能リリースです。目玉として、デュアルコアの openamp プログラミングモデルを備えた新しい OpenMV AE3(Alif Ensemble、Cortex-M55 + Ethos-U55 NPU)ボード、同梱のモデルとカスケードを含む読み取り専用の ROMFS/rom)ファイルシステム、VL53L8CX 8x8 time-of-flight サポート、新しい YOLOv8 / YOLO-LC 後処理、MicroPython 1.25 が追加されました。組み込みモデルと Haar カスケードのロード方法も変更されているため、以下の破壊的変更をお読みください。

ハイライト

  • OpenMV AE3 ボード — Alif Ensemble(Cortex-M55 + Ethos-U55 NPU)ボード。完全なポート、ブートローダー、ROMFS を備えています。

  • デュアルコア openamp モジュール — RPMsg 経由で 2 つ目の Alif コアに処理をオフロードします(@async_remote デコレータ、Endpoint / EndpointIO)。

  • ROMFS — 組み込みの TFLite モデルと Haar カスケードを含む読み取り専用の /rom ファイルシステム。さらに新しい tools/mkromfs.py ホストビルダーも追加されました。

  • VL53L8CX 8x8 マルチゾーン time-of-flight センサーのサポート。

  • 新しい ML 後処理yolo_v8_postprocessyolo_lc_postprocess

  • MicroPython が 1.25.0 に更新されました。

  • 破壊的変更: 組み込みモデルと Haar カスケードは、パスによって /rom からロードされるようになりました(ml.Model の変更 および Haar カスケードの変更 を参照)。

新機能

  • OpenMV AE3 — 新しい Alif Ensemble ボード(Cortex-M55 アプリケーションコア + Ethos-U55 NPU)。ポート、ブートローダー、ボード設定、RGB LED、ROMFS サポートを備えています。

  • openamp — Alif デュアルコア(Open-AMP / RPMsg)RPC モデル用の新しいモジュール: EndpointEndpointIOnew_service_callback、およびマーシャリングされた関数を 2 つ目のコアにオフロードする @async_remote デコレータ。HE/HP コアは、デフォルトの asyncio ベースの _boot.py タスクランナーを搭載しています。

  • audio — Alif ポートは、AE3 上でコールバックベースのストリーミング API(audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=))を備えた audio モジュール(PDM マイク)を追加します。

  • ROMFS — ボードごとにパッケージ化された組み込みアセット(TFLite モデル、Haar カスケードなど)を含む読み取り専用の /rom ファイルシステム、新しい tools/mkromfs.py ホストツール(tflite、tflite+vela、Haar カスケード、テキスト、バイナリ)、および ls_romfs() を公開する scripts/libraries/romfs.py ヘルパー。

  • ML 後処理 — 新しい yolo_v8_postprocess(YOLOv8)と yolo_lc_postprocess(組み込み向けに最適化されたデフォルトの anchors を備えた軽量な tiny-YOLOv2 バリアント)クラス。それぞれ thresholdnms_thresholdnms_sigma を取ります。

  • GenX320 アンチフリッカー — イベントセンサーのアンチフリッカーフィルター(最小/最大フリッカー周波数を Hz 単位で指定)を有効化および設定する新しい IOCTL_GENX320_SET_AFK ioctl。genx320_grayscale_set_afk.py の例が付属します。

  • VL53L8CXtof モジュールを通じた 8x8 マルチゾーン time-of-flight センサーのサポート(自動検出、15 Hz で 8x8)。

その他の変更と改善

  • MicroPython が 1.25.0 に更新されました(STM32 と i.MX RT のポート)。アップストリームの Alif ポートが追加され、従来の BT-HCI ドライバーが STM32 / i.MX RT のポートから削除されました。

  • GenX320 — 新しい ISSD シーケンスにより、内部ピクセルクロックが 2 倍(24 → 48 MHz)になり、より高いフレームレートが得られます。

  • STM32N6 / ST Edge AI — STM32N6 Neural-ART モデルデプロイの基盤整備(ST Edge AI ツールと ROMFS サポート)。

  • PAG7936 — CSI PHY ビットレートが設定されるようになり、このセンサーの動作が改善されました。

バグ修正

カメラとセンサー:

  • I2C 経由の IMU を修正しました — LSM6DSx IMU を I2C で配線しているボードが、正しく初期化および読み取りできるようになりました(I2C パスは以前、壊れた読み取りパスと誤った定数を使用していました)。

  • FLIR Boson の初期化は、起動に約 10 秒かかる古い(< IDD 4.x)センサーに対して最大 10 回リトライするようになりました。また、リセット時に工場出荷時のデフォルト設定が復元されるため、外部からロードされた設定がビデオ出力を壊すことがなくなりました。

  • GenX320 の psee_ehc_activate_override が誤った(ゼロの)累積時間を書き込んでいた問題を修正しました。

  • FastMode+ ハードウェアを持たない STM32 ボードでは、I2C ファストモードの要求が、バスを暗黙的に誤設定する代わりに適切にガードされるようになりました。

機械学習:

  • YOLOv2 / YOLOv5 後処理におけるバウンディングボックスの収集と np.nonzero の処理を修正し、検出の信頼性を向上させました。

ハードウェアとボードのサポート

  • OpenMV AE3 — 新しい Alif Ensemble(Cortex-M55 + Ethos-U55 NPU)ボード。

  • VL53L8CX — 8x8 マルチゾーン time-of-flight センサー。AE3 の ToF センサーは VL53L5CX から VL53L8CX に切り替えられました。

  • STM32N6 — ST Edge AI(Neural-ART)モデルデプロイの基盤整備。

破壊的な API 変更

v4.6.20 と v4.7.0 の間でユーザーから見える API の破壊的変更。対象範囲: modules/ 内の Python C モジュールと scripts/libraries/ 内の Python ライブラリ。

各変更には影響度のタグが付いています:

  • major — それを使用していたほとんどのスクリプトで編集が必要です。

  • minor — 限定的な API。それを使用していたスクリプトにのみ影響します。

  • behavior — 同じ API ですが結果が異なります。調整済みのスクリプトを再確認してください。

変更はその順序で影響度ごとにグループ化されています。コードを移植したいだけの場合は、末尾の 移行チェックリスト に進み、まとめられた ToDo リストを参照してください。各コミットハッシュは GitHub 上の diff にリンクしています。

組み込みモデルは名前ではなくパスでロードされます (major)

ml.Model は、組み込みモデルを単なる名前文字列からロードしなくなりました。モデルはパスによってファイルシステム / ROMFS からロードされるようになりました:

model = ml.Model("/rom/person_detect.tflite")   # was: ml.Model("person_detect")

C 側の model.labels 属性は削除されました。ラベルは、Python の ml.Model ラッパーによってサイドカーの <model>.txt ファイルからロードされるようになりました(存在しない場合は None)。同梱のすべての例と ml/apps.py/rom/*.tflite パスに更新されました。

Commits: 978fa436c, 3f55d956c, 416bc4613

Haar カスケードは ROMFS からロードされます (minor)

image.HaarCascade() は、組み込みカスケードを VFS / ROMFS を通じてロードするようになりました。デフォルトの正面顔カスケードファイルは haarcascade_frontalface_default.xml から haarcascade_frontalface.xml に名称変更され、ロード失敗時は OSError の代わりに RuntimeError("Failed to load Haar cascade")が発生するようになりました。

Commit: 9de1220d8

tof.reset() / tof.deinit() のセマンティクス (behavior)

tof モジュールでは、reset() は以前 init() のエイリアスであり、実際の deinit はありませんでした。tof.reset() は実際のセンサーリセットを実行するようになり、tof.deinit() はセンサーを適切にシャットダウンするようになりました(VL53L5CX のシャットダウンサポート付き)。reset() がセンサーを再初期化することに依存していたコードは再確認する必要があります。

Commits: 20d6b53f8, c743cab6a

GenX320 のタイミングとイベントモードの制約 (behavior)

新しい GenX320 ISSD シーケンスにより、センサーの時間基準が変わります: フレームレートと露出の引数は、クロックスケールされる代わりに 1 MHz 単位で表現されるようになり、HSYNC ブランキングは要求されたフレームレートに動的に調整されます。GenX320 のタイミング値をハードコードしていたスクリプトは再調整する必要があります。イベントモードのキャプチャは、画像の transpose が有効な場合にエラーを発生させるようになりました(その構成ではサポートされていません)。

Commits: 660a783d6, 7a718c6af

移行チェックリスト

v4.7.0 にクリーンに移植するための一般的な作業は次のとおりです:

  1. 組み込みモデルのロードを名前文字列から /rom/<name>.tflite パスに変更し、サイドカーの <name>.txt ファイル経由でラベルを提供します(ml.Model の変更)。

  2. haarcascade_frontalface_default.xmlhaarcascade_frontalface.xml に更新し、カスケードのロード失敗時に(OSError ではなく)RuntimeError をキャッチします(Haar カスケードの変更)。

  3. tof.reset() がセンサーを再初期化することに依存していたコードを削除します(tof の変更)。

  4. ハードコードされた GenX320 のフレームレート / 露出値を 1 MHz 単位に再調整し、イベントモードでは transpose を有効にしないようにします(GenX320 の変更)。