v5.0.1#

v5.0.1 — це реліз обслуговування поверх v5.0.0: застарілий модуль sensor стає шаром сумісності на Python поверх csi, зображення, завантажені в кадровий буфер, тепер показуються в попередньому перегляді як кадри камери, кодувальники JPEG позбулися обмеження виводу в 1 МБ і коректно обробляють переповнення, а також є партія виправлень для камери, протоколу, мережі та бібліотеки МН. Він не вносить несумісних змін API для скриптів, написаних під csi; кілька змін поведінки перелічено в розділі несумісні зміни API.

Основні можливості#

  • Модуль sensor тепер є замороженим Python-модулем, побудованим на csi. Під час імпорту він виводить попередження про застарілість; кілька функцій, які модуль csi не може підтримувати, тепер викликають OSError. Дивіться зміни модуля sensor.

  • Завантажені зображення показуються в попередньому перегляді як кадри камери. Зображення, розміщене в кадровому буфері з copy_to_fb=True (image.Image, image.ImageIO.read(), fir.snapshot(), tof.snapshot()), передається в IDE — разом з усім, що на ньому намальовано, — коли наступне зображення перезаписує кадровий буфер, а не негайно. Дивіться зміни попереднього перегляду.

  • Перероблення кодувальника JPEG. Обмеження вихідного буфера в 1 МБ зникло (розмір буфера визначається з вільної пам’яті), переповнення як на програмному, так і на апаратному шляху обробляється замість запису обрізаних файлів, а збереження стисненого зображення під іншим стисненим розширенням викликає виняток замість запису сміття.

  • Нова функція protocol.poll() та шість нових віджетів CBOR (text, lineedit, pushbutton, spinbox, radio, waveform) для protocol.CBORChannel.

  • Постпроцесор YOLO Pro, підтримка FLIR Lepton 3.1R / UW, пакетні читання IMU, CAN на OpenMV N6 та ціль симулятора з підтримкою мережі.

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

  • YoloPro — новий постпроцесор для моделей виявлення об’єктів Edge Impulse YOLO Pro, а також приклад yolo_pro_detector.py. (f3f150ebd, ea7bbb398)

  • protocol.poll() — виконує одну ітерацію задачі протоколу на вимогу для власних транспортів, які не керуються перериванням USB або таймером poll_ms. protocol.init() також можна викликати повторно, щоб повторно ініціалізувати стек. (c00c215f9, f849ffb1b)

  • Більше віджетів каналу CBOR — protocol.CBORChannel.add() отримує text (статичний рядок), lineedit (рядок із можливістю запису), pushbutton (миттєва дія), spinbox (покрокове числове введення), radio (група варіантів) та waveform (1D часовий ряд з аргументами sample_rate, series і typecode; для потокової передачі присвоюйте байти чергованих вибірок). (8016d29ba)

  • csi.CUSTOM — csi.CSI.framesize() тепер повертає придатну для використання константу після встановлення користувацької роздільної здатності (w, h) замість анонімного цілого числа. (af8841654)

  • Пакетне читання IMU — imu.__read_reg() приймає необов’язковий буфер із можливістю запису та заповнює його з послідовних регістрів за одну транзакцію. (244ca480a)

  • FLIR Lepton 3.1R і Lepton UW розпізнаються драйвером Lepton, включно з їхніми радіометричними режимами підсилення. (0fc356632)

  • Мережа в симуляторі — ціль QEMU MPS2_AN500 тепер має lwIP і NIC у режимі користувача, із замороженими requests, mqtt та sensor, а також модульний тест мережі. (23546dfb1, 61d187305, 15096c3a2)

  • Приклад OpenAI-сумісного API — openai_compatible.py робить знімок JPEG і надсилає його на кінцеву точку chat-completions для опису сцени. (79033c6aa)

  • Приклади SX126x LoRa — драйвер lora-sx126x з micropython-lib (разом із lora-sync / lora-async) заморожено в мікропрограму OpenMV RT1062, з прикладами відправника/приймача/пінг-понгу/потокової передачі зображень для підключення модуля SX1261 або SX1262 до шини SPI. Це підтримка, надана спільнотою; OpenMV не продає обладнання LoRa. (19576e1b1)

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

  • Переписана бібліотека requests — відповіді з фрагментованою передачею декодуються, доступний аргумент timeout (стандартно 5 с), тіла JSON і рядкові тіла коректно серіалізуються/кодуються, заголовки розбираються без урахування регістру, а рядок статусу — за позицією, словник headers викликача копіюється (тому auth більше не потрапляє в наступні запити), а тіло зчитується блоками в bytearray. (889f0b096)

  • mqtt імпортує ssl ліниво, тому модуль і звичайні (не TLS) з’єднання працюють на збірках без підтримки SSL. (c2e0899e8)

  • Розмір вихідного буфера JPEG визначається з вільної пам’яті замість фіксованого обмеження в 1 МБ; кодувальники обрізають буфер до розміру закодованих даних перед записом зображення, тому захоплення з великих датчиків із високою якістю більше не завершуються невдачею. (aa1ca6776)

  • Очищення постобробки МН — генерацію обмежувальних рамок стандартизовано для постпроцесорів Darknet, Edge Impulse та Ultralytics, а вихід YOLOv8 транспонується після порогової обробки, тому він зберігається по одному рядку на виявлення, як і в інших моделях. (b5c7853f2, c45f99cad)

  • Безпечне вимкнення PAG7936 — новий прапорець зупинки датчика переводить PAG7936 у режим сну перед перемиканням RESET/PWDN, що виправляє зависання, коли датчик використовується на подовжувальному кабелі. Драйвер також вибирає набір регістрів MIPI CSI-2 або паралельного інтерфейсу за I2C-адресою датчика під час виконання, а не під час збірки. (10026530c, f6acf14ec, 5f0251c74)

  • Регулювання темпу відтворення ImageIO тепер обслуговує очікувані події під час очікування міжкадрового інтервалу замість сну в WFI. (a54790193)

  • Оновлення підмодуля MicroPython — повна підтримка мережі на порту QEMU, machine.mem_backup на STM32 через резервну SRAM/регістри BKP, апаратне керування потоком SDIO залишено вимкненим на STM32F4, а також повторне використання атрибутів MPU для некешованих ділянок. (31ada5626, ab61d27a6, 06bddf13a)

  • differential-translation.py виконує захоплення через свій об’єкт csi.CSI замість застарілого модуля sensor, а інтервали між імпортами в прикладах нормалізовано. (68c866e7f, 9ceff4513)

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

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

  • Встановлення двох користувацьких роздільних здатностей (w, h) поспіль залишало датчик із першим розміром, тоді як csi.CSI.width() / height() повідомляли про другий; швидкий шлях «без змін» тепер виключає користувацькі розміри. (cfbb70156)

  • csi.CSI.lens_correction() розбирав radi і coef як логічні значення, тому до драйвера передавалися не ті значення, що були задані. (ab44b3a77)

  • PAG7936: встановлення експозиції та підсилення одне за одним перезаписували одне одного (обидва використовують один ручний режим, а регістри зворотного читання відстають на кадр); драйвер тепер заповнює ручні регістри лише під час входу в ручний режим і записує лише той параметр, який встановлюється. (e7a18c0a0)

  • Захоплення BAYER з PAG7936 і PS5520 на OpenMV N6 завершувалося помилкою «Failed to initialize the CSI interface» за будь-якого розміру, крім повної роздільної здатності, оскільки ISP N6 не може масштабувати необроблені дані Bayer. Тепер для BAYER датчики працюють у нативному режимі, що відповідає запитаному розміру (PS5520: VGA, HD, SXGA-M, FHD, QHD, WQXGA2; QVGA не має нативного режиму і не підтримується). (fe6790055, b7622b245)

