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) не змінилися.
Модуль 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.Усе інше: перепрошийте та запускайте.