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 МБ.

    Maixduino - доступное машинное зрение

    Особенности 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

    Параметр Значение
    Модуль 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 нанесена на обратную сторону самой платы.

    Maixduino - доступное машинное зрение

    Плата поставляется в пластиковом боксе с фирменной маркировкой Sipeed.

    Maixduino - доступное машинное зрение

    В комплекте сама плата, камера и дисплей

    Maixduino - доступное машинное зрение

    При подаче питания на плуту, если она в порядке, на дисплее появится приветственное сообщение на красном фоне.

    Maixduino - доступное машинное зрение

    Потребление при подключенном дисплее составляет порядка 220 мА.

    При подключении к ПК, автоматически устанавливаются драйвера для CH552 — в системе появляются два виртуальных com-порта.

    Работать с платой можно, используя предоставляемый производителем SDK, но этот путь для более опытных пользователей. Для менее опытных более удобным вариантом будет использование привычной Arduino IDE или Platformio. Но наиболее удобным вариантом будет использование специализированной IDE — MaixPy и языка MicroPython. MaixPy представляет собой адаптированную OpenMV IDE. Скачать MaixPy можно по ссылке.

    MaixPy, имеет текстовый редактор, средство просмотра кадрового буфера, позволяющее видеть то, что видит камера, последовательный терминал для отладки и отображение гистограммы для облегчения отслеживания цвета. MaixPy поддерживает русский язык и интуитивно понятна.

    Maixduino - доступное машинное зрение

    При первом запуске MaixPy необходимо выбрать соответствующую плату.

    Maixduino - доступное машинное зрение

    Для подключения к 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

    Maixduino - доступное машинное зрение

    Далее необходимо открыть файл прошивки с расширением *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

    Maixduino - доступное машинное зрение

    Необходимо открыть файл модели «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 с помощью любой терминальной программы. Во второй строке сообщения от maixduino будет содержаться требуемый код. Если никакого сообщения нет, нужно, не отключаясь от последовательного порта, нажать кнопку reset на плате, чтобы её перезапустить.

    Maixduino - доступное машинное зрение

    Нужно скопировать данный код для дальнейшего использования.

    Теперь необходимо зарегистрироваться на maixhub.com и войти на сайт. После этого можно скачать необходимую модель. При скачивании указывается полученный ранее код.

    Скачанная модель загружается в плату с помощью kflash_gui.

    Maixduino - доступное машинное зрение

    Примечание: на самом деле файл *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;

    — Счетчик людей, автомобилей и пр.;

    — Считывание автомобильных номеров;

    — Считывание показаний счетчиков и т.д.

Оцените статью