v4.7.0

v4.7.0 — це великий випуск нових можливостей. Головні нововведення: нова плата OpenMV AE3 (Alif Ensemble, Cortex-M55 + Ethos-U55 NPU) з двоядерною моделлю програмування openamp, файлова система лише для читання ROMFS (/rom) з вбудованими моделями та каскадами, підтримка часового датчика відстані VL53L8CX 8x8, нові постпроцесори YOLOv8 / YOLO-LC та MicroPython 1.25. Також змінено спосіб завантаження вбудованих моделей та каскадів Хаара — перегляньте несумісні зміни нижче.

Основні можливості

  • Плата OpenMV AE3 — плата Alif Ensemble (Cortex-M55 + Ethos-U55 NPU) з повним портом, завантажувачем та ROMFS.

  • Двоядерний модуль openamp — вивантаження роботи на другий ядро Alif через RPMsg (декоратор @async_remote, Endpoint/ EndpointIO).

  • ROMFS — файлова система лише для читання /rom з вбудованими моделями TFLite та каскадами Хаара, плюс новий інструмент збирання для хоста tools/mkromfs.py.

  • Підтримка багатозонного часового датчика відстані VL53L8CX 8x8.

  • Нові постпроцесори МНyolo_v8_postprocess та yolo_lc_postprocess.

  • MicroPython оновлено до 1.25.0.

  • Несумісна зміна: вбудовані моделі та каскади Хаара тепер завантажуються з /rom за шляхом (дивіться зміну ml.Model та зміну каскадів Хаара).

Нові можливості

  • OpenMV AE3 — нова плата Alif Ensemble (основне ядро Cortex-M55 + Ethos-U55 NPU) з портом, завантажувачем, конфігурацією плати, RGB LED та підтримкою ROMFS.

  • openamp — новий модуль для двоядерної моделі RPC Alif (Open-AMP / RPMsg): Endpoint, EndpointIO, new_service_callback та декоратор @async_remote для вивантаження маршальованих функцій на друге ядро. Ядра HE/HP постачаються зі стандартним виконавцем задач _boot.py на основі asyncio.

  • audio — порт Alif додає модуль audio (мікрофон PDM) з API потокової передачі на основі зворотнього виклику (audio.init(channels=, frequency=, gain_db=, buffers=, samples=, overflow=, highpass=)) на AE3.

  • ROMFS — файлова система лише для читання /rom з вбудованими ресурсами (моделі TFLite, каскади Хаара, …) упакованими для кожної плати, новий інструмент хоста tools/mkromfs.py (tflite, tflite+vela, каскад Хаара, текст, бінарні дані) та допоміжний модуль scripts/libraries/romfs.py з функцією ls_romfs().

  • Постобробка МН — нові класи yolo_v8_postprocess (YOLOv8) та yolo_lc_postprocess (легкий варіант tiny-YOLOv2 з оптимізованими для вбудованих систем стандартними якорями), кожен приймає threshold, nms_threshold та nms_sigma.

  • Антифлікер GenX320 — новий ioctl IOCTL_GENX320_SET_AFK для увімкнення та налаштування антифлікерного фільтра подієвого датчика (мінімальна/максимальна частота мерехтіння в Гц) з прикладом genx320_grayscale_set_afk.py.

  • VL53L8CX — підтримка багатозонного часового датчика відстані 8x8 через модуль tof (автовизначення, 8x8 при 15 Гц).

Інші зміни та покращення

  • MicroPython оновлено до 1.25.0 (порти STM32 та i.MX RT) з додаванням вихідного порту Alif та видаленням застарілих драйверів BT-HCI з портів STM32 / i.MX RT.

  • GenX320 — нова послідовність ISSD подвоює внутрішню тактову частоту пікселів (24 → 48 МГц) для вищих частот кадрів.

  • STM32N6 / ST Edge AI — підготовка розгортання моделей Neural-ART для STM32N6 (інструменти ST Edge AI та підтримка ROMFS).

  • PAG7936 — тепер встановлюється швидкість PHY CSI, що покращує роботу цього датчика.

Виправлення помилок

