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 sensorimport csi / csi.CSI に置き換わり、ネイティブなマルチカメラ対応を備えています。csi の移行 を参照してください。

  • シミュレーターターゲット。 ファームウェアは Arm FVP / QEMU シミュレーター(MPS2/MPS3)上でビルド・実行できるようになり、NPU・ROMFS・PSRAM のエミュレーションも含まれます。これにより、ハードウェアを接続せずにビジョンおよび ML スクリプトを実行できます。

  • MoveNet ポーズ推定。 新しい MoveNet ポストプロセッサに加え、OpenMV AE3 と N6 に movenet_singlepose_192.tflite モデルが同梱されました。

  • MicroPython 1.28ulab 6.12.0ST Edge AI 4.0 ツール群、そして外部化された OpenMV SDKビルド/ツールの変更 を参照)。

新機能

  • The protocol module — create custom transports and data channels from Python: protocol.init(), protocol.register(), protocol.is_active(), and a protocol.ProtocolChannel class with send_event(), plus CHANNEL_FLAG_* and CHANNEL_ID_* constants. The final protocol.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_DISABLEcsi.GENX320_STC_ONLYcsi.GENX320_STC_TRAIL_ONLYcsi.GENX320_STC_TRAIL の各モードを持つ csi.IOCTL_GENX320_SET_STC)と、生イベント読み取り(csi.IOCTL_GENX320_READ_EVENTS_RAW)が、新しいサンプルスクリプトとともに追加されました。

  • MoveNet — 新しい MediaPipe シングルポーズポストプロセッサ(thresholdnms_thresholdnms_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.Modelload_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、次に minorbehaviortooling です。コードを移植したいだけなら、末尾の 移行チェックリスト にジャンプすると、凝縮された ToDo リストがあります。各コミットハッシュは GitHub 上の差分にリンクしています。

sensorcsi に置き換え (major)

公式サンプルはすべて、import sensor をやめて import csi を使うように書き直されました。従来のモジュールレベルの関数型 API(sensor.reset()sensor.set_pixformat()、…)は、クラスベースの csi.CSI API に取って代わられました。この API は複数のカメラ(csi0csi1、…)を持つボードに自然にスケールし、すべての新機能(stream= キーワード引数、マルチセンサーストリーミング、…)に必須です。

sensor qstr は、後方互換のファームウェアビルドのために modules/py_csi.c で引き続き配線されていますが、新機能は追加されません。すべてのサンプル・ドキュメント・ライブラリコードは csi を前提とするようになりました。

コミット: 945c5853c61f835b7e

モジュールからクラスへ

変更前(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 サフィックスも失いました(windowingwindow)。新 API 列はリファレンスドキュメントにリンクしています。

sensor(旧)

csi.CSI(新)

set_pixformat(fmt) / get_pixformat()

pixformat([fmt])

set_framesize(sz) / get_framesize()

framesize([sz])

set_framerate(fps) / get_framerate()

framerate([fps])

set_windowing(roi) / get_windowing()

window([roi])

set_framebuffers(n) / get_framebuffers()

framebuffers([n])

set_gainceiling(g)

gainceiling([g])

set_brightness(v)

brightness([v])

set_contrast(v)

contrast([v])

set_saturation(v)

saturation([v])

set_quality(v)

quality([v])

set_colorbar(b)

colorbar([b])

set_special_effect(e)

special_effect([e])

set_lens_correction(...)

lens_correction(...)

set_hmirror(b) / get_hmirror()

hmirror([b])

set_vflip(b) / get_vflip()

vflip([b])

set_transpose(b) / get_transpose()

transpose([b])

set_auto_rotation(b) / get_auto_rotation()

auto_rotation([b])

set_auto_gain(b, [db, ceiling]) / get_gain_db()

auto_gain(...) / gain_db()

set_auto_exposure(b, [us]) / get_exposure_us()

auto_exposure(...) / exposure_us()

set_auto_whitebal(b, [rgb]) / get_rgb_gain_db()

auto_whitebal(...) / rgb_gain_db()

set_auto_blc(b, [regs]) / get_blc_regs()

auto_blc(...) / blc_regs()

set_color_palette(p) / get_color_palette()

color_palette([p])

set_frame_callback(cb)

frame_callback(cb)

set_vsync_callback(cb)

vsync_callback(cb)

get_id()

cid()

直接の同等物がない関数

sensor(削除済み)

代わりに使用するもの

sensor.alloc_extra_fb(w, h, pixfmt) / sensor.dealloc_extra_fb()

image.Image (w, h, pixfmt) — 通常のヒープ割り当て画像です。フレームバッファがユーザーバッファ用に切り分けられることはなくなりました。

sensor.skip_frames(time=..., frames=...)

csi.CSI.snapshot() — skip-frames は snapshottime= / frames= 引数に統合されました。

sensor.disable_delays(...) / sensor.disable_full_flush(...)

csi.CSI コンストラクタに移動しました: csi.CSI(delays=False) / csi.CSI(fflush=False)

sensor.get_frame_available()

csi.CSI.readable()

sensor.get_fb()

削除されました。csi.CSI.snapshot() が返す画像が正規のハンドルです。

sensor.set_framebuffers(n, expand=True)

csi.CSI.framebuffers()expand 引数は削除されました(csi のフォローアップ を参照)。

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.cmp_arg_parse_all の上に書き直されました。以前は別々の x, y, ... 位置引数を取っていたすべての描画/ピクセルメソッドは、これらの座標を 1 つのタプルにまとめることが必要になりました。

コミット: d18bbc4720c60c94b9PR #3061

変更前

変更後

img.draw_arrow(x0, y0, x1, y1, color=...)

img.draw_arrow((x0, y0, x1, y1), color=...)

img.draw_line(x0, y0, x1, y1, ...)

img.draw_line((x0, y0, x1, y1), ...)

img.draw_cross(x, y, ...)

img.draw_cross((x, y), ...)

img.draw_circle(x, y, r, ...)

img.draw_circle((x, y, r), ...)

img.draw_rectangle(x, y, w, h, ...)

img.draw_rectangle((x, y, w, h), ...)

img.draw_string(x, y, "txt", ...)

img.draw_string((x, y), "txt", ...)

img.draw_ellipse(x, y, rx, ry, rot, ...)

img.draw_ellipse((x, y, rx, ry, rot), ...)

img.flood_fill(x, y, ...)

img.flood_fill((x, y), ...)

img.get_pixel(x, y, rgbtuple=...)

img.get_pixel((x, y), rgbtuple=...)

img.set_pixel(x, y, color)

img.set_pixel((x, y), color)

これらはすべて image.Image のメソッドです。

結果オブジェクトを attrtuple に変換

これらの型は MicroPython の attrtuple オブジェクトになりました: similaritystatisticspercentilethresholdlinecirclerectqrcodeapriltagdatamatrixbarcodedisplacementkptmatch。括弧なしの属性アクセスが正規の方法になりました。

コミット: 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)

blobhistogram は変更されていません — 既存の型と () アクセサを維持します(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.pylinear_regression.py に名前変更されました。

コミット: c7c2e69a00ff2afa72

find_line_segments — 新しいアルゴリズム

image.Image.find_line_segments() — 古い LSD 検出器が ED-Lines に置き換えられ、新しい threshold=50 キーワード引数が追加されました。以前チューニングしたスクリプトの出力は変わります。

コミット: 87da2a7b72c47b5735

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, ...)

コミット: 9a807782726b79a2c5

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

コミット: 8a0635e8c95a290607

protocol.poll() の削除

プロトコルタスクは内部でスケジュールされるようになりました。protocol.poll() を呼び出すと AttributeError が発生します。

コミット: 8a0635e8c

soft_reboot 設定引数の削除

protocol.init()soft_reboot 引数はなくなりました。現行のすべてのトランスポートはソフトリブートを許容するため、この動作は無条件になりました。

コミット: 0bf766aa2

display モジュール (minor)

TV 出力は、独立した tv モジュールではなく display.TVDisplay オブジェクトを経由するようになりました。display には汎用の ioctl() も追加されました。

コミット: f0accb3891a5a87121920c097a09eac55098

tof モジュール (behavior)

API は以前と同じですが、デフォルト値とエラー処理が変更されました。tof を参照してください。

デフォルトのタイムアウトの変更

tof.read_depth()tof.snapshot()timeout=-1 で呼び出した場合)は、無期限に待機するのではなく、デフォルトで 100 ms になりました。以前の動作が必要な場合は、明示的により大きな値を渡してください。

