v4.8.0

v4.8.0 — значний реліз із новими функціями. Ключові нововведення: повністю новий клас-орієнтований модуль csi для роботи з камерою та підтримкою кількох камер одночасно, плата OpenMV N6 (STM32N6) з Neural-ART NPU, бекенд інференсу на NPU, режим RAW-подій для event-камери GenX320, новий модуль crc, реорганізована бібліотека постобробки ML та MicroPython 1.26. Також видалено деякі застарілі API — модуль buzzer і керування FLIR Lepton у модулі fir — тому ознайомтесь із критичними змінами нижче.

Основні нововведення

  • Новий модуль csi для камери. Клас-орієнтований API csi.CSI з підтримкою кількох одночасних камер, представлений поряд із застарілим модулем sensor.

  • OpenMV N6. Плата STM32N6 з Neural-ART NPU, потрійною буферизацією, Soft-CSI та модулем ToF.

  • Інференс на NPU. Бекенд ST Neural-ART (STAI) для апаратно-прискореного інференсу моделей.

  • Режим подій GenX320. RAW-вивід подій і draw_event_histogram() для відображення даних event-камери.

  • Реорганізована постобробка ML — постачальницькі підпакети (ml.postprocessing.ultralytics, mediapipe, edgeimpulse, darknet) із новими детекторами BlazeFace / BlazePalm, а також ключових точок долоні й обличчя.

  • Новий модуль crc апаратно-прискорений CRC-16 / CRC-32.

  • MicroPython оновлено до версії 1.26.0.

  • Критична зміна: модуль buzzer і керування Lepton через модуль fir видалено (Lepton тепер є звичайною камерою). Дивіться зміну fir/Lepton і видалення buzzer.

Нові функції

  • Новий модуль csi для камери — клас-орієнтований об’єкт csi.CSI із підтримкою кількох одночасних камер (до трьох на N6), неблокуючим знімком, довільними розмірами кадрів (w, h) і зручним виведенням через print() / repr. Він представлений поряд із застарілим модулем sensor і не є його повним замінником.

  • crccrc.crc16() і crc.crc32(), апаратно-прискорені з програмним резервним варіантом, на платах OpenMV N6 та AE3.

  • image.Image.draw_image() отримав ключове слово transform= (двовимірна матриця ndarray з числами з рухомою крапкою для афінних/перспективних перетворень із апаратним прискоренням на STM32 та Alif); те саме перетворення доступне при конвертації зображень.

  • draw_event_histogram() — відображення гістограм event-камери.

  • Режим RAW-подій GenX320csi.IOCTL_GENX320_SET_MODE із csi.GENX320_MODE_HISTO / csi.GENX320_MODE_EVENT, csi.IOCTL_GENX320_READ_EVENTS, csi.IOCTL_GENX320_CALIBRATE, константи типів подій і нові приклади скриптів.

  • ML — бекенд NPU ST Neural-ART (STAI); ml.Model отримав ключове слово postprocess= (постпроцесор тепер автоматично запускається всередині predict() навіть без зворотного виклику); ml.postprocessing реорганізовано у постачальницькі підпакети — ml.postprocessing.ultralytics (YoloV5, YoloV8), ml.postprocessing.darknet (YoloV2, YoloLC), ml.postprocessing.edgeimpulse (Fomo), та ml.postprocessing.mediapipe (BlazeFace, BlazePalm, HandLandmarks, FaceLandmarks) — старі назви у стилі snake_case залишаються як псевдоніми; додано ml.utils.draw_keypoints() і ml.utils.draw_skeleton(); розширено вбудовані моделі ROMFS (BlazeFace, YOLO-LC, YOLOv8n, мітки долоні/руки/обличчя).

  • audio — цифровий вхід мікрофона MDF на STM32N6.

  • Дисплей — драйвер OLED SSD1351 з прикладом; контролери SPIDisplay можуть перевизначати команди ініціалізації; конструктор SPI-дисплея отримав ключові слова hmirror / vflip.

  • Профілювальник на пристрої — лічильники циклів/подій SysTick + Armv8.1-M PMU з інструментуванням на рівні функцій, що зчитуються через лінк налагодження (pyopenmv отримав підтримку профілювання та ELF-символів).

  • Нова підтримка датчиків — PixArt PS5520; FLIR BOSON на OpenMV H7 Plus; автовизначення GenX320.

