v4.5.6

v4.5.6 — это крупный релиз, посвящённый машинному обучению. C-модуль TensorFlow tf был заменён новым, независимым от движка пакетом ml на основе TensorFlow Lite Micro (TFLM), преобразование изображения в тензор перенесено в image.to_ndarray(), а двухъядерные платы переведены на Open-AMP. Есть несколько обратно несовместимых изменений — прочитайте их ниже перед обновлением ML-скриптов.

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

  • Новый пакет ml — старый модуль tf был переписан в независимый от движка пакет ml (ml.Model, ml.preprocessing, ml.utils, ml.apps); tf остаётся в качестве псевдонима.

  • Бэкенд TFLM — устаревший libtf был заменён на основанный на upstream TensorFlow Lite Micro: вывод примерно на 20% быстрее и библиотеки меньше.

  • Двухъядерность Open-AMP — GIGA и Portenta H7 теперь используют Open-AMP/RPMsg для межъядерного взаимодействия M7/M4 (старый механизм CM4 удалён).

  • Встроенный Bluetooth — прошивка Bluetooth CYW43 включена на Nicla Vision, Portenta H7 и GIGA.

  • MicroPython 1.23.0, ulab 6.5.2 (с поддержкой 4-мерных ndarray).

  • Обратная несовместимость: ML API существенно изменился, а каскады Хаара по умолчанию отключены на большинстве плат — см. обратно несовместимые изменения.

Новые возможности

  • Пакет mlml.Model с predict() (roi, callback, список из нескольких входов), атрибуты shape/dtype/scale/zero-point для каждого тензора, ml.preprocessing.Normalization, ml.utils (NMS) и ml.apps (написанный на чистом Python детектор ключевых слов MicroSpeech с listen() и неблокирующей потоковой передачей timeout=-1, а также draw_predictions()).

  • Система встроенных моделей — модели, перечисленные в models/index.txt, условно встраиваются в зависимости от платы (FOMO на всех ML-платах, аудиомодели на платах с микрофонами).

  • image.to_ndarray(dtype, buffer=...) — преобразование изображения в ulab ndarray (при необходимости на месте).

  • Image() из необработанных массивов — новые именованные аргументы shape=, strides=, scale= создают изображения grayscale/RGB565 из необработанных списков пикселей.

  • Сглаженный draw_circle().

  • Модуль ssl встроен в прошивку на GIGA, Nicla Vision, Portenta H7, Nano RP2040 Connect, OpenMV 4/4P/PRO/PT, RT1060 и Pico.

  • Аудиоaudio.init() получил именованный аргумент samples= (число PDM-сэмплов на канал); gain_db теперь применяется к микрофонам DFSDM (например, Nicla Vision).

  • Протокол отладки — новая команда GET_STATE возвращает флаги run/text/JPEG, геометрию кадра и текст в одном пакете, сокращая число обращений к хосту.

  • Пример vuart на Open-AMP для межъядерного взаимодействия.

Прочие изменения и улучшения

  • MicroPython обновлён до 1.23.0; ulab до 6.5.2 с поддержкой 4-мерных ndarray.

  • Более быстрый вывод — ML-бэкенд сохраняет состояние/память между вызовами (примерно на 20% быстрее, поддерживает модели типа LSTM).

  • get_similarity() был переписан на бэкенде draw_image (более широкая поддержка форматов/операций).

  • morph() и семейство фильтров mean() переведены на разбор именованных аргументов; mask= теперь принимает изменяемое изображение.

  • Переработана компоновка памяти — области DMA выровнены по степени 2, переупорядочиваемые блоки GC, несколько куч; меньше ранней фрагментации кучи на платах с малым объёмом ОЗУ; RT1060 получает дополнительную кучу GC.

  • WiFi (CYW43) теперь деинициализируется при программном сбросе; дисплей SPI-TV сбрасывает из кэша только область буфера кадра для более плавных обновлений.

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

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

  • Исправлена случайная инвалидация кэша ЦП в пути буфера кадра/датчика на STM32 и i.MX RT, которая могла повреждать данные изображения.

  • Исправлены тепловые I2C-чтения MLX90640/MLX90641 на платах i.MX RT (большие передачи теперь разбиваются на блоки).

Машинное обучение:

  • Исправлены обработка load_to_fb в ml.Model, расчёт размера входного bytearray, проверки ndim для ndarray и проверка формата/формы изображения в Normalization.

Изображение / система:

  • Добавлена отсутствовавшая константа-подсказка для рисования image.BLACK_BACKGROUND и проверка корректности длины буфера изображения/тензора.

  • Исправлены корневые указатели GC для FIR и аудио, из-за которых сборщик мог освобождать используемые буферы.

  • Пример Servo Shield теперь использует SoftI2C, поэтому он работает на платах OpenMV RT.