コミット: b6772b80d

自動回復

ドライバは、測距/タイムアウトエラー時に I2C バスとセンサーをハードリセットするようになりました。サンプルは例外ハンドラ内で tof.reset() を呼び出さなくなりました — 手動で回復していたユーザーコードはそれを削除すべきです(新しい自動回復と競合します)。

コミット: b6772b80d80ffaa5c3

ML ライブラリ (behavior)

API は同じですが数値が異なります — チューニング済みの ML パイプラインを再確認してください。

前処理がレターボックスではなくストレッチを行うように

Normalization は、image.SCALE_ASPECT_EXPAND(レターボックス)ではなく image.SCALE_ASPECT_IGNORE(ストレッチ)を使用するようになりました。NMS 後処理も、独立した x/y スケーリングに切り替わりました。

注釈

影響。 YOLO スタイルの検出器とキーポイント回帰器は概して改善します。BlazeFaceBlazePalmFaceLandmarksHandLandmarks のサンプルは、入力 ROI に対する手動の正方形クロップが必要になりました — サンプルスクリプトは更新済みです。カスタムのユーザーコードも同様にする必要があります。

コミット: 68dc29a33

ml.utils.mod() ヘルパーの削除

ulab 6.12.0 は ndarray での % をネイティブにサポートします。ml.utils から mod をインポートしていたコードは a % b を使用する必要があります。

コミット: 35ece572882fbd858c

ビルド/ツール (tooling)

これらはいずれも MicroPython スクリプトに影響しません。ソースからファームウェアをビルドするには、外部の OpenMV SDK(1.6.0、以前はツリー内)が必要になりました。いくつかのツリー内ビルドツールが削除され、N6 は TinyUSB スタックに移行しました。下流のフォークは ファームウェアリポジトリ の履歴を確認してください — 特に buffered 引数を削除した file_open() のシグネチャに注目してください。

移行チェックリスト

v5.0.0 へのクリーンな移植では、典型的な作業は次のとおりです:

  1. import sensorimport csi; csi0 = csi.CSI() に置き換え、すべての set_*/get_* 呼び出しを対応する csi.CSI アクセサに変換します(csi の移行)。

  2. img.draw_*get_pixel()set_pixel() への座標引数をタプルで包みます(image モジュールの変更)。

  3. 新しい慣用的な形式が必要なら attrtuple 結果アクセサから () を削除します。あるいは、attrtuple は引き続き呼び出し可能なアクセサをサポートするため、古いスタイルをそのままにしておくこともできます(image モジュールの変更)。

  4. find_line_segments()get_regression()、そして find_apriltags() のファミリー選択を監査します(image モジュールの変更)。

  5. protocol.init() の呼び出しで timer_mspoll_ms に名前変更します。protocol.poll()soft_reboot= を削除します(protocol モジュールの変更)。

  6. ML ワークフローについて: レターボックス入力を必要としていたモデルを見直します(ML ライブラリの変更)。