Інші зміни та вдосконалення

  • MicroPython оновлено до версії 1.26.0.

  • Запуск камери — тактовий сигнал датчика відокремлено від стану CSI, виявлення камери під час завантаження стало швидшим (спершу перевіряється найпоширеніша конфігурація), а стандартну тактову частоту OV7725 для OpenMV 3 виправлено.

  • Якість зображення — програмна гамма-корекція ISP (Alif та STM32) і корекція бракованих пікселів (STM32) увімкнені за замовчуванням; датчики PAG7936 і PS5520 отримали керування автоматичним балансом білого.

  • Продуктивністьimage.Image.to_ndarray() прискорено за допомогою Helium SIMD, а постпроцесор FOMO векторизовано з ulab.

  • Драйвер FLIR Lepton переписано для асинхронного прийому кадрів у фоновому режимі — тепер коректно працюють обертання/transpose, відображення використовує білінійне масштабування, а скидання відбувається швидше.

  • Пропускна здатність захоплення — CSI i.MX RT1062 тепер використовує повне розвантаження DMA, а STM32 N6 має апаратний GPU draw_image().

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

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

  • Виправлено режими RGB565 / GRAYSCALE / BAYER / YUV422 для датчиків STM32, PAJ6100 на OpenMV H7 / H7 Plus, OpenMV 2 QVGA RGB565 і конфігурацію mono / RGB-YUV N6 CSI; програмна тестова камера тепер скидається детерміновано.

  • Автоматичний баланс білого більше не робить зображення зеленуватим при низькій або змінній частоті кадрів (250 мс ковзне середнє замінює вибірку кожні 100 кадрів), а миготіння яскравості PS5520 виправлено.

Обробка зображень:

  • Виправлено артефакт відображення ліній; image.Image.flush() тепер очищає JPEG-буфер саме того зображення, на якому його викликано; Normalization тепер коректно застосовує mean/stdev до дійсних вхідних даних; виправлено виділення пам’яті для зображень із файлу.

Захоплення кадрів:

  • Виправлено серйозне пошкодження зображень при передачах без JPEG (переривання кадру тепер вмикається лише в режимі JPEG), підтримку JPEG-режиму 3, а також блокування через розмір рядка DMA і малий буфер на STM32; синхронізація VOSPI / Lepton стала надійнішою, зокрема на N6.

Різне:

  • omv.board_id() повертає правильний UID на RT1060; YoloV2 більше не аварійно завершується при конструюванні без явних якорів.

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

  • OpenMV N6 — STM32N6 з Neural-ART NPU, потрійною буферизацією, SPI LCD/TV-виходом, Soft-CSI, модулем tof і вбудованими моделями ROMFS.

  • Arduino GIGA — виведення зображення на дисплей MIPI DSI.

  • Нові датчики — PixArt PS5520; FLIR BOSON на OpenMV H7 Plus; автовизначення GenX320.

  • OpenMV Pure Thermal — FLIR Lepton тепер є звичайним (вторинним) датчиком камери.

  • Alif AE3 — програмна гамма-корекція ISP, модуль crc і виправлення SPI.

Критичні зміни API

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

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

  • major (значна) — більшість скриптів, що використовували цей API, потребують редагування.

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

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

  • tooling (інструменти) — стосується лише інструментів хоста / збірки з вихідних кодів.

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

FLIR Lepton перенесено з модуля fir (major)

FLIR Lepton тепер керується як звичайний датчик камери, а не через модуль fir. Керування Lepton видалено з fir: тип FIR_LEPTON та методи radiometric(), register_vsync_cb(), register_frame_cb(), get_frame_available() і trigger_ffc() видалено. Захоплюйте зображення з Lepton як з будь-якої іншої камери (він з’являється як вторинний датчик на OpenMV Pure Thermal); приклад для Pure Thermal переписано під новий API. Датчики fir, що не є Lepton (Grid-EYE, MLX, AMG8833), не змінилися.

Коміти: bacfb7aeb, 117710566, 592a22902, 1a614202e

Модуль buzzer видалено (minor)

Модуль buzzer видалено з портів STM32 та i.MX RT. Замість нього використовуйте machine.PWM; додано приклад зумера для Pure Thermal із використанням PWM.

Коміти: ccb947924, 444120f2d

omv.disable_fb() видалено (minor)

Функцію omv.disable_fb() видалено; керування потоковою передачею кадрового буфера тепер здійснюється через API камери. Також видалено застарілі RPC-скрипти для ПК, що покладалися на неї.

