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 существенно изменился, а каскады Хаара по умолчанию отключены на большинстве плат — см. обратно несовместимые изменения.
Новые возможности¶
Пакет
ml—ml.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, а не через старый встроенный путь масштабирования изображения.
Аргумент 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 без ошибочного усиления — модели, полагающиеся на старое (некорректное) масштабирование, дадут другие результаты.
Сопроцессор CM4 заменён на Open-AMP (tooling)¶
Устаревший механизм прошивки сопроцессора CM4 на GIGA / Nicla Vision / Portenta H7 был удалён и заменён на Open-AMP/RPMsg. Двухъядерный код должен перейти на модель Open-AMP (предоставляется пример vuart).
Контрольный список миграции¶
Для чистого переноса на v4.5.6 типичная работа такова:
Перенесите ML-код на
ml: создайтеml.Model(path), вызовитеpredict(), читайтеmodel.labels, ожидайте выходы типаndarrayи перенесите нормализацию вml.preprocessing.Normalization, а NMS вml.utils(изменение пакета ml).Замените
image.unpack()наimage.to_ndarray()(удаление unpack).Обновите любой аргумент
scaleвImage()для необработанных массивов на диапазон(min, max)(изменение scale в Image).Если вы используете каскады Хаара на затронутой плате, пересоберите прошивку с включённой функцией (изменение каскадов Хаара).
Перепроверьте модели, зависевшие от
SCALE_S128_127(изменение масштабирования).Перенесите двухъядерный код на Open-AMP (изменение CM4).