v5.0.0¶
v5.0.0 はメジャーリリースです。目玉となるのは、再構築された OpenMV Protocol V2 ホストリンク、マルチカメラボードにスケールするクラスベースの csi カメラAPI、実行可能な シミュレーター ターゲット、MoveNet シングルポーズ推定、MicroPython 1.28、そしてカメラ・ML・ToF に関する大量の修正です。また、いくつかの破壊的なAPI変更も含まれています。v4.8.1 以降のユーザーから見えるすべての変更を、正確な移行方法とともに以下に列挙します。
ハイライト¶
OpenMV Protocol V2。 ホスト/IDE リンクをゼロから再構築しました。フレーム化・シーケンス管理・CRC チェック付きで、stdio・ストリームプレビュー・ユーザーデータ用に多重化されたチャネルを備えています。新しい
protocolモジュールにより、スクリプトが独自のトランスポートとデータチャネルを作成できます。protocol モジュールの変更 を参照してください。クラスベースの
csiカメラAPI。import sensorはimport csi/csi.CSIに置き換わり、ネイティブなマルチカメラ対応を備えています。csi の移行 を参照してください。シミュレーターターゲット。 ファームウェアは Arm FVP / QEMU シミュレーター(MPS2/MPS3)上でビルド・実行できるようになり、NPU・ROMFS・PSRAM のエミュレーションも含まれます。これにより、ハードウェアを接続せずにビジョンおよび ML スクリプトを実行できます。
MoveNet ポーズ推定。 新しい
MoveNetポストプロセッサに加え、OpenMV AE3 と N6 にmovenet_singlepose_192.tfliteモデルが同梱されました。MicroPython 1.28 と ulab 6.12.0、ST Edge AI 4.0 ツール群、そして外部化された OpenMV SDK(ビルド/ツールの変更 を参照)。
新機能¶
The
protocolmodule — create custom transports and data channels from Python:protocol.init(),protocol.register(),protocol.is_active(), and aprotocol.ProtocolChannelclass withsend_event(), plusCHANNEL_FLAG_*andCHANNEL_ID_*constants. The finalprotocol.init()signature is documented in the protocol module changes.protocol.CBORChannel— 名前付きフィールドを CBOR にシリアライズし、表示ウィジェット(ラベル、深度)とインタラクティブなコントロール(トグル、スライダー、セレクト)を備えた、フリーズ済みのprotocol拡張パッケージです。ホストメモリとストリームのイントロスペクション — 新しい
SYS_MEMORYプロトコルコマンドにより、プールごとのランタイムメモリ統計を IDE に公開します。また、新しいSTREAM_SOURCEストリーム ioctl により、マルチカメラボードでどのカメラがプレビューを供給するかをホストが選択できます(プロトコルバージョン 1.0.1)。マルチカメラストリーミング —
csi.CSIは、どのセンサーが IDE プレビューを供給するかを選択するstream=引数を受け取ります。ストリームフレームヘッダーには EMA で平滑化された FPS が含まれるようになり、IDE はclock.fps()の定型コードなしでフレームレートを表示します。csi の移行 および csi のフォローアップ を参照してください。GenX320 イベントセンサー — 新しい時空間コントラストフィルター(
csi.GENX320_STC_DISABLE、csi.GENX320_STC_ONLY、csi.GENX320_STC_TRAIL_ONLY、csi.GENX320_STC_TRAILの各モードを持つcsi.IOCTL_GENX320_SET_STC)と、生イベント読み取り(csi.IOCTL_GENX320_READ_EVENTS_RAW)が、新しいサンプルスクリプトとともに追加されました。MoveNet— 新しい MediaPipe シングルポーズポストプロセッサ(threshold、nms_threshold、nms_sigmaキーワード引数)で、17 関節の COCO キーポイント配列を持つ((x, y, w, h), score, keypoints)を返します。movenet_singlepose_192.tfliteモデルとサンプルが AE3 と N6 に同梱されています。ml.utils.draw_predictions()— 新しいオプションのscores=引数でラベルごとの信頼度を付加できるようになり、フォントとボックスの線幅が画像幅に合わせて自動スケールするようになりました。また、新しいformat="point"モードでは、中心点/ピーク検出器向けに中心マーカーを描画します。新しい
display.TVDisplayクラス(汎用のioctl()付き)が、独立したtvモジュールを置き換えます。display モジュールの変更 を参照してください。新しい
find_line_segments()検出器(ED-Lines)— すべてのビルドで利用できるようになり、新しいthreshold=引数が追加されました。image モジュールの変更 を参照してください。
その他の変更と改善¶
MicroPython を v4.8.1 ベースから 1.28.0 に更新しました。 H5/H7/N6 での高速 SD カードモード、低電力モードでの AHB5 クロック、OPENMV_AE3 での GPIO として制御可能な JTAG ピンを追加しました。
ulab を 6.12.0 に更新しました — ndarray でネイティブの
%演算子をサポートします(ml.utils.mod()ヘルパーは削除されました。ML ライブラリの変更 を参照してください)。ST Edge AI ツールを 4.0 に更新しました — オンデバイスの ST モデルコンパイルとデプロイに影響します。
ml.Model—load_to_fbキーワード引数は削除されました。モデルのメモリは統合アロケータによって自動的に処理されます。image.Image.scale()のインプレース処理 — 画像をインプレースで拡大する場合(例img.scale(x_scale=2.0, y_scale=2.0))、失敗する代わりにフレームバッファを必要に応じて拡張するようになりました。より大きな stdio バッファ — IDE へのデフォルトのテキストバッファが、OpenMV 2/3/4、Nicla Vision、AE3、N6 で 512 バイトから 1024 バイトに拡大しました。これにより、大きな
print()バーストが切り詰められなくなります。よりスムーズなホストイベントフロー — ホストへの stdout NOTIFY イベントは、リングバッファのウォーターマークを超える
print()ごとに 1 回ではなく、ホストの読み取りごとに最大 1 回に制限されるようになりました。中断可能な長時間処理 — 長時間の画像描画、GPU(Nema/Dave2D)、NPU の待機ループは、決定論的な間隔でイベントを処理するようになりました。これにより、重い処理中でもスクリプトが IDE の停止ボタンに応答し続けます。
バグ修正¶
カメラとセンサー:
find_apriltags()は、D-cache/GPU ボード(N6、AE3)で結果を破損しなくなり、AE3 でも動作するようになりました。STM32 N6 ISP でピクセルフォーマットを切り替えた後の Bayer 画像出力を修正しました。
明るいシーンでのグリーンのオートホワイトバランス飽和と、初期化されていない最初のフレームの AWB 統計のケースを修正しました。また、より広いガンマ/コントラスト/明るさの範囲のために、STM32 ISP のガンマクランプ(32 から 63)を引き上げました。
PS5520 のオートエクスポージャーが明るい光の下で振動しなくなりました。PAG7936 の AEC/AGC の挙動を作り直しました(制御を統合し、ゲイン上限を修正)。
Portenta/Nicla での OV5640 オートフォーカスファームウェアのアップロードを復旧しました(MIMXRT I2C SUSPEND 修正)。
フレームレート制限と JPEG キャプチャを組み合わせた場合のカメラキャプチャのデッドロック(STM32)を修正しました。
GenX320 の
csi.IOCTL_GENX320_READ_EVENTS_RAW読み取りが IDE プレビューを乱さなくなりました。FLIR Lepton の
csi.CSI.ioctl()経由のcsi.IOCTL_LEPTON_SET_MODEが、単一引数で呼び出したときに動作するようになりました。
画像処理:
マスクが指定された場合の
draw_image()/blend()のアルファブレンディングを修正しました。1 ビット(BINARY)PNG のエンコード/デコードのビット順序と、1 ビットからのグレースケールデコードを修正しました。
mjpeg.Mjpeg録画の長さ/FPS メタデータを修正しました。小スタックボード(OpenMV M7)でのソフトウェア JPEG デコードのスタックオーバーフローを修正しました。
非 ARM ホスト(シミュレーター)での JPEG/PNG ファイルフォーマットの自動検出を修正しました。
Time-of-Flight:
tof.read_depth()は、一時的な測距エラーで例外を発生させなくなり、バス障害から自動回復します。デフォルトのtof.read_depth()/tof.snapshot()のタイムアウトは 100 ms になりました(tof の変更 を参照)。VL53L5CX / VL53L8CX のマルチゾーン深度データの破損を修正しました。
ML とシステム:
N6 で推論が中断された場合、NPU が正しくクリーンアップされるようになりました。
N6 でのディープスリープ/スタンバイからのウェイクアップを復旧しました。AE3 のブートローダーへのジャンプ時のハングを修正しました。
ソフトリセット時のメモリリーク(STM32 Nema GPU)と、早すぎる回収による補助フレームバッファの問題を修正しました。
カスタムの Python プロトコルチャネルがソフトリブートを生き残るようになり、USB トランスポートがバスリセット/ストールしたエンドポイントから回復するようになりました。また、USB SOF 割り込みのフラッディングを修正しました。
ハードウェアとボードのサポート¶
OpenMV N6 — Ethernet を有効化(有線ネットワーク)。NPU AXI SRAM(1.75 MB)を共有の一時プールにマージして、推論間のRAMを増加。ディープスリープ/スタンバイからのウェイクアップ。TFLite モデルと Haar カスケードを ROMFS に同梱。
OpenMV AE3 — モデルとカスケードを ROMFS に同梱。
cbor2をファームウェアにフリーズ。Alif(AE3、N6) — 低電力の
machine.RTCウェイクアップ。高解像度 AprilTags — AE3、Arduino Giga、Arduino Portenta H7 でのフルセンサー解像度の
find_apriltags()。シミュレーターターゲット — MPS2_AN500 / MPS3_AN547(Arm FVP / QEMU)、NPU・ROMFS・PSRAM のエミュレーション付き。
破壊的なAPI変更¶
v4.8.1 と v5.0.0 の間でユーザーから見える API の破壊的変更です。対象範囲: modules/ 内の Python C モジュールと scripts/libraries/ 内の Python ライブラリ。
各変更には影響度のタグが付いています:
major — ほとんどのスクリプトで編集が必要です。
minor — 限定的な API。それを使用していたスクリプトのみに影響します。
behavior — 同じ API ですが結果が異なります。チューニング済みのスクリプトを再確認してください。
tooling — ソースからのビルド/下流のフォークのみに影響します。
変更はその順序で影響度ごとにグループ化されています — 最初に major、次に minor、behavior、tooling です。コードを移植したいだけなら、末尾の 移行チェックリスト にジャンプすると、凝縮された ToDo リストがあります。各コミットハッシュは GitHub 上の差分にリンクしています。
sensor が csi に置き換え (major)¶
公式サンプルはすべて、import sensor をやめて import csi を使うように書き直されました。従来のモジュールレベルの関数型 API(sensor.reset()、sensor.set_pixformat()、…)は、クラスベースの csi.CSI API に取って代わられました。この API は複数のカメラ(csi0、csi1、…)を持つボードに自然にスケールし、すべての新機能(stream= キーワード引数、マルチセンサーストリーミング、…)に必須です。
sensor qstr は、後方互換のファームウェアビルドのために modules/py_csi.c で引き続き配線されていますが、新機能は追加されません。すべてのサンプル・ドキュメント・ライブラリコードは csi を前提とするようになりました。
モジュールからクラスへ
変更前(sensor):
import sensor
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.skip_frames(time=2000)
img = sensor.snapshot()
変更後(csi):
import csi
csi0 = csi.CSI()
csi0.reset()
csi0.pixformat(csi.RGB565)
csi0.framesize(csi.QVGA)
csi0.snapshot(time=2000)
img = csi0.snapshot()
セッター/ゲッターのペアを統合したアクセサに集約
新しい API では、引数 なし で呼び出したメソッドは現在の値を返し、値 とともに 呼び出すとそれを設定します。set_*/get_* プレフィックスはなくなりました。メソッド名は冗長だった ing サフィックスも失いました(windowing → window)。新 API 列はリファレンスドキュメントにリンクしています。
|
|
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
直接の同等物がない関数
|
代わりに使用するもの |
|---|---|
|
|
|
|
|
|
|
|
|
削除されました。 |
|
|
New on csi.CSI
csi.CSI(stream=True|False)— どの CSI がプレビューフレームバッファを供給するかを選択する、構築時のセレクタです(スナップショットごとのupdate=キーワード引数を置き換えます。csi のフォローアップ を参照)。csi.CSI(cid=N)/csi.devices()— 複数の画像センサーを持つボード向けのマルチ CSI サポートです。
image モジュール — シグネチャの全面見直し (major)¶
image モジュールは、csi に次いで最も広範な API 変更が行われました — 描画シグネチャ、結果オブジェクト、いくつかの検出器がすべて変更されました。
座標引数はタプルでなければならない
modules/py_image.c は mp_arg_parse_all の上に書き直されました。以前は別々の x, y, ... 位置引数を取っていたすべての描画/ピクセルメソッドは、これらの座標を 1 つのタプルにまとめることが必要になりました。
コミット: d18bbc472、0c60c94b9(PR #3061)
変更前 |
変更後 |
|---|---|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
これらはすべて image.Image のメソッドです。
結果オブジェクトを attrtuple に変換
これらの型は MicroPython の attrtuple オブジェクトになりました: similarity、statistics、percentile、threshold、line、circle、rect、qrcode、apriltag、datamatrix、barcode、displacement、kptmatch。括弧なしの属性アクセスが正規の方法になりました。
コミット: 3399d302e
変更前(メソッドスタイル):
img.draw_cross(match.cx(), match.cy())
img.draw_rectangle(blob.rect())
変更後(属性スタイル):
img.draw_cross((match.cx, match.cy))
img.draw_rectangle(blob.rect)
blob と histogram は変更されていません — 既存の型と () アクセサを維持します(attrtuple ではブロブの遅延計算される値や、ヒストグラムの引数を取るアクセサを表現できないためです)。
find_features の haar パラメータ名変更
image.Image.find_features() — scale_factor= が scale= に名前変更されました。
コミット: be4c5cd73
get_regression — 常にロバストになり、target_size を追加
image.Image.get_regression() は 常に ロバスト(Theil-Sen)回帰を使用するようになりました。古い高速な最小二乗法のパスは削除されたため、robust= キーワードはなくなりました — 以前 robust=True を必要としていた動作が、今では唯一の動作です。新しい target_size=(w, h) キーワード引数(デフォルト (80, 60))は、O(N^2) の Theil-Sen フィットの前に ROI を面積スケーリングで縮小し、常に妥当な画像サイズで実行されるようにします。フィットされた線の端点は元の座標にマッピングし直されます。linear_regression_robust.py サンプルは削除され、linear_regression_fast.py は linear_regression.py に名前変更されました。
find_line_segments — 新しいアルゴリズム
image.Image.find_line_segments() — 古い LSD 検出器が ED-Lines に置き換えられ、新しい threshold=50 キーワード引数が追加されました。以前チューニングしたスクリプトの出力は変わります。
AprilTag ライブラリの置き換え
image.Image.find_apriltags() — AprilTag 検出器が新しい実装に置き換えられました。ファミリーのセットが変更されました:
削除 |
追加 |
|---|---|
|
|
コミット: e813bada7
csi モジュールのフォローアップ (minor)¶
csi の移行 の上に重ねた、より小さな csi のフォローアップです。
snapshot(update=...) の削除
csi.CSI.snapshot() の update キーワード引数はなくなりました。CSI デバイスがプレビューフレームバッファを供給しないようにするには、構築時にオプトアウトしてください:
csi0 = csi.CSI(stream=False) # was: csi0.snapshot(update=False)
csi1.snapshot(blocking=False, image=fir_img) # was: ...(update=False, ...)
framebuffers() の expand 引数の削除
csi.CSI.framebuffers() — 3 番目の位置引数(expand)はなくなりました。シグネチャは framebuffers([count]) になりました。
コミット: 86cb3a5de
protocol モジュール (minor)¶
ホストリンクを直接駆動していたスクリプトのみに影響します。protocol を参照してください。
timer_ms を poll_ms に名前変更
protocol.init() — timer_ms 引数が poll_ms に名前変更されました。
protocol.init(..., poll_ms=10) # was: timer_ms=10
protocol.poll() の削除
プロトコルタスクは内部でスケジュールされるようになりました。protocol.poll() を呼び出すと AttributeError が発生します。
コミット: 8a0635e8c
soft_reboot 設定引数の削除
protocol.init() — soft_reboot 引数はなくなりました。現行のすべてのトランスポートはソフトリブートを許容するため、この動作は無条件になりました。
コミット: 0bf766aa2
display モジュール (minor)¶
TV 出力は、独立した tv モジュールではなく display.TVDisplay オブジェクトを経由するようになりました。display には汎用の ioctl() も追加されました。
tof モジュール (behavior)¶
API は以前と同じですが、デフォルト値とエラー処理が変更されました。tof を参照してください。
デフォルトのタイムアウトの変更
tof.read_depth() と tof.snapshot()(timeout=-1 で呼び出した場合)は、無期限に待機するのではなく、デフォルトで 100 ms になりました。以前の動作が必要な場合は、明示的により大きな値を渡してください。
コミット: b6772b80d
自動回復
ドライバは、測距/タイムアウトエラー時に I2C バスとセンサーをハードリセットするようになりました。サンプルは例外ハンドラ内で tof.reset() を呼び出さなくなりました — 手動で回復していたユーザーコードはそれを削除すべきです(新しい自動回復と競合します)。
ML ライブラリ (behavior)¶
API は同じですが数値が異なります — チューニング済みの ML パイプラインを再確認してください。
前処理がレターボックスではなくストレッチを行うように
Normalization は、image.SCALE_ASPECT_EXPAND(レターボックス)ではなく image.SCALE_ASPECT_IGNORE(ストレッチ)を使用するようになりました。NMS 後処理も、独立した x/y スケーリングに切り替わりました。
注釈
影響。 YOLO スタイルの検出器とキーポイント回帰器は概して改善します。BlazeFace、BlazePalm、FaceLandmarks、HandLandmarks のサンプルは、入力 ROI に対する手動の正方形クロップが必要になりました — サンプルスクリプトは更新済みです。カスタムのユーザーコードも同様にする必要があります。
コミット: 68dc29a33
ml.utils.mod() ヘルパーの削除
ulab 6.12.0 は ndarray での % をネイティブにサポートします。ml.utils から mod をインポートしていたコードは a % b を使用する必要があります。
ビルド/ツール (tooling)¶
これらはいずれも MicroPython スクリプトに影響しません。ソースからファームウェアをビルドするには、外部の OpenMV SDK(1.6.0、以前はツリー内)が必要になりました。いくつかのツリー内ビルドツールが削除され、N6 は TinyUSB スタックに移行しました。下流のフォークは ファームウェアリポジトリ の履歴を確認してください — 特に buffered 引数を削除した file_open() のシグネチャに注目してください。
移行チェックリスト¶
v5.0.0 へのクリーンな移植では、典型的な作業は次のとおりです:
import sensorをimport csi; csi0 = csi.CSI()に置き換え、すべてのset_*/get_*呼び出しを対応するcsi.CSIアクセサに変換します(csi の移行)。img.draw_*、get_pixel()、set_pixel()への座標引数をタプルで包みます(image モジュールの変更)。新しい慣用的な形式が必要なら attrtuple 結果アクセサから
()を削除します。あるいは、attrtuple は引き続き呼び出し可能なアクセサをサポートするため、古いスタイルをそのままにしておくこともできます(image モジュールの変更)。find_line_segments()、get_regression()、そしてfind_apriltags()のファミリー選択を監査します(image モジュールの変更)。protocol.init()の呼び出しでtimer_ms→poll_msに名前変更します。protocol.poll()とsoft_reboot=を削除します(protocol モジュールの変更)。ML ワークフローについて: レターボックス入力を必要としていたモデルを見直します(ML ライブラリの変更)。