Коміти: 84c3db58a, 6fe99051c

csi — новий модуль, його API ще не зафіксовано (minor)

Модуль csi представлено у v4.8.0, і його API змінювався під час релізу: csi.fb() видалено, а csi.CSI.snapshot() (image=...) тепер вимагає змінюване зображення і малює/масштабує захоплений кадр у нього, замість виконання прямого глибокого копіювання. Ранні користувачі нового модуля повинні повторно протестувати свій код; застарілий API sensor не зазнав змін.

Коміти: 0bc0385eb, 8cd7a309f

Режим потоку image.ImageIO та close() (minor)

image.ImageIO — аргумент mode тепер приймає лише рядки в нижньому регістрі 'r' / 'w' (верхній регістр відхиляється з оновленим повідомленням про помилку), а відкриття з 'w' завжди скорочує/відтворює файл замість збереження існуючого потоку. ImageIO.close() тепер є ідемпотентним (закриття вже закритого потоку більше не викидає виняток) і повертає None замість об’єкта потоку.

Коміти: 715c4cbba, 21ceec422

Повернуте значення BlazeFace / BlazePalm (minor)

Постпроцесори BlazeFace і BlazePalm (нові в цьому релізі) тепер повертають один список обмежувальних прямокутників замість повного списку на клас — виклики індексують результат безпосередньо, без [0].

Коміт: 75e16b573

Зворотний виклик постпроцесора ML отримує сирі тензори (behavior)

Зворотний виклик постобробки ml.Model predict() тепер отримує сирі (квантизовані) посилання на вихідні тензори замість попередньо конвертованих ndarrays із числами з рухомою крапкою — це запобігає вичерпанню пам’яті на великих моделях. Якщо зворотний виклик не задано, ndarray із числами з рухомою крапкою, як і раніше, повертається. Власні зворотні виклики повинні самостійно деквантизувати тензори (вбудовані постпроцесори вже це роблять).

Коміт: 84e6ee650

Тактовий сигнал камери відокремлено від стану CSI (behavior)

Тактовий сигнал датчика тепер незалежний від стану CSI. set_clock / set_frequency перелаштовує тактовий сигнал лише тоді, коли запитувана частота відрізняється більше ніж на допустиме відхилення, а get_clk_frequency приймає булевий аргумент для повернення точної (а не номінальної) частоти. Стандартна тактова частота — 24 МГц на OpenMV N6 та AE3, тому явний виклик set_clock() при завантаженні не потрібен. Скрипти, що перемикали тактовий сигнал для чутливих до часу захоплень, слід повторно перевірити.

Коміти: 2040a0a00, 09c0052df, 66ade9aea, 7e0a251bc, e6f43f3ca

Протокол USB-налагодження та цілі мікропрограми (tooling)

Це не впливає на скрипти MicroPython. Застарілі команди USBDBG (SCRIPT_SAVE, TEMPLATE_SAVE, DESCRIPTOR_SAVE, ATTR_READ, ATTR_WRITE, TX_INPUT, SET_TIME) видалено, а непідтримувані команди від старіших IDE тепер очищуються буфером замість аварійного завершення роботи плат TinyUSB при підключенні; застарілий цільовий UVC-мікропрограму STM32 видалено. Старіші інструменти хоста слід оновити; подробиці дивіться в репозиторії мікропрограми.

Коміти: 90bd11e93, 657c9a632, 35182f035

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

Для чистого переходу на v4.8.0 зазвичай потрібно виконати:

  1. Якщо ви використовували FLIR Lepton через fir, перейдіть на захоплення його як датчика камери (зміна fir/Lepton).

  2. Замініть будь-яке використання buzzer на machine.PWM (видалення buzzer).

  3. Видаліть виклики omv.disable_fb() (видалення omv.disable_fb()).

  4. Для image.ImageIO: використовуйте нижній регістр 'r'/'w' і очікуйте, що 'w' скоротить файл (зміна ImageIO).

  5. Для власних зворотних викликів постобробки ML: деквантизуйте сирі посилання на тензори самостійно або покладайтеся на стандартний шлях із числами з рухомою крапкою (зміна зворотного виклику).

  6. Повторно перевірте будь-який скрипт, що керував тактовим сигналом датчика для чутливих до часу захоплень (зміна тактового сигналу).