v3.0.0

v3.0.0 — это крупный выпуск перехода v2 → v3. В нём представлены OpenMV Cam M7 (STM32F7) и новый модуль нейронных сетей nn на базе CMSIS-NN (заменяющий старые жёстко зашитые методы find_number() / classify_object()), добавлена поддержка датчиков MT9V034 с глобальным затвором и FLIR Lepton, размеры кадра sensor.WVGA, а ядро обновлено до MicroPython 1.9.4. Изменилось поведение нескольких возможностей image / sensor / WiFi — см. описание несовместимых изменений ниже.

Основное

  • OpenMV Cam M7 — новая плата на STM32F7.

  • Модуль nn — вывод на CMSIS-NN: nn.load(), Net.forward(), Net.search(), с конвертером моделей и примерами.

  • Новые датчики — MT9V034 с глобальным затвором (запуск по FSIN) и FLIR Lepton.

  • Обновление ядра до MicroPython 1.9.4.

  • Несовместимое изменение: удалены жёстко зашитые image.find_number() / image.classify_object(), sensor.sleep() теперь вызывает исключение, сокеты WINC возвращают реальное число байтов, image.binary() возвращает новое изображение, а find_apriltags() ограничен 64K пикселей — см. несовместимые изменения.

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

  • nn — новый модуль нейронных сетей на CMSIS-NN: nn.load(path), Net.forward(img, roi=, softmax=, dry_run=) (возвращает числа с плавающей точкой 0.0–1.0), Net.search() для обнаружения с разным масштабом/положением и Net.test(), а также конвертер моделей CMSIS-NN (nn_convert.py / nn_quantizer.py), встроенные модели CIFAR-10 / LeNet / smile и примеры скриптов NN / NN-search.

  • Датчики — поддержка MT9V034 с глобальным затвором (снимок по запуску FSIN) на OpenMV 4, обновлённый драйвер FLIR Lepton со снимком Lepton, а также новые размеры кадра sensor.WVGA (720x480) / sensor.WVGA2 (752x480).

  • Обработка изображенийimage.find_circles() получил ключевые аргументы r_min / r_max / r_step (более быстрое преобразование Хафа), find_keypoints() и Haar-метод find_features() теперь принимают RGB-изображения, а image.compress() / кодирование JPEG теперь поддерживает бинарные (растровые) изображения.

  • Загрузкаboot.py теперь выполняется до инициализации USB, поэтому может переопределять режим USB (например, HID).

  • Примеры — добавлены примеры AprilTag с малым/высоким разрешением, пример I2C LIDAR-Lite V3, а также инструменты для работы с наборами данных (augment_images.py / make_patches.py).

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

  • Встроенный MicroPython обновлён до 1.9.4 (с откатом разбора/компиляции/исполнения pyexec и исправлением PendSV); более понятные сообщения об ошибках нехватки памяти fb_alloc / xalloc; подавлен шум printf модуля nn при загрузке сети; реорганизован репозиторий (примеры → scripts/, инструменты → tools/, Haar-каскады → ml/). Модуль nn недоступен на OpenMV 2 (недостаточно флеш-памяти).

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

Обработка изображений:

  • Исправлены fast_atan2f при x≤0 (ранее всегда 0 — перепроверьте углы блобов / линий / ключевых точек), управление памятью в find_apriltags() (потеря содержимого и неверный realloc при нехватке памяти), указатели строк по битам на пиксель для бинарных/растровых изображений (повреждённые бинарные результаты), find_edges(EDGE_CANNY) с ROI, макрос TO_GS_PIXEL (интеграл / морфология), потоковая передача растра/JPEG для кадров в оттенках серого (bpp==0), pop_front для списков ключевых точек/блобов и результаты match_descriptor.

Система и камера:

  • Исправлены номера интерфейса/конечной точки USB HID, динамическое изменение частоты XCLK во время работы, возврат правильного числа выходов из Net.forward() и аппаратный сбой при прерывании разбора скрипта.

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

  • OpenMV Cam M7 (STM32F7) — новая плата.

  • Датчик с глобальным затвором MT9V034 (OpenMV 4, запуск по FSIN).

  • FLIR Lepton — обновлённый драйвер с поддержкой снимка.

Несовместимые изменения API

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

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

  • major — затрагивает большинство скриптов, использовавших возможность; потребуется адаптация кода.

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

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

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

image.find_number() / image.classify_object() удалены (major)

Жёстко зашитые методы image.find_number() (LeNet) и image.classify_object() (CMSIS CNN) были удалены в пользу нового модуля nn. Замените их на net = nn.load('/model.network'); out = net.forward(img).

Коммиты: d151f7e38

sensor.sleep() / sensor.reset() вызывают исключение при сбое (minor)

sensor.sleep() и sensor.reset() теперь при сбое вызывают исключение вместо возврата True / False. Код, проверявший логический результат sensor.sleep(), должен вместо этого обернуть вызов в try / except.

Коммиты: 7d16d008f

Сокеты WINC возвращают реальное число байтов (behavior)

Методы сокетов WINC1500 send / recv / sendto / recvfrom ранее всегда возвращали 0; теперь они возвращают фактическое число переданных байтов. Код, предполагавший возврат 0 (или зацикливавшийся/блокировавшийся на нём), должен учитывать реальные значения.

Коммиты: a07fb2f60

image.binary() возвращает новое изображение (behavior)

image.binary() получил ключевые аргументы to_bitmap / copy и теперь возвращает новый объект изображения вместо возврата/изменения исходного изображения на месте. Код, полагавшийся на изменение оригинального изображения функцией binary(), должен использовать возвращаемый объект (и передавать copy=True для поведения без изменения на месте).

Коммиты: 8a44f0cd9

find_apriltags() ограничен 64K пикселей (behavior)

image.find_apriltags() теперь вызывает исключение, если изображение (или ROI) превышает 64K пикселей, и возвращает пустой список для изображений меньше 4x4. Уменьшайте большие изображения (используйте меньший framesize или передавайте явный roi) перед вызовом find_apriltags().

Коммиты: bd77afbc0

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

Для чистого переноса на v3.0.0 обычно требуется следующее:

  1. Замените image.find_number() / image.classify_object() модулем nn (миграция на nn).

  2. Оберните sensor.sleep() / sensor.reset() в try / except вместо проверки логического результата (изменение sensor.sleep).

  3. Обрабатывайте реальное число байтов от сокетов WINC send / recv (изменение сокетов WINC).

  4. Используйте изображение, возвращаемое image.binary(), вместо ожидания изменения на месте (изменение binary).

  5. Уменьшайте изображения перед find_apriltags(), чтобы оставаться в пределах 64K пикселей (ограничение find_apriltags).

Все остальные скрипты работают без изменений.