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. APIcsi.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(не является его прямой заменой).crc—crc.crc16()иcrc.crc32(), аппаратно-ускоренные с программным резервным вариантом, на OpenMV N6 и AE3.image.Image.draw_image()получил ключевое словоtransform=(двумерная матрицаndarrayс плавающей точкой для аффинных/перспективных преобразований, ускоренных GPU на STM32 и Alif); это же преобразование доступно при конвертации изображений.draw_event_histogram()— отрисовка гистограмм событийной камеры.Режим RAW-событий GenX320 —
csi.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) остались без изменений.
Модуль buzzer удалён (minor)¶
Модуль buzzer был удалён из портов STM32 и i.MX RT. Управляйте зуммером с помощью machine.PWM; добавлен пример зуммера Pure Thermal с использованием PWM.
omv.disable_fb() удалён (minor)¶
Функция omv.disable_fb() была удалена; потоковая передача буфера кадра теперь управляется через API камеры. Устаревшие настольные RPC-скрипты, которые полагались на неё, также были удалены.
csi — новый, его API ещё не зафиксирован (minor)¶
Модуль csi представлен в v4.8.0, и его API менялся во время выпуска: csi.fb() был удалён, а csi.CSI.snapshot() (image=...) теперь требует изменяемого изображения и отрисовывает/масштабирует захваченный кадр в него вместо создания глубокой копии. Ранним пользователям нового модуля следует провести повторное тестирование; устаревший API sensor не затронут.
Режим потока image.ImageIO и close() (minor)¶
image.ImageIO — аргумент mode теперь принимает только строчные 'r' / 'w' (заглавные отклоняются с обновлённым сообщением об ошибке), а открытие с 'w' всегда обрезает/пересоздаёт файл вместо сохранения существующего потока. ImageIO.close() теперь идемпотентен (закрытие уже закрытого потока больше не вызывает исключение) и возвращает None вместо объекта потока.
Возвращаемое значение 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 была удалена. Старые хост-инструменты следует обновить; подробности см. в истории репозитория прошивки.
Контрольный список миграции¶
Для чистого переноса на v4.8.0 типичная работа такова:
Если вы использовали FLIR Lepton через
fir, перейдите на его захват как датчика камеры (изменение fir/Lepton).Замените любое использование
buzzerнаmachine.PWM(удаление buzzer).Удалите вызовы
omv.disable_fb()(удаление omv.disable_fb()).Для
image.ImageIO: используйте строчные'r'/'w'и учитывайте, что'w'обрезает файл (изменение ImageIO).Для пользовательских функций обратного вызова постобработки ML: деквантуйте ссылки на сырые тензоры самостоятельно или полагайтесь на путь с плавающей точкой по умолчанию (изменение функции обратного вызова).
Перепроверьте любой скрипт, который управлял тактированием датчика для чувствительного ко времени захвата (изменение тактирования).