Кодування та збереження зображень:

  • Програмний кодувальник JPEG: переповнення вихідного буфера завжди було фатальним, оскільки шлях realloc був вимкнений; тепер він збільшує буфер (щоразу на половину його розміру), коли володіє ним, коректно відступає, коли закінчується пам’ять, і обрізає результат. jpeg_write / mjpeg_write більше не записують буфер після невдалого кодування. (28e1110be)

  • Апаратні кодувальники JPEG (STM32): при переповненні поверталося частково закодоване зображення з розміром виділеної пам’яті, що давало обрізані файли без маркера EOI (наприклад, знімок 5 МП із якістю 100 і порожньою нижньою половиною). Тепер вони повідомляють про переповнення, звільняють буфер у разі невдачі та обрізають його в разі успіху. (22ce9619c)

  • Кодувальник VC8000 мовчки видавав колірність 4:2:0 для кожного запиту; субдискретизація, відмінна від 4:2:0, тепер використовує апаратний кодек, який її підтримує. (71f2be7f2)

  • image.Image.save() зображення PNG як .jpg записував до 1 МБ неініціалізованої купи, а зображення JPEG як .png — порожній файл. Обидва випадки тепер викликають виняток; зображення, яке вже перебуває в цільовому форматі, як і раніше, копіюється як є. (6c1fdf822)

  • png_write тепер перевіряє значення, що повертає компресор, і стискає дані перед створенням файлу, тому невдача більше не залишає порожнього файлу. (557f52d66)

