v4.8.0

v4.8.0 — это крупный выпуск с новыми возможностями. Главное в нём: совершенно новый модуль камеры csi на основе классов с поддержкой нескольких камер, плата OpenMV N6 (STM32N6) с NPU Neural-ART, бэкенд вывода на NPU, режим RAW-событий для событийной камеры GenX320, новый модуль crc, реорганизованная библиотека постобработки ML и MicroPython 1.26. Также удалено несколько устаревших API — модуль buzzer и управление FLIR Lepton в модуле fir, — поэтому ознакомьтесь с несовместимыми изменениями ниже.

Основные моменты

  • Новый модуль камеры csi. API csi.CSI на основе классов с поддержкой нескольких одновременно работающих камер, представленный наряду с устаревшим модулем sensor.

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

  • Вывод на NPU. Бэкенд ST Neural-ART (STAI) для аппаратно-ускоренного вывода моделей.

  • Событийный режим GenX320. Вывод RAW-событий плюс draw_event_histogram() для отрисовки данных событийной камеры.

  • Реорганизованная постобработка 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 с плавающей точкой для аффинных/перспективных преобразований, ускоренных GPU на STM32 и Alif); это же преобразование доступно при конвертации изображений.

  • draw_event_histogram() — отрисовка гистограмм событийной камеры.

  • Режим 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 теперь работает, отрисовка масштабирует изображение билинейно, а сброс стал быстрее.

  • Пропускная способность захвата — i.MX RT1062 CSI теперь использует полную разгрузку через DMA, а STM32 N6 имеет аппаратный draw_image() на GPU.

Исправления ошибок

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

  • Исправлены режимы 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 теперь применяет среднее/стандартное отклонение к входным данным с плавающей точкой; исправлено выделение памяти при создании изображения из файла.

Захват с камеры:

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

Разное:

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

Поддержка оборудования и плат

  • OpenMV N6 — STM32N6 с NPU Neural-ART, тройной буферизацией, выводом 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 — большинству использующих его скриптов потребуются правки.

  • minor — узкий API; затрагивает только использующие его скрипты.

  • behavior — тот же API, другие результаты; перепроверьте настроенные скрипты.

  • tooling — затрагивает только хост-инструменты / сборку из исходного кода.

Изменения сгруппированы по влиянию в этом порядке — сначала major, затем minor, behavior и tooling. Если вы просто хотите перенести свой код, перейдите к контрольному списку миграции в конце для сжатого списка дел. Каждый хеш коммита ведёт на его diff на 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. Не-Lepton датчики fir (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)

Функция обратного вызова постобработки predict() объекта ml.Model теперь получает ссылки на сырые (квантованные) выходные тензоры вместо предварительно сконвертированных ndarray с плавающей точкой — это позволяет избежать исчерпания памяти на больших моделях. Если функция обратного вызова не задана, по-прежнему возвращается 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 при подключении; устаревшая цель прошивки STM32 UVC была удалена. Старые хост-инструменты следует обновить; подробности см. в истории репозитория прошивки.

Коммиты: 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. Перепроверьте любой скрипт, который управлял тактированием датчика для чувствительного ко времени захвата (изменение тактирования).