v4.5.6

v4.5.6 — це великий реліз, присвячений машинному навчанню. Модуль TensorFlow tf на мові C замінено новим, незалежним від рушія пакетом 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 — мікропрограма CYW43 Bluetooth увімкнена на Nicla Vision, Portenta H7 та GIGA.

  • MicroPython 1.23.0, ulab 6.5.2 (з підтримкою 4-вимірних ndarray).

  • Несумісна зміна: API машинного навчання суттєво змінився, а каскади Хаара за замовчуванням вимкнено на більшості плат — дивіться розділ про несумісні зміни.

Нові можливості

  • Пакет ml ml.Model з predict() (roi, callback, список кількох входів), атрибути форми/dtype/масштабу/нульової точки для кожного тензора, 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=...) — перетворення зображення на ndarray ulab (за бажанням — на місці).

  • Image() з сирих масивів — нові ключові аргументи shape=, strides=, scale= дають змогу будувати зображення у відтінках сірого/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, геометрію кадру та текст в одному пакеті, зменшуючи кількість звернень до хоста.

  • Приклад Open-AMP vuart для міжядерного зв’язку.

Інші зміни та покращення

  • MicroPython оновлено до 1.23.0; ulab — до 6.5.2 з підтримкою 4-вимірних ndarray.

  • Швидший інференс — ML-бекенд зберігає стан/пам’ять між викликами (~20% швидше, підтримує LSTM-подібні моделі).

  • get_similarity() переімплементовано на бекенді draw_image (ширша підтримка форматів та операцій).

  • morph() та сімейство фільтрів mean() перейшли на розбір ключових аргументів; mask= тепер приймає змінне зображення.

  • Перероблена схема пам’яті — DMA-регіони вирівняні до степеня двійки, блоки GC можна переставляти, підтримка кількох купин; менша фрагментація купини на початку роботи для плат із малим RAM; RT1060 отримує додаткову купину GC.

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

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

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

  • Виправлено випадкову інвалідацію кешу CPU у шляху кадровий буфер/датчик на 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 — мікропрограма CYW43 BT на Nicla Vision, Portenta H7 та GIGA.

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

  • 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()/classify були вилучені — створіть ml.Model та викличте predict(). ml.Model(path) тепер повертає лише модель (без кортежу (labels, model)); мітки є атрибутом model.labels. predict() тепер повертає ulab ndarrays (не кортежі 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=...) та застосовуйте нормалізацію масштабу/середнього/стандартного відхилення через 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) (зміна Image scale).

  4. Якщо ви використовуєте каскади Хаара на ураженій платі, перезберіть мікропрограму з увімкненою функцією (зміна каскадів Хаара).

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

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