Модуль image:

  • image.Image.get_pixel() з rgbtuple=True на зображеннях BAYER і YUV записував перетворений піксель за межі локальної змінної стека зі зміщенням, керованим викликачем. (13f2a17b6)

  • З gif.Gif.add_frame() видалено недосяжну гілку перетворення Bayer/YUV; приймаються лише зображення GRAYSCALE і RGB565, як уже вимагав Python API. (f20d99d96)

Протокол:

  • Реєстрація динамічного каналу, коли всі слоти вже зайняті, спричиняла запис за межами масиву; тепер ідентифікатор каналу перевіряється першим, а зарезервовані ідентифікатори каналів статично перевіряються на відповідність таблиці каналів. (68f635d1f)

  • Об’єкти динамічних каналів переживали м’яке перезавантаження в кореневих вказівниках, тому GC продовжував сканувати застарілі блоки купи з попереднього запуску; тепер таблиця очищується під час ініціалізації. (ef0ebb03b, e23641145)

Порти:

  • i.MX RT: додано відсутню деініціалізацію CAN та Encoder під час м’якого перезавантаження. (7cb9d3dc2)

Підтримка обладнання та плат#

  • OpenMV N6 — тепер увімкнено CAN (machine.CAN). (294f0febd, 91e1c9573)

  • OpenMV AE3 — SPI-драйвер sdcard заморожено для роз’єму microSD на AE3 Battery Shield. (a258f4814)

  • OpenMV RT1062 — заморожено lora-sx126x / lora-sync / lora-async (див. «Нові можливості»).

  • FLIR Lepton 3.1R / UW — розпізнаються драйвером Lepton на всіх платах із підтримкою Lepton.

  • PAG7936 — зупинка для безпечного вимкнення, вибір інтерфейсу під час виконання, виправлення експозиції/підсилення та захоплення BAYER на N6.

  • PS5520 — захоплення BAYER на N6 у нативних розмірах.

  • Симулятор (MPS2_AN500) — мережа.

  • Усі плати — модуль сумісності sensor заморожено в маніфест кожної плати.

Несумісні зміни API#

v5.0.1 не вносить несумісних змін до API csi або image. Скрипти, які працювали на v5.0.0, працюють без змін, з наведеними нижче змінами поведінки.

Модуль sensor (behavior)#

Нативний модуль sensor (modules/py_csi.c) видалено та замінено замороженим Python-модулем, який реалізує той самий API поверх csi. Дивіться sensor.

Коміт: 5e3d40631

  • import sensor виводить у термінал WARNING: The sensor module is deprecated and will be removed in a future release. Please use the csi module instead..

  • Прихований об’єкт csi.CSI створюється під час імпорту, тому за відсутності камери помилка тепер виникає під час import sensor, а не під час sensor.reset().

  • Ці функції тепер викликають OSError, оскільки csi не має еквівалента: get_fb(), alloc_extra_fb(), dealloc_extra_fb(), set_auto_rotation(), get_auto_rotation(), disable_delays(), disable_full_flush(). (Дві функції *_extra_fb викликали виняток уже у v5.0.0.) Для двох останніх використовуйте csi.CSI(delays=False) / csi.CSI(fflush=False).

  • Розміри кадру, які csi не експортує (QQCIF, QQSIF, QQQQVGA, HQQQQVGA, HQQQVGA, HQQVGA, B64X32, B64X64, B128X64, B128X128, B160X160, B320X320, LCD, QQVGA2), тепер є кортежами (w, h), які передаються як користувацькі роздільні здатності. get_framesize() повертає встановлений кортеж, поки камера все ще має цей розмір, тому перевірки на рівність з константами продовжують працювати.

  • ioctl() передає щонайбільше чотири аргументи після запиту.

  • sleep() / shutdown() у разі невдачі викликають OSError, як і раніше (RuntimeError модуля csi перетворюється).