Камера та датчики:

  • Виправлено IMU через I2C — плати, що підключають IMU LSM6DSx через I2C, тепер правильно ініціалізуються та зчитуються (шлях I2C раніше використовував несправний шлях читання та неправильні константи).

  • Ініціалізація FLIR Boson тепер повторює спробу до 10 разів для старих датчиків (< IDD 4.x), яким потрібно ~10 с для завантаження, а заводські налаштування відновлюються при скиданні, щоб зовнішньо завантажені налаштування не порушували відеовихід.

  • Виправлено psee_ehc_activate_override для GenX320, що записував неправильний (нульовий) час накопичення.

  • На платах STM32 без апаратного прискореного режиму I2C FastMode+, запит швидкого режиму I2C тепер правильно захищається замість мовчазного неправильного налаштування шини.

Машинне навчання:

  • Виправлено збір обмежувальних прямокутників та обробку np.nonzero у постпроцесорах YOLOv2 / YOLOv5, що покращує надійність виявлення.

Підтримка апаратного забезпечення та плат

  • OpenMV AE3 — нова плата Alif Ensemble (Cortex-M55 + Ethos-U55 NPU).

  • VL53L8CX — багатозонний часовий датчик відстані 8x8; датчик ToF для AE3 перемкнуто з VL53L5CX на VL53L8CX.

  • STM32N6 — підготовка розгортання моделей ST Edge AI (Neural-ART).

Несумісні зміни API

Видимі користувачу зміни API між v4.6.20 та v4.7.0. Охоплення: C-модулі Python в modules/ та бібліотеки Python в scripts/libraries/.

Кожна зміна позначена своїм впливом:

  • major — більшість скриптів, що використовували це, потребують виправлень.

  • minor — вузький API; стосується лише скриптів, що використовували його.

  • behavior — той самий API, інші результати; перевірте налаштовані скрипти.

Зміни згруповані за впливом у такому порядку. Якщо ви просто хочете перенести свій код, перейдіть до контрольного списку міграції в кінці для стислого списку завдань. Кожен хеш коміту веде до його diff на GitHub.

Вбудовані моделі завантажуються за шляхом, а не за назвою (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.

Коміти: 978fa436c, 3f55d956c, 416bc4613

Каскади Хаара завантажуються з ROMFS (minor)

image.HaarCascade() тепер завантажує вбудовані каскади через VFS / ROMFS. Стандартний файл каскаду для виявлення обличчя перейменовано з haarcascade_frontalface_default.xml на haarcascade_frontalface.xml, а помилка завантаження тепер викидає RuntimeError («Failed to load Haar cascade») замість OSError.

Коміт: 9de1220d8

Семантика tof.reset() / tof.deinit() (behavior)

У модулі tof функція reset() раніше була псевдонімом init() і справжнього deinit не існувало. tof.reset() тепер виконує справжнє скидання датчика, а tof.deinit() правильно вимикає датчик (з підтримкою вимкнення VL53L5CX). Код, що покладався на reset() для повторної ініціалізації датчика, слід перевірити.

Коміти: 20d6b53f8, c743cab6a

Обмеження часових параметрів та режиму подій GenX320 (behavior)

Нова послідовність ISSD для GenX320 змінює базу відліку часу датчика: аргументи частоти кадрів та витримки тепер виражаються в одиницях 1 МГц замість масштабування за тактовою частотою, а гасіння HSYNC динамічно підлаштовується до запитаної частоти кадрів. Скрипти, що жорстко кодували значення часових параметрів GenX320, необхідно перенастроїти. Захоплення в режимі подій тепер викидає помилку при увімкненій транспозиції зображення (не підтримується в цій конфігурації).

Коміти: 660a783d6, 7a718c6af

Контрольний список міграції

Для чистого переходу на v4.7.0 типова робота включає:

  1. Змінити завантаження вбудованих моделей з рядка-назви на шлях /rom/<name>.tflite та надати мітки через супутній файл <name>.txt (зміна ml.Model).

  2. Оновити haarcascade_frontalface_default.xml на haarcascade_frontalface.xml та перехопити RuntimeError (а не OSError) при помилці завантаження каскаду (зміна каскадів Хаара).

  3. Видалити код, що покладався на tof.reset() для повторної ініціалізації датчика (зміна tof).

  4. Перенастроїти всі жорстко задані значення частоти кадрів / витримки GenX320 до одиниць 1 МГц та не вмикати транспозицію в режимі подій (зміна GenX320).