Аппаратное обеспечение и поддержка плат

  • Arduino GIGA — поддержка датчиков HM01B0 / HM0360; двухъядерность Open-AMP.

  • Bluetooth — прошивка BT CYW43 на Nicla Vision, Portenta H7 и GIGA.

  • Portenta H7 — RPMsg M7/M4 на Open-AMP.

  • OpenMV RT1060 — дополнительные блоки кучи GC (больше памяти для Python).

Обратно несовместимые изменения API

Видимые пользователю изменения API между v4.5.5 и v4.5.6. Область: C-модули Python в modules/ и Python-библиотеки в scripts/libraries/.

Каждое изменение помечено степенью влияния:

  • major — большинству использовавших его скриптов потребуются правки.

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

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

  • tooling — затрагивает механизмы двухъядерности / плат, а не Python API.

Изменения сгруппированы по влиянию в этом порядке. Если вы просто хотите перенести свой код, перейдите к контрольному списку миграции в конце. Каждый хэш коммита ссылается на его diff на GitHub.

Модуль tf заменён пакетом ml (major)

C-модуль TensorFlow tf был переписан в независимый от движка пакет ml (tf сохранён как обратно совместимый псевдоним, но новый код должен использовать ml). Функции уровня модуля tf.load, tf.load_builtin_model и методы detect()/segment()/классификации были удалены — создайте ml.Model и вызовите predict(). ml.Model(path) теперь возвращает только модель (без кортежа (labels, model)); метки доступны через атрибут model.labels. predict() теперь возвращает ulab ndarray (а не кортежи float), поддерживает модели с несколькими входами (передайте список), а NMS перенесён в ml.utils; нормализация входа перенесена в ml.preprocessing.Normalization. Старый ml.py теперь стал ml.apps.

Коммиты: c7228cbb4, 6c212409c, 3e37f46db, 9a186f4e2, 70b89f474, 3f8491cb0, 4506682c2, 8b38f3837

image.unpack() удалён — используйте to_ndarray() (major)

Недолго просуществовавший image.unpack() был удалён; преобразуйте изображение в тензор с помощью image.to_ndarray(dtype, buffer=...) и применяйте нормализацию scale/mean/stdev через ml.preprocessing.Normalization, а не через старый встроенный путь масштабирования изображения.

Коммиты: 9848eed12, de0d46fa6

Аргумент scale в Image() для необработанных массивов (minor)

При создании Image из необработанного массива пикселей аргумент scale теперь принимает диапазон (min, max) вместо (scale, add).

Коммит: 7b79fb4c7

Каскады Хаара отключены по умолчанию на большинстве плат (behavior)

Для освобождения места во флеш-памяти обнаружение лиц на основе каскадов Хаара (find_features() / image.HaarCascade()) теперь отключено по умолчанию на Arduino GIGA, Nicla Vision, Portenta H7, OpenMV 3, OpenMV 4 / 4 Plus / PRO и OpenMV Pure Thermal. Скрипты, использующие каскады Хаара на этих платах, должны пересобрать прошивку с включённой функцией.

Коммит: 6ce27c910

Прерывание скрипта и масштабирование тензоров (behavior)

Отладчик USB теперь прерывает выполняющийся скрипт через функцию VM-abort MicroPython вместо принудительного перехода PendSV (чище, но точка прерывания отличается). Масштабирование входа SCALE_S128_127 было исправлено так, чтобы отображать 0–255 на −128–127 без ошибочного усиления — модели, полагающиеся на старое (некорректное) масштабирование, дадут другие результаты.

Коммиты: e758a0f95, a4d97c572

Сопроцессор CM4 заменён на Open-AMP (tooling)

Устаревший механизм прошивки сопроцессора CM4 на GIGA / Nicla Vision / Portenta H7 был удалён и заменён на Open-AMP/RPMsg. Двухъядерный код должен перейти на модель Open-AMP (предоставляется пример vuart).

Коммиты: 3cc57fea4, 93f2d4c41

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

Для чистого переноса на v4.5.6 типичная работа такова:

  1. Перенесите ML-код на ml: создайте ml.Model(path), вызовите predict(), читайте model.labels, ожидайте выходы типа ndarray и перенесите нормализацию в ml.preprocessing.Normalization, а NMS в ml.utils (изменение пакета ml).

  2. Замените image.unpack() на image.to_ndarray() (удаление unpack).

  3. Обновите любой аргумент scale в Image() для необработанных массивов на диапазон (min, max) (изменение scale в Image).

  4. Если вы используете каскады Хаара на затронутой плате, пересоберите прошивку с включённой функцией (изменение каскадов Хаара).

  5. Перепроверьте модели, зависевшие от SCALE_S128_127 (изменение масштабирования).

  6. Перенесите двухъядерный код на Open-AMP (изменение CM4).