Ну, начали
Попала мне в руки Re:Camera от Seeed. По сути, маленькая коробочка (кубик сантиметра 4 ребром), опоясанная радиатором. Внутри двухъядерный MPU (updated: в системе видно только одно ядро, второе, похоже, зарезервировано под специальные операции) на основе RISC-V, древний микроконтроллер на 8051, сенсор камеры от OmniVision, диоды для подсветки, Wi-Fi, BT, ну и всякая периферия. Оперативной памяти маловато, всего 256 мегабайт, так что Greengrass поставить будет проблематично. Можно подключить Ethernet через специальный шнурок-переходник, который еле держится, но для разработки незачем, потому что камера раздает сеть по USB Type C, и работать проще через него. Кстати, включается этот переходник во что-то, подозрительно напоминающее grove plug от того же Seeed, что, вкупе с документацией, намекает на возможность подключения внешних сенсоров. Если мало памяти (а поставляется устройство в вариантах с 8 и 64 ГБ встроенной памяти), можно воткнуть MicroSD. Еще коробку можно прицепить к чему-нибудь металлическому, потому что есть магнитики на одной из сторон.
При подключении можно открыть веб-страницу (192.168.42.1 по умолчанию), которая сама по себе делать ничего, кроме как предоставить доступ к настройке Wi-Fi и обновлению, не может. Там есть еще консоль, но кто использует консоль в браузере, когда есть ssh?
Полагаю, с этим можно что-то сделать и в текущем состоянии, но в инструкции настойчиво предлагается обновиться по OTA, что я и сделал (как бы это ни было очевидно, но для этого нужно сначала настроить сеть). После 5 минут активного моргания диодами и подключения/отключения устройства к компьютеру, устройство предоставило мне доступ к уже обновленной странице и потребовало изменить пароль по умолчанию (recamera/recamera). Изменение этого пароля также меняет пароль на доступ к ssh, осторожно.
После обновления появляется доступ к Node-RED, этакой графической среде разработки, в которой потоки данных описываются графами с нодами-обработчиками. По умолчанию, такой граф уже загружен и дает доступ к простому дашборду, который позволяет посмотреть на картинку с камеры и на результаты работы модели ИИ Yolov11. Другие графы можно (в теории) взять на сайте SenseCraft AI от Seeed, но он требует регистрации, так что я забил.
Про камеру
Сенсор, установленный в коробке, откровенно устарел. Представляет он собой OmniVision OV5647, 5-мегапиксельную камеру с roller shutter. Совсем недавно я делал демку с сенсором BrightSense от StMicro, оснащенным global shutter, собирающим информацию с матрицы одномоментно, а не построчно, как в данном случае. Это сказалось на разрешении (всего 1,5 мегапикселя), но зато. быстро падающие конфеты она захватывала идеально. Обо всех прелестях rolling shutter можно почитать на википедии, но, в двух словах, если вы видели, как красиво изображают в фильмах всякие штуки, которые засасывает в черную дыру, то вот это оно. Seeed обещает, что можно подключать другие сенсоры, и что в будущем выпустит новые варианты, в том числе и с global shutter камерой, но пока имеем то, что имеем.
Почему важно иметь неискаженные объекты? Потому что модель. К которой мы сейчас и перейдем.
Про модель
Ну, не совсем. Сначала про то, на чем она крутится. В коробочке есть NPU производительностью в целый TOPS. При использовании 8-битной квантизации, разумеется, во float он не умеет. Как под этот NPU что-то оптимизировать, я еще не разбирался, так что пока что можно о производительности судить по данным, доступным во встроенном дэшборде. Модель, которая там используется, Ultralitics YOLO11 в самом маленьком ее варианте (n, то есть nano), умеет определять и выдавать bounding boxes для 80 различных классов объектов, таких как жирафы и зубные щетки, что несколько слабо ложится на большинство рабочих задач, так что модель надо тренировать на своем датасете. Зато производительность весьма неплохая, демка дает следующие данные:
- Препроцессинг: 0 мс. Вот это замечательно, видимо, камера умеет выдавать результат сразу в формате, который можно подавать модели. В демке, которую я упоминал, такое не получалось, и мне пришлось изрядно повозиться, чтобы его оптимизировать.
- Сам инференс: ~50 мс. Неплохо, вполне неплохо.
- Постпроцессинг: 20-25 мс. Тут работает алгоритм Non-Maximum Suppression, который довольно жручий, и запускается он тут на CPU, судя по нагрузке в top
Итого, это дает нам что-то около 12-13 инференсов в секунду, что для многих задач вполне терпимо. В UI, однако, визуально выглядит, будто там 4-5 кадра в секунду, что может быть вызвано неоптимальным конвейером или другими издержками. Греется при этом всем коробочка изрядно.
Что (пока что) осталось за кадром
Если мы говорим про использование этого в чем-то более серьезном, чем игры со встроенными демками, нужно понять, как:
- a) Как собирать систему. Я сомневаюсь, что Node-RED подойдет для рабочих задач, так что нужно брать напильник (buildroot, кстати), и впиливать нужный нам софт.
- б) Как оптимизировать модель и запускать инференс из своих программ.
Если будет на это время, вернусь к этому в будущих выпусках. Ну а пока, до связи.