RSS блога
Подписка
Maixduino - доступное машинное зрение
- Цена: 27.90 $
- Перейти в магазин
Одним из наиболее интересных направлений в DIY электронике для меня являются платформы с поддержкой камеры. Для себя я веду список, куда заношу заинтересовавшие меня платы, на данный момент в этом списке 57 позиций, конечно, не все из них я планирую приобретать: некоторые слишком дороги, некоторые слишком сложны в использовании для неопытного пользователя. Моя коллекция не быстро, но пополняется, сейчас в ней 6 устройств:
1. OpenMV, о которой я рассказывал ранее и которая не раз будет упоминаться в данном обзоре.
2. Wiscam, о которой возможно еще расскажу.
3. ESP32-Cam, о которой рассказано много.
4. Raspberry Pi 3b + Camera, о которой рассказано очень много, а мне добавить нечего.
5. TTGO T-Camera mini – версия ESP32-Cam от компании LilyGO, о которой возможно тоже расскажу.
6. Maixduino — герой сегодняшнего обзора.
В конце 2018 года был анонсирован чип Kendryte K210. Kendryte K210 — это система на кристалле (SoC), которая объединяет: два 64-битных ядра RISC-V IMAFDC (RV64GC), каждое со встроенным независимым FPU и тактовой частотой от 400 до 600 МГц; Аппаратный ускоритель сверточных нейронных сетей (CNN) KPU; Аппаратный ускоритель аудио APU; SRAM 8 МБ.
Особенности Kendryte K210
— Kendryte K210 — двухъядерный 64-разрядный RISC-V процессор с частотой 400 МГц (разгоняемый до 800 МГц)
— Аппаратный ускоритель KPU CNN
— Аппаратный ускоритель APU с поддержкой до 8 микрофонов, частота дискретизации до 192 кГц
— FPIOA (Field Programmable IO Array), отображающий 255 функций для всех 48 GPIO на чипе.
— SRAM 8 Мбайт общего назначения, включая 5.9 МБ, используемые в качестве памяти AI SRAM
— AXI ROM для загрузки пользовательской программы из SPI-памяти
— Kendryte K210 поддерживает платформы глубокого обучения Tiny-Yolo, Mobilenet и TensorFlow Lite с идентификацией изображений QVGA с частотой 60fps или VGA — 30fps.
Типичные области применения:
Приложения Smart Home (Умный Дом), такие как роботы-уборщики, умные колонки, электронные дверные замки, домашний мониторинг;
— Приложения медицинской промышленности, такие как вспомогательная диагностика и лечение, распознавание медицинских изображений, экстренная сигнализация;
— Приложения Smart Industry, такие как промышленное оборудование, умная сортировка, мониторинг электрооборудования;
— Образовательные приложения, такие как образовательные роботы, интеллектуальные интерактивные платформы, проверка эффективности обучения;
— Сельскохозяйственные приложения, такие как сельскохозяйственный мониторинг, мониторинг вредителей и болезней, автоматизированный контроль и т. д.
Компанией Sipeed были анонсированы модули Sipeed M1 и Sipeed M1W на базе чипа kendryte k210. А в течение года появилось множество плат как от самой Sipeed так и от других компаний на основе данного чипа (в моем списке их 20). Я конечно не мог пройти мимо и активно следил за развитием платформ на его основе. Оптимальной по соотношению цены и комплектации, на мой взгляд, является платформа Maixduino, представленная компанией Seeedstudio. Maixduino представляет собой плату в форм-факторе Arduino uno, которая сочетает модуль Sipeed M1 и ESP32-WROOM-32. На плате также установлен mems микрофон и аудио усилитель. В комплекте идет камера OV2640 и дисплей с разрешением 320*240. Прошивка и питание платы осуществляется через разъем USB-C. За общение с ПК отвечает микросхема CH552, которая представляет собой двухканальный USB-UART конвертер. Таким образом мы можем отдельно получить доступ как к SIPEED, так и к ESP32.
Maixduino
Характеристики Maixduino
Структурная схема Maixduino нанесена на обратную сторону самой платы.
Плата поставляется в пластиковом боксе с фирменной маркировкой Sipeed.
В комплекте сама плата, камера и дисплей
При подаче питания на плуту, если она в порядке, на дисплее появится приветственное сообщение на красном фоне.
Потребление при подключенном дисплее составляет порядка 220 мА.
При подключении к ПК, автоматически устанавливаются драйвера для CH552 — в системе появляются два виртуальных com-порта.
Работать с платой можно, используя предоставляемый производителем SDK, но этот путь для более опытных пользователей. Для менее опытных более удобным вариантом будет использование привычной Arduino IDE или Platformio. Но наиболее удобным вариантом будет использование специализированной IDE — MaixPy и языка MicroPython. MaixPy представляет собой адаптированную OpenMV IDE. Скачать MaixPy можно по ссылке.
MaixPy, имеет текстовый редактор, средство просмотра кадрового буфера, позволяющее видеть то, что видит камера, последовательный терминал для отладки и отображение гистограммы для облегчения отслеживания цвета. MaixPy поддерживает русский язык и интуитивно понятна.
При первом запуске MaixPy необходимо выбрать соответствующую плату.
Для подключения к Maixduino нужно нажать кнопку в левом нижнем углу и указать правильный com-порт, в моем случае — это первый их двух. При успешном подключении дисплей станет белым.
В отличие от OpenMV IDE MaixPy не содержит встроенных примеров кроме одного. Дополнительные примеры можно найти на Github. Также можно использовать большинство примеров для OpenMV.
Для запуска текущего скрипта необходимо нажать кнопку, расположенную ниже кнопки подключения.
Пример helloworld.py просто выводит изображение с камеры на дисплей и частоту кадров (FPS) в терминал. При активном буфере кадра в MaixPy FPS составляет около 14, буфер кадра можно заблокировать FPS при этом немного увеличится до 16.
Доступны примеры, которые позволяют записывать видео и сохранять фото на MicroSD карту. Также есть возможность воспроизводить видео, аудио и фото с карты памяти.
Kendryte K210 имеет встроенный ускоритель быстрого преобразования Фурье (FFT), работу которого можно проверить запустив скрипт demo_fft_spectrum.py, расположенный в папке hardware. В скрипте необходимо изменить пины шины I2S, к которым подключен микрофон: WS на 19 и SLCK на 18.
Для более серьезных примеров, использующих возможности машинного зрения, необходимо обновление прошивки и загрузка соответствующих обученных моделей нейронной сети.
Для работы с некоторыми моделями нейронных сетей может потребоваться обновление прошивки Maixduino. Инструкция по обновлению прошивки есть на вики. Можно либо собрать прошивку из исходного кода, либо использовать готовый бинарный файл. Мы просто используем последнюю доступную версию 0.5.0_34.
В каталоге шесть файлов:
1. elf_maixpy_v0.5.0_34_ga1b47a3.7z — файл elf, используется для отладки при сбое;
2. maixpy_v0.5.0_34_ga1b47a3_m5stickv.bin — для AI-камеры M5Stack M5StickV;
3. maixpy_v0.5.0_34_ga1b47a3_minimum.bin — минимальный набор прошивок MaixPy, не поддерживаемый IDE MaixPy, не содержит алгоритмы, связанные с OpenMV;
4. maixpy_v0.5.0_34_ga1b47a3_minimum_with_ide_support.bin — минимальный набор прошивок MaixPy, c поддержкой IDE MaixPy, не содержит алгоритмы, связанные с OpenMV;
5. maixpy_v0.5.0_34_ga1b47a3.bin — полная версия прошивки MaixPy (MicroPython + API OpenMV);
6. maixpy_v0.5.0_34_ga1b47a3_with_lvgl.bin — полная версия прошивки MaixPy (MicroPython + API OpenMV + встроенная среда графического интерфейса LittlevGL);
Для прошивки необходимо загрузить kflash_gui для вашей операционной системы (Linux или Windows). На момент написания данной статьи последняя версия 1.5.5. После скачивания необходимо распаковать архив и запустить kflash_gui.exe. Изначально программа запускается на китайском языке, необходимо сменить язык, нажав на кнопку в левом верхнем углу, и перезапустить программу.
Обновление прошивки с помощью kflash_gui
Далее необходимо открыть файл прошивки с расширением *bin. Адрес прошивки по-умолчанию 0x00000. Необходимо выбрать плату и соответствующий com-port, указать бодрейт и скоростной режим прошивки. После того как все настройки указаны — нажать Download. При успешном завершении прошивки появится соответствующее сообщение. При возможных ошибках необходимо проверить соединение платы и компьютера а также правильность выбранного com-порта.
Kflash_gui можно не закрывать, она потребуется для загрузки модели нейронных сетей.
Теперь необходимо скачать предварительно обученные модели нейронных сетей. В данном каталоге три модели:
— face_model_at_0x300000.kfpkg
— mobilenet_0x300000.kfpkg
— mobilenet_7_5_224_tf.h5
«face_model_at_0x300000» — это предварительно обученная крошечная модель Yolo-v2 для обнаружения (человеческих) лиц, а две другие являются мобильными сетями. В данном примере будет запускаться демонстрация Yolo-v2.
Возвращаемся к kflash_gui:
Загрузка модели с помощью kflash_gui
Необходимо открыть файл модели «face_model_at_0x300000.kfpkg», адрес указывать при этом не нужно. Так как файл содержит саму модель и файл *json, в котором указан адрес её загрузки. Значения остальных параметров можно оставить без изменения и загрузить модель в плату нажав Download.
Теперь, наконец, можно переходить к проверке работы детектирования лиц. Для этого нужно запустить MaixPy IDE и открыть пример demo_find_face.py.
Первая часть до sensor.run(1) предназначена для настройки камеры, а часть KPU запускается тремя строками:
Первая строка загружает модель, которую мы только что прошили по адресу 0x300000. Вторая строка определяет якоря для Yolo V2. Это предопределенная ширина и высота для «приставок» Yolo. Более подробную информацию о значении якорей Yolo можно найти Github. Третья строка запускает Yolo в KPU с пятью параметрами:
— kpu_net: сетевой объект kpu
— threshold: предел вероятности
— nms_value: предел box_iou
— anchor_num: количество якорей
— anchor: параметры привязки, определенные ранее
В цикле while происходит захват изображения, запуск yolo, если лицо обнаружено, отрисовка прямоугольника вокруг лица, вывод результата на экран и повтор цикла. Можно модифицировать код и добавить выполнение определенных действий при обнаружении лица.
Пример работает со скоростью около 11 FPS, которая увеличивается при блокировании буфера кадра.
Детектирование работает отлично, лицо уверенно обнаруживается при разных положениях головы. Уже, имея подобную функциональность, можно придумать множество вариантов использования Maixduino, но более интересным, конечно, является не просто детектирование а распознавание лиц.
Sipeed запустили онлайн-сервис, с помощью которого можно создать собственную модель и поделиться ей, а также можно скачать модели созданные другими пользователями. Чтобы избежать коммерческого использования моделей, при скачивании необходимо использовать код, сгенерированный непосредственно платой на базе модуля Sipeed. С помощью данного кода скачанная модель привязывается к конкретной платформе, а в скрипте производится проверка соответствия кода.
Сначала необходимо скачать прошивку key_gen и разархивировать её, чтобы извлечь файл key_gen_v1.2.bin.
Используя kflash_gui необходимо загрузить данную прошивку в плату maixduino.
После этого нужно подключиться к maixduino с помощью любой терминальной программы. Во второй строке сообщения от maixduino будет содержаться требуемый код. Если никакого сообщения нет, нужно, не отключаясь от последовательного порта, нажать кнопку reset на плате, чтобы её перезапустить.
Нужно скопировать данный код для дальнейшего использования.
Теперь необходимо зарегистрироваться на maixhub.com и войти на сайт. После этого можно скачать необходимую модель. При скачивании указывается полученный ранее код.
Скачанная модель загружается в плату с помощью kflash_gui.
Примечание: на самом деле файл *kfpkg представляет собой архив, в котором собраны три модели: FD, FE, KP, а также файл прошивки и файл с расширением *json, в котором указаны параметры загрузки всех файлов в память. В настоящее время не поддерживается использование модели распознавания лиц в полной версии прошивки Maixpy, поэтому необходимая прошивка включена в архив. Посмотреть содержимое файла с расширением *kfpkg можно просто поменяв его на *zip и разархивировав. Со временем, содержащаяся в архиве прошивка может устареть и тогда обновив её можно будет заново упаковать всё в файл *kfpkg.
Всё готово для распознавания лиц. Запускаем MaixPy, подключаемся к Maixduino и открываем скрипт demo_face_recognition.py.
Для запоминания лица при его обнаружении нужно нажать кнопку boot на плате. Модель позволяет запоминать 10 лиц. Если коротко, скрипт выполняет следующее:
загружает модели нейросети в оперативную память устройства.
В задаче распознавания лиц используются три модели: — первая (FD) для нахождения лиц, вторая (FE) для нахождения face landmarks (нос, губы, глаза и тд). Затем зная местонахождение face landmarks выравниваем лицо в стандартную позицию и затем при помощи третьей модели (KP) высчитываются так называемые face feature vectors, цифровые репрезентации уникальных черт лица человека. На финальном этапе высчитывается расстояние между двумя векторами и если расстояние достаточно мало, это одно и то же лицо. Нейросеть только высчитывает векторы из изображения, в процессе сравнения векторов нейросеть не участвует.
Работа алгоритма показана на видео. Распознавание работает не всегда корректно, вероятно, влияет освещение и другие факторы.
На maixhub.com можно скачать другие модели. На видео ниже показан пример работы модели, обученной детектировать 20 объектов. Человека детектирует уверенно, а кота и собаку иногда путает.
Немного лучше ракурс и только кот.
Мои впечатления
Maixduino однозначно заслуживает внимания, тех кто интересуется электроникой и в частности технологиями машинного зрения. Она выделяется на фоне ближайших конкурентов OpenMV и Pixy аппаратной поддержкой нейронных сетей и в целом является фаворитом по остальным параметрам.
Плата продумана и качественно изготовлена. Не совсем удачным решением можно назвать подключение дисплея: шлейф довольно легко повредить, при этом коннектор дисплея расположен не по центру края платы и разместить дисплей с обратной стороны платы между гребенками контактов тоже не получится.
Интуитивно понятная IDE и легкий старт для тех кто хоть немного знаком с MicroPython. При этом Maixduino совместима с OpenMV, которая, в свою очередь, имеет довольно развитое сообщество и хорошую документацию.
Главным минусом можно назвать документацию: она неполная и плохо структурированная. Примеров мало и они плохо задокументированы. Часть информации на китайском или плохо переведена на английский. Я постарался в данном обзоре немного исправить ситуацию и доступно дать подробную информацию по началу работы с платой.
Примеры машинного зрения в целом работают корректно.
Наверняка могу сказать, что это не последняя моя плата на Kendryte k210.
У меня есть множество идей проектов базе Maixduino, которые, сразу оговорюсь, носят не прикладной, а скорее развлекательный и развивающий характер:
— Замок с распознаванием лица;
— Детектор домашних животных: я хочу натренировать нейронную сеть различать двух моих котов и собаку;
— Термокамера с детектором температуры людей на базе сенсора MLX90640;
— Счетчик людей, автомобилей и пр.;
— Считывание автомобильных номеров;
— Считывание показаний счетчиков и т.д.
1. OpenMV, о которой я рассказывал ранее и которая не раз будет упоминаться в данном обзоре.
2. Wiscam, о которой возможно еще расскажу.
3. ESP32-Cam, о которой рассказано много.
4. Raspberry Pi 3b + Camera, о которой рассказано очень много, а мне добавить нечего.
5. TTGO T-Camera mini – версия ESP32-Cam от компании LilyGO, о которой возможно тоже расскажу.
6. Maixduino — герой сегодняшнего обзора.
В конце 2018 года был анонсирован чип Kendryte K210. Kendryte K210 — это система на кристалле (SoC), которая объединяет: два 64-битных ядра RISC-V IMAFDC (RV64GC), каждое со встроенным независимым FPU и тактовой частотой от 400 до 600 МГц; Аппаратный ускоритель сверточных нейронных сетей (CNN) KPU; Аппаратный ускоритель аудио APU; SRAM 8 МБ.
Особенности Kendryte K210
— Kendryte K210 — двухъядерный 64-разрядный RISC-V процессор с частотой 400 МГц (разгоняемый до 800 МГц)
— Аппаратный ускоритель KPU CNN
— Аппаратный ускоритель APU с поддержкой до 8 микрофонов, частота дискретизации до 192 кГц
— FPIOA (Field Programmable IO Array), отображающий 255 функций для всех 48 GPIO на чипе.
— SRAM 8 Мбайт общего назначения, включая 5.9 МБ, используемые в качестве памяти AI SRAM
— AXI ROM для загрузки пользовательской программы из SPI-памяти
— Kendryte K210 поддерживает платформы глубокого обучения Tiny-Yolo, Mobilenet и TensorFlow Lite с идентификацией изображений QVGA с частотой 60fps или VGA — 30fps.
Типичные области применения:
Приложения Smart Home (Умный Дом), такие как роботы-уборщики, умные колонки, электронные дверные замки, домашний мониторинг;
— Приложения медицинской промышленности, такие как вспомогательная диагностика и лечение, распознавание медицинских изображений, экстренная сигнализация;
— Приложения Smart Industry, такие как промышленное оборудование, умная сортировка, мониторинг электрооборудования;
— Образовательные приложения, такие как образовательные роботы, интеллектуальные интерактивные платформы, проверка эффективности обучения;
— Сельскохозяйственные приложения, такие как сельскохозяйственный мониторинг, мониторинг вредителей и болезней, автоматизированный контроль и т. д.
Компанией Sipeed были анонсированы модули Sipeed M1 и Sipeed M1W на базе чипа kendryte k210. А в течение года появилось множество плат как от самой Sipeed так и от других компаний на основе данного чипа (в моем списке их 20). Я конечно не мог пройти мимо и активно следил за развитием платформ на его основе. Оптимальной по соотношению цены и комплектации, на мой взгляд, является платформа Maixduino, представленная компанией Seeedstudio. Maixduino представляет собой плату в форм-факторе Arduino uno, которая сочетает модуль Sipeed M1 и ESP32-WROOM-32. На плате также установлен mems микрофон и аудио усилитель. В комплекте идет камера OV2640 и дисплей с разрешением 320*240. Прошивка и питание платы осуществляется через разъем USB-C. За общение с ПК отвечает микросхема CH552, которая представляет собой двухканальный USB-UART конвертер. Таким образом мы можем отдельно получить доступ как к SIPEED, так и к ESP32.
Maixduino
Характеристики Maixduino
Параметр | Значение |
Модуль AI | Sipeed M1 / Sipeed MAIX-I AIoT |
Система на кристалле (SoC) | Kendryte K210 (CPU+KPU+APU) |
Процессор | 2 x 64-битных ядра RISC-V IMAFDC (RV64GC), каждое со встроенным независимым FPU, тактовая частота 400-600 МГц. 2 x 32Ki I-Cache (Кеш инструкций), 2 x 32Ki D-Cache (Кеш данных); Аппаратный ускоритель сверточных нейронных сетей (CNN) KPU; Аппаратный ускоритель аудио APU |
ОЗУ | 8 МБ встроенной SRAM |
Хранилище | Слот для карты Micro SD (TF); Встроенный Flash модуль на 16M |
Видео вход | 24-контактный разъем камеры DVP; Поддерживает видео захват решением до 640×480 @ 30fps; Поддерживает форматы входного изображения YUV422 и RGB565 |
Видео выход | Может выводить изображения как на KPU так и на дисплей — 24-контактный разъем для 8-битного ЖК-дисплея MCU |
Аудио вход | Встроенный всенаправленный цифровой I2S MEMS Микрофон MSM261S4030H0 |
Аудио выход | DAC+PA: ЦАП TM8211: 16-битный динамический диапазон; Низкое гармоническое искажение; NS4150: выходная мощность 3 Вт, разъем динамика с шагом 1.25 мм; КПД до 90%; |
Беспроводная связь | Модуль ESP32: Поддерживает 2.4G 802.11.b/g/n 802.11 n (2,4 ГГц), скорость до 150 Мбит/с Полный стандарт Bluetooth v4.2, включая традиционный Bluetooth (BR/EDR) и Bluetooth Low Energy (BLE) |
USB | 1 x USB 2.0 устройство тип C для питания и программирования как K210, так и ESP32 через двухканальный чип CH522 |
Периферия | Arduino UNO-совместимые разъемы с цифровыми входами/выходами/ШИМ, I2C, UART, 6-кратными аналоговыми входами и сигналами питания |
Питание | USB Type-C; 6 — 12 В, >600 мА через разъем питания; 4.8 — 5.2 В через Vin |
Кнопки | сброса (reset) и загрузки (boot) |
Индикаторы (LED) | Питания (Power), TX-K210, RX-K210, TX-ESP32 и RX-ESP32 |
Форм-фактор | Arduino Uno |
Температурный диапазон | от -30 °C до 85 ° |
Структурная схема Maixduino нанесена на обратную сторону самой платы.
Плата поставляется в пластиковом боксе с фирменной маркировкой Sipeed.
В комплекте сама плата, камера и дисплей
При подаче питания на плуту, если она в порядке, на дисплее появится приветственное сообщение на красном фоне.
Потребление при подключенном дисплее составляет порядка 220 мА.
При подключении к ПК, автоматически устанавливаются драйвера для CH552 — в системе появляются два виртуальных com-порта.
Работать с платой можно, используя предоставляемый производителем SDK, но этот путь для более опытных пользователей. Для менее опытных более удобным вариантом будет использование привычной Arduino IDE или Platformio. Но наиболее удобным вариантом будет использование специализированной IDE — MaixPy и языка MicroPython. MaixPy представляет собой адаптированную OpenMV IDE. Скачать MaixPy можно по ссылке.
MaixPy, имеет текстовый редактор, средство просмотра кадрового буфера, позволяющее видеть то, что видит камера, последовательный терминал для отладки и отображение гистограммы для облегчения отслеживания цвета. MaixPy поддерживает русский язык и интуитивно понятна.
При первом запуске MaixPy необходимо выбрать соответствующую плату.
Для подключения к Maixduino нужно нажать кнопку в левом нижнем углу и указать правильный com-порт, в моем случае — это первый их двух. При успешном подключении дисплей станет белым.
В отличие от OpenMV IDE MaixPy не содержит встроенных примеров кроме одного. Дополнительные примеры можно найти на Github. Также можно использовать большинство примеров для OpenMV.
Для запуска текущего скрипта необходимо нажать кнопку, расположенную ниже кнопки подключения.
Пример helloworld.py просто выводит изображение с камеры на дисплей и частоту кадров (FPS) в терминал. При активном буфере кадра в MaixPy FPS составляет около 14, буфер кадра можно заблокировать FPS при этом немного увеличится до 16.
Доступны примеры, которые позволяют записывать видео и сохранять фото на MicroSD карту. Также есть возможность воспроизводить видео, аудио и фото с карты памяти.
Kendryte K210 имеет встроенный ускоритель быстрого преобразования Фурье (FFT), работу которого можно проверить запустив скрипт demo_fft_spectrum.py, расположенный в папке hardware. В скрипте необходимо изменить пины шины I2S, к которым подключен микрофон: WS на 19 и SLCK на 18.
Для более серьезных примеров, использующих возможности машинного зрения, необходимо обновление прошивки и загрузка соответствующих обученных моделей нейронной сети.
Для работы с некоторыми моделями нейронных сетей может потребоваться обновление прошивки Maixduino. Инструкция по обновлению прошивки есть на вики. Можно либо собрать прошивку из исходного кода, либо использовать готовый бинарный файл. Мы просто используем последнюю доступную версию 0.5.0_34.
В каталоге шесть файлов:
1. elf_maixpy_v0.5.0_34_ga1b47a3.7z — файл elf, используется для отладки при сбое;
2. maixpy_v0.5.0_34_ga1b47a3_m5stickv.bin — для AI-камеры M5Stack M5StickV;
3. maixpy_v0.5.0_34_ga1b47a3_minimum.bin — минимальный набор прошивок MaixPy, не поддерживаемый IDE MaixPy, не содержит алгоритмы, связанные с OpenMV;
4. maixpy_v0.5.0_34_ga1b47a3_minimum_with_ide_support.bin — минимальный набор прошивок MaixPy, c поддержкой IDE MaixPy, не содержит алгоритмы, связанные с OpenMV;
5. maixpy_v0.5.0_34_ga1b47a3.bin — полная версия прошивки MaixPy (MicroPython + API OpenMV);
6. maixpy_v0.5.0_34_ga1b47a3_with_lvgl.bin — полная версия прошивки MaixPy (MicroPython + API OpenMV + встроенная среда графического интерфейса LittlevGL);
Для прошивки необходимо загрузить kflash_gui для вашей операционной системы (Linux или Windows). На момент написания данной статьи последняя версия 1.5.5. После скачивания необходимо распаковать архив и запустить kflash_gui.exe. Изначально программа запускается на китайском языке, необходимо сменить язык, нажав на кнопку в левом верхнем углу, и перезапустить программу.
Обновление прошивки с помощью kflash_gui
Далее необходимо открыть файл прошивки с расширением *bin. Адрес прошивки по-умолчанию 0x00000. Необходимо выбрать плату и соответствующий com-port, указать бодрейт и скоростной режим прошивки. После того как все настройки указаны — нажать Download. При успешном завершении прошивки появится соответствующее сообщение. При возможных ошибках необходимо проверить соединение платы и компьютера а также правильность выбранного com-порта.
Kflash_gui можно не закрывать, она потребуется для загрузки модели нейронных сетей.
Теперь необходимо скачать предварительно обученные модели нейронных сетей. В данном каталоге три модели:
— face_model_at_0x300000.kfpkg
— mobilenet_0x300000.kfpkg
— mobilenet_7_5_224_tf.h5
«face_model_at_0x300000» — это предварительно обученная крошечная модель Yolo-v2 для обнаружения (человеческих) лиц, а две другие являются мобильными сетями. В данном примере будет запускаться демонстрация Yolo-v2.
Возвращаемся к kflash_gui:
Загрузка модели с помощью kflash_gui
Необходимо открыть файл модели «face_model_at_0x300000.kfpkg», адрес указывать при этом не нужно. Так как файл содержит саму модель и файл *json, в котором указан адрес её загрузки. Значения остальных параметров можно оставить без изменения и загрузить модель в плату нажав Download.
Теперь, наконец, можно переходить к проверке работы детектирования лиц. Для этого нужно запустить MaixPy IDE и открыть пример demo_find_face.py.
import sensor
import image
import lcd
import KPU as kpu
lcd.init()
sensor.reset()
sensor.set_pixformat(sensor.RGB565)
sensor.set_framesize(sensor.QVGA)
sensor.run(1)
task = kpu.load(0x300000)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
while(True):
img = sensor.snapshot()
code = kpu.run_yolo2(task, img)
if code:
for i in code:
print(i)
a = img.draw_rectangle(i.rect())
a = lcd.display(img)
a = kpu.deinit(task)
Первая часть до sensor.run(1) предназначена для настройки камеры, а часть KPU запускается тремя строками:
task = kpu.load(0x300000)
anchor = (1.889, 2.5245, 2.9465, 3.94056, 3.99987, 5.3658, 5.155437, 6.92275, 6.718375, 9.01025)
a = kpu.init_yolo2(task, 0.5, 0.3, 5, anchor)
Первая строка загружает модель, которую мы только что прошили по адресу 0x300000. Вторая строка определяет якоря для Yolo V2. Это предопределенная ширина и высота для «приставок» Yolo. Более подробную информацию о значении якорей Yolo можно найти Github. Третья строка запускает Yolo в KPU с пятью параметрами:
— kpu_net: сетевой объект kpu
— threshold: предел вероятности
— nms_value: предел box_iou
— anchor_num: количество якорей
— anchor: параметры привязки, определенные ранее
В цикле while происходит захват изображения, запуск yolo, если лицо обнаружено, отрисовка прямоугольника вокруг лица, вывод результата на экран и повтор цикла. Можно модифицировать код и добавить выполнение определенных действий при обнаружении лица.
Пример работает со скоростью около 11 FPS, которая увеличивается при блокировании буфера кадра.
Детектирование работает отлично, лицо уверенно обнаруживается при разных положениях головы. Уже, имея подобную функциональность, можно придумать множество вариантов использования Maixduino, но более интересным, конечно, является не просто детектирование а распознавание лиц.
Sipeed запустили онлайн-сервис, с помощью которого можно создать собственную модель и поделиться ей, а также можно скачать модели созданные другими пользователями. Чтобы избежать коммерческого использования моделей, при скачивании необходимо использовать код, сгенерированный непосредственно платой на базе модуля Sipeed. С помощью данного кода скачанная модель привязывается к конкретной платформе, а в скрипте производится проверка соответствия кода.
Сначала необходимо скачать прошивку key_gen и разархивировать её, чтобы извлечь файл key_gen_v1.2.bin.
Используя kflash_gui необходимо загрузить данную прошивку в плату maixduino.
После этого нужно подключиться к maixduino с помощью любой терминальной программы. Во второй строке сообщения от maixduino будет содержаться требуемый код. Если никакого сообщения нет, нужно, не отключаясь от последовательного порта, нажать кнопку reset на плате, чтобы её перезапустить.
Нужно скопировать данный код для дальнейшего использования.
Теперь необходимо зарегистрироваться на maixhub.com и войти на сайт. После этого можно скачать необходимую модель. При скачивании указывается полученный ранее код.
Скачанная модель загружается в плату с помощью kflash_gui.
Примечание: на самом деле файл *kfpkg представляет собой архив, в котором собраны три модели: FD, FE, KP, а также файл прошивки и файл с расширением *json, в котором указаны параметры загрузки всех файлов в память. В настоящее время не поддерживается использование модели распознавания лиц в полной версии прошивки Maixpy, поэтому необходимая прошивка включена в архив. Посмотреть содержимое файла с расширением *kfpkg можно просто поменяв его на *zip и разархивировав. Со временем, содержащаяся в архиве прошивка может устареть и тогда обновив её можно будет заново упаковать всё в файл *kfpkg.
Всё готово для распознавания лиц. Запускаем MaixPy, подключаемся к Maixduino и открываем скрипт demo_face_recognition.py.
Для запоминания лица при его обнаружении нужно нажать кнопку boot на плате. Модель позволяет запоминать 10 лиц. Если коротко, скрипт выполняет следующее:
загружает модели нейросети в оперативную память устройства.
task_fd = kpu.load(0x200000)
task_ld = kpu.load(0x300000)
task_fe = kpu.load(0x400000)
В задаче распознавания лиц используются три модели: — первая (FD) для нахождения лиц, вторая (FE) для нахождения face landmarks (нос, губы, глаза и тд). Затем зная местонахождение face landmarks выравниваем лицо в стандартную позицию и затем при помощи третьей модели (KP) высчитываются так называемые face feature vectors, цифровые репрезентации уникальных черт лица человека. На финальном этапе высчитывается расстояние между двумя векторами и если расстояние достаточно мало, это одно и то же лицо. Нейросеть только высчитывает векторы из изображения, в процессе сравнения векторов нейросеть не участвует.
Работа алгоритма показана на видео. Распознавание работает не всегда корректно, вероятно, влияет освещение и другие факторы.
На maixhub.com можно скачать другие модели. На видео ниже показан пример работы модели, обученной детектировать 20 объектов. Человека детектирует уверенно, а кота и собаку иногда путает.
Немного лучше ракурс и только кот.
Мои впечатления
Maixduino однозначно заслуживает внимания, тех кто интересуется электроникой и в частности технологиями машинного зрения. Она выделяется на фоне ближайших конкурентов OpenMV и Pixy аппаратной поддержкой нейронных сетей и в целом является фаворитом по остальным параметрам.
Параметр/Плата | Maixduino | OpenMV M7 | Pixy | ESP32-Cam |
Процессор | Kendryte K210 | STM32F765VI | LPC4330 | ESP32 |
Количество ядер | 2 | 1 | 2 | 2 |
Архитектура | 64 | 32 | 32 | 32 |
Частота | 400 | 216 | 204 | 160 |
Поддержка нейронных сетей на уровне «железа» | есть | нет | нет | нет |
WiFi | нет | нет | нет | есть |
Память RAM | 8192Кб | 512Кб | 264Кб | 512Кб |
Память Flash | 16Мб | 2Мб | 2Мб | 16Мб |
GPIO | 48 | 10 | 6 | 36 |
Пины АЦП | 0 | 1 | 0 | 18 |
Периферия | SPI, I2C, I2S, UART | SPI, I2C, CAN | SPI, I2C, USB | SPI, I2C, I2S, UART, CAN |
Плата продумана и качественно изготовлена. Не совсем удачным решением можно назвать подключение дисплея: шлейф довольно легко повредить, при этом коннектор дисплея расположен не по центру края платы и разместить дисплей с обратной стороны платы между гребенками контактов тоже не получится.
Интуитивно понятная IDE и легкий старт для тех кто хоть немного знаком с MicroPython. При этом Maixduino совместима с OpenMV, которая, в свою очередь, имеет довольно развитое сообщество и хорошую документацию.
Главным минусом можно назвать документацию: она неполная и плохо структурированная. Примеров мало и они плохо задокументированы. Часть информации на китайском или плохо переведена на английский. Я постарался в данном обзоре немного исправить ситуацию и доступно дать подробную информацию по началу работы с платой.
Примеры машинного зрения в целом работают корректно.
Наверняка могу сказать, что это не последняя моя плата на Kendryte k210.
У меня есть множество идей проектов базе Maixduino, которые, сразу оговорюсь, носят не прикладной, а скорее развлекательный и развивающий характер:
— Замок с распознаванием лица;
— Детектор домашних животных: я хочу натренировать нейронную сеть различать двух моих котов и собаку;
— Термокамера с детектором температуры людей на базе сенсора MLX90640;
— Счетчик людей, автомобилей и пр.;
— Считывание автомобильных номеров;
— Считывание показаний счетчиков и т.д.
Самые обсуждаемые обзоры
+37 |
2327
28
|
В первую очередь это Teensy 4.0:
www.pjrc.com/store/teensy40.html
Она в США стоит крайне дешево, но вот в других местах найти по адекватной цене дорого. И у многих есть 3.6 версия этой платы, код вполне совместим, ну правда распиновка другая. Она немного греется.
Потом почему-то в статье сравнение с OpenMV M7, когда уже давно есть OpenMV H7 и скоро будет H7 plus (уже доступен, впрочем) с лучшей камерой. Да и устройства абсолютно разные. OpenMV совсем другой софт для разработки использует, в питоне пару строчек кода — против полноценного сишного кода. Также она хороша теми же модулями и своим крошечным весом, то есть мастхэв для авиамоделей.
Ну и конечно не стоит забывать, что raspberry pi 4b 2Gb стоит 40-50 баксов. И к ней не SPI мусорный оверпрайс дисплей 320 на 240 и с трудом добываемый ips + контроллер старый, а полноценный mipi->hdmi 2560 на 1440 за 25 долларов на таобао (главное без снятой для 3д принтеров длпшных или как их там задней части не купить по ошибке, а фулл подсветка и плита), ну на али кстати почти в 2 раза дороже контролер тошибовский + дисплей. Любой дюймовки, от 5.5, 6 есть, 8 есть и 10+, а также сенсорную панель. Также есть 4к диплеи, но на 4к надо 4Гб малинку брать, а она как раз на 20 баксов дороже стоит.
Да, нагрев и потребление тока выше, но достаточно 1 раз взглянуть на дисплей, как стоит навсегда попрощаться с этими огрызками 320 на 240, которые еще программировать подачу кадров уметь нужно, чтобы фпс не потерять.
На таобао H7 толкают по 400 юайней (/7 в долларах), а плюс вообще за 600. А эта платка стоит в районе 150 юаней.
Модули для крепления дисплея опенмв тоже оверпрайс жуткий, правда флир лептон плата камеры стоит недорого, но его и самому сделать легко там 3 питальника, кондеры и резисторы простейшая обвязка для SPI и i2c.
Тогда можно за исключением дронов нафиг послать openmv, если живешь не в США, где он стоит дешевле Китая.
Размеры 22x25 мм и цена порядка 15$
Выглядит как новый хит на ближайшие 3 года по характеристикам. Только бы без багов и перегрева.
Какой угол обзора у камеры? С таким разрешением боюсь рабочее расстояние будет очень небольшим. Ну для развлечения или в образовательных целях конечно это менее важно…
Или я не прав? Есть, например, код для esp32-cam делающий хоть что-то полезное, кроме детектинга лица?
А учитывая то, что невозможно эти операции по анализу и распознаванию видео делать оффлайн, то оно вообще мало кому надо становится.
Особенностью платформ на основе Kendryte k210 как раз является то, что операции по машинному зрению выполняются оффлайн.
Да, читал. Даже было на хабре про это. Но это, имхо, фуфло. Примеров кода 0,000. Ни одного. Совсем. Ни одного рабочего примера, где произошло бы распознавание цифры какого-либо счётчика, или распознавание лица, или код который мог бы отличить человека от шкафа, или кота от табуретки.
Ну к примеру, я производитель железки. Я её сделал, я заявляю суперфункционал. Я заинтересован чтоб железка продавалась? Наверное да. Как увеличить продажи? Наверное доказать всем, что она реально работает, дать людям рабочий компект и возможность выбора функционала (железка + хотябы несколько библиотек которые работают из коробки). Ну что я говорю… Есть Ардуино, взлетела, всё просто и всем понятно.
Тут производитель тупо налепил чипов на плату, пихнул это в свой магазин, и говорит — «берите, плата огонь, потом сами разберётесь что к чему. Или нет. Мне пофиг.»
Я вообще один раз только видел что плата работает. Один какой-то азиат показал это на ютубе. Всё. Ни кода, ни примеров, ни объяснений. Вот работает, посмотрели? Круто! Вааау… До свидания.
P.S. Я сейчас очень хочу оказаться не прав. Я очень хочу чтоб мне сейчас написали — «Да ты балбес, учись гуглить, вот тебе десяток готовых кодов, залил — работает! Вот сайт, вот ещё восемь сайтов. Вот стопитсот три библиотеки. А вот семьдесят шесть реальных проектов. Всё же работает!!» Но, чёт кажется, что не будет такого. Ещё очень долго не будет. А по сему не вижу смысла даже смотреть на эти железки, если ты реально не написал с нуля ни одного проекта по компьютерному зрению, сам, с нуля.
— собрать самому Tesla
А уже когда плата на стенде оказалась увидел насколько всё плачевно. Примеров кода практически нет, и это делает плату бесполезной для 99% купивших, ибо далеко не все программисты, и уж тем более не все работают в области машинного зрения. Ну да ладно, есть пример тупо камеры, решил как микро ip камеру юзать. А не тут-то было. Через 3 минуты выяснилось, что оно просто адски греется и начинает виснуть, работать длительно можно только на сверхнизком разрешении — 120х80, и, как оказалось, длительно это около 30минут. Потом опять перегревается и падает. Потом помехи. Всё изображение в помехах и полосах, которые то бывают, то отсутствуют. В итоге оно просто несколько дней проработало у меня ip фотиком, делало фотки счетчика воды. Потом отправилось в долгий ящик. Сейчас использую в одном ресурсоёмком проекте не связанным с компьютерным зрением, просто в этом модуле дофига оперативки и есть слот под sd.
NVIDIA же с полоборота предлагает отличные курсы, бесплатно — как завести PyTorch, как клепать регрессионные модельки, классификаторы: courses.nvidia.com/courses/course-v1:DLI+C-RX-02+V1/about
И что? Ну стоит. Мне от этого чего? Сегодня стоит. Год покажет, что продалось семь плат из тысячи произведённых, проект похоронят. И уже не стоит.
Ну круто. Очень круто. А они к обучению с десяток самых востребованных примеров работающих из коробки приложить не хотят? И что-то я не вижу кучи проектов, кучи обзоров. Чтоб куча самоделкиных трезвонила — вот, смотрите, делаю обзор на этот проект и плату, вот оно находит а потом распознаёт лица, А вот тут она номера автомобилей логирует. А вот код проекта…
А такого нет. И не будет ровно до тех пор, пока производитель не выложит САМ подобный код с открытым доступом для всех. Но почему они этого не делают? Не знаю. Либо это тупо не работает с технической точки зрения. Либо работает, но все разработчикам дают заработать. Потому что я видел различные проекты по определению цифр со счётчиков, по определению лиц, но в описании было типа того — " Вася. Умею писать проги по тех зрению, выполню любой ваш заказ. vasya@mail.ru".
Как и вообще с любой железкой, для которой производитель не предоставил рабочий код с реальными примерами, можно долго сидеть на форумах, долго переписываться с производителем, долго искать решения. А должно быть так, что решения искать не нужно. Решение сразу должно лежать в коробке с готовым изделием. И именно то решение, на столько максимальное, на сколько круто производитель позиционирует плату, а не на половину и не на чуть-чуть.
К сожалению, таки ваша. Весь этот машинлёрнинг ещё не совсем опустился на уровень «собери из кубиков». Если простому потребителю нынче надо распознавать лица в дверной глазок — то ему продают готовую камеру Ring, которая всё это сделает «из коробки»:
Самое простое, что сейчас есть уровня «из кубиков» — это studio.azureml.net/
Если хотите «hello, world» — то без вкуривания либо docs.opencv.org/master/d9/df8/tutorial_root.html, либо книжки по PyTorch или TensorFlow всё таки никак.
Вот сейчас, например, тыкаю палочкой только что прилетевший отличный проект github.com/devendrachaplot/Neural-SLAM#active-neural-slam — статья, моделька под PyTorch, видео, рабочие материалы — всё выложено, бери играйся.
Картинки интерьера, кстати, собраны с помощью Locobot — это такая совершенно опенсорсная платформа на NUC и Kobukibase, чертежи и все исходники софта доступны бесплатно:
Да, Вы правы. Примеры есть. Но опять полистал по лазил, ну не то всё. Я не встретил банального вселенского примера, который как «Hello world!» на ардуинах, который как любой ардуинщик метеостанцию делал, так и тут — пример распознавания цифр с автомобильного номера, или пример распознования цифр со счётчика воды, или пример распознавания (не поиска) лица. Нет их. Есть мелкие наработки. Опять же туториалы с большим входным порогом, типа установите это, вот это и вон то, а это соберите сами, и вот потом сделайте так. Ну нет ничего с низким входным порогом, что-то типа: тут качни образ для флехи, залей его на флеху. всунь её в Raspberry, ВСЁ, готово, ваш, условно хоум ассистент уже работает.
А как только дело доходит до действительно банального и нужного кода, то вот:
А что ж там за такой крутой проект? Определяет лица людей, заносит в базу, определяет национальность и примерный возраст? Может скорость транспортных средств определяет и их номера? Нет. Ничего подобного.
Определяет только тип транспортного средства и считает их количество. Всё.
Но тем не менее автор оценивает свою работу высоко. Имеет права, да и не мне судить, я ничего подобного не сделал. Но для общего понимания объясню — в камерах Bosch серии 5000 есть встроенная видеоаналитика, да, прям в камерах, это идеология Bocsh, делать аналитику именно в камере. Камера имеет акселерометр. Камера знает знает свою высоту установки и угол к горизонту (калибруем при установке) и далее камера самостоятельно определяет: тип объекта(человек, животное, транспортное средство(велосипеды, мотоциклы, легковые автомобили, автобусы, грузовики....)) цвет объекта, размер объекта(довольно точно). И может считать сразу или пересчитывать потом информацию по количеству, по цвету, по размеру, и т.д. С этими камерами я познакомился около пяти лет назад. Мне дико смотреть когда это покрывают коммерческой тайной. Также дико как пять лет назад один форум по ESP8266 прошивки продавал, типа вот с датчиком температуры бесплатно, а если ещё и влажность хочешь, то сотку доплати. Но благо для ESP сделали возможность кодить в Arduino IDE, и вся коммерция отвалилась. Надеюсь скоро подобная революция и в сфере технического зрения произойдёт. Снимется монополия с узкого круга программистов, и не только они и государство сможет вести свою аналитику. Прогресс неизбежен.
Распознавание лиц уже в операционку встроено. Камеры прекрасные, софт писать — куча примеров.
Плата телефона без аккумулятора и дисплея меньше ардуины. GPIO можно через OTG вывести.
С такими платами для таких серьезных задач лично мне не захотелось бы связываться прежде всего из-за малого сообщества и небольшой поддержки от производителя. Через год платы будут другие и к этой уже никаких обновлений софта, а программа на андроиде более универсальная и живучая.
Вот проект с попыткой переиспользовать смартфонное железо janos.io/
Поддерживается чуть более, чем ничем.