Перейдіть на csi — дивіться таблицю міграції v5.0.0.

Завантаження зображень у кадровий буфер (behavior)#

Функції, які завантажують зображення в кадровий буфер — image.Image з copy_to_fb=True, image.Image.copy() / image.Image.scale() та перетворення to_* з copy_to_fb=True, image.ImageIO.read(), fir.snapshot() і tof.snapshot() з copy_to_fb=True — раніше негайно надсилали нове зображення на попередній перегляд IDE, тому все, що малювалося на повернутому зображенні, ніколи не було видно. Тепер вони позначають кадровий буфер як очікуваний і передають його, разом з усім, що на ньому намальовано, безпосередньо перед тим, як наступне зображення його перезапише — така сама поведінка, як у csi.CSI.snapshot().

Коміти: 87b6db5ee, 7b1a35c2f, f773c740d

Цикли, що читають потік зображень, не потребують змін і тепер показують намальоване. Скрипт, який завантажує одне зображення і зупиняється, має явно передати його:

img = image.Image("example.bmp", copy_to_fb=True)
img.flush()          # new: send it to the IDE preview now
time.sleep_ms(1000)

Бібліотека МН (behavior)#

Впливає лише на код, який успадковує або копіює постпроцесори з комплекту. YoloV8 тепер транспонує вихід моделі після порогової обробки, тому виявлення, що пройшли поріг, зберігаються по одному рядку на рамку (bb[:, 4:]), як у постпроцесорах Darknet та Edge Impulse, а не по одному стовпцю на рамку (bb[4:, :]). Публічні результати ((x, y, w, h), score) не змінилися.

Коміти: c45f99cad, b5c7853f2

Модуль protocol (minor)#

protocol.poll() повернуто. v5.0.0 видалив його, коли задача протоколу перейшла на таймер; він повертається як явний спосіб керувати задачею для власних транспортів. Більше нічого не змінилося — скрипти, які ніколи його не викликали, не зачеплені.

Коміт: c00c215f9

Збірка / інструментарій (tooling)#

Ніщо з цього не впливає на скрипти MicroPython. py_image.c розділено: об’єкти дескрипторів (cascade, keypoints, LBP, keypoint match) перенесено до py_image_descriptor.c, а об’єкти статистики (similarity, statistics, percentile, threshold, histogram) — до py_image_stats.c. API кодувальників imlib узгоджено з рештою imlib: jpeg_compress / png_compress повертають 0 у разі успіху та -1 у разі помилки, а jpeg_compress втратив аргумент realloc (зміна розміру залежить від володіння буфером). OMV_PROTOCOL_MAX_CHANNELS перейменовано на OMV_PROTOCOL_CHANNEL_MAX в omv_protocol_channel.h, а порти тепер викликають py_protocol_init0() під час ініціалізації. Визначення плати OMV_PAG7936_MIPI_CSI2 вилучено (інтерфейс вибирається під час виконання). Доповнюють це оновлення залежностей CI та виправлення порожнього списку змін релізу. Подробиці, що стосуються форків, дивіться в історії репозиторію мікропрограми.

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

  • Досі використовуєте import sensor? Це працює, з попередженням. Перейдіть на csi (міграція v5.0.0); замініть disable_delays / disable_full_flush аргументами конструктора csi.CSI() і приберіть виклики get_fb / автоповороту.

  • Завантажуєте одне зображення з copy_to_fb=True і очікуєте його побачити? Додайте img.flush() після завантаження.

  • Скопіювали постпроцесор YOLOv8? Індексуйте вихід після порогової обробки за рядками (bb[:, 4:]), а не за стовпцями.

  • Порівнюєте csi0.framesize() після встановлення кортежу? Тепер він повертає csi.CUSTOM.

  • Усе інше: перепрошийте та запускайте.