В прошлом году был выпущен процессор Kendryte K210 с ядром RISC-V и с ускорителями искусственного интеллекта для машинного зрения и слуха. Вскоре после этого был запущен модуль Sipeed M1 с процессором за 10 долларов.
Затем, в том же году, появились платы для разработки с модулем Sipeed M1, такие как Maixduino или Grove AI Hat. Компания Seeed Studio прислала нам последние две платы для обзора. Итак, начнем с того, что покажем полученные устройства, а затем рассмотрим, как начать работу с кодами MicroPython и Arduino. Обратите внимание, что мы будем использовать Ubuntu 18.04, но также возможна разработка с Windows.
Распаковка
Мы получили две коробки – одна с комплектом Maixduino и другая «Grove AI HAT для граничных вычислений».
Grove AI HAT для граничных вычислений
Начнем со второго. Плата представляет собой Raspberry Pi HAT с модулем Sipeed M1, 40-контактным разъемом Raspberry Pi, 6-ью разъемами Grove, а также разъемами для камеры и дисплея. Порт USB-C используется для программирования и питания в автономном режиме.
Есть также разъемы для платы, во время распаковки их не видно.
На нижней стороне нет ничего, кроме нумерации выводов ввода-вывода и места крепления камеры.
Позже мы также получили камеру для платы.
Комплект Maixduino
Вторая коробка включает в себя плату, совместимую с Maixduino Arduino, с модулем Sipeed M1 и модулем ESP32. Камера уже подключена к плате, и 2,4-дюймовый цветной дисплей (разрешение QVGA) также является частью комплекта.
На нижней стороне платы находится подписи-названия выводов разъемов, а также изображение блок-схемы платы.
Начало работы с Maixduino Kit с использованием MicroPython
Начнем с Maixduino, попробуем следовать инструкциям из Вики и других Интернета-ресурсов, поскольку иногда он бывает неполным или неточным.
Существует 4 метода разработки/SDK :
- MaixPy (MicroPython)
- Maxduino (Arduino)
- Kendryte SDK, официальный SDK Kanji, предоставляющий базовый API
- RT_Thread – поддержка RT-Thread
Мы будем использовать первый.
Но, сначала давайте подключим кабель USB тип C и посмотрим, что произойдет.
Появляется приветствие «Welcome to MaixPy», написанное на красном фоне.
Обновление прошивки
Обновим прошивку в соответствии с инструкциями вики. Мы можем либо собрать прошивку из исходного кода, либо получить бинарный файл.
Мы просто используем последнюю доступную версию.
1 2 |
wget - r -- no - parent http : / / dl .sipeed .com / MAIX / MaixPy / release / master / maixpy_v0 . 4.0_39_g083e0cc / |
В каталоге четыре файла:
- elf_maixpy_v0.4.0_39_g083e0cc.7z – файл elf, используется для отладки при сбое
- maixpy_v0.4.0_39_g083e0cc_m5stickv.bin – для AI-камеры M5Stack M5StickV
- maixpy_v0.4.0_39_g083e0cc_minimum.bin – минимальный набор прошивок MaixPy, не поддерживаемый IDE MaixPy, не содержит алгоритмы, связанные с OpenMV
- maixpy_v0.4.0_39_g083e0cc.bin – полная версия прошивки MaixPy (MicroPython + API OpenMV + встроенная среда графического интерфейса LittlevGL)
Используем их позже, но прежде чем двинуться дальше, самостоятельно добавим dialout и установим некоторые правила udev, чтобы иметь доступ к / dev / ttyUSB? как обычный пользователь:
1 |
sudo usermod -a -G dialout $(whoami) |
Создаем файл /etc/udev/rules.d/50-usbuart.rules со следующей строкой:
1 |
SUBSYSTEM=="tty", ATTRS{idVendor}=="0403", ATTRS{idProduct}=="6010", MODE="0666" |
Теперь загружаем последнюю версию программы kflash_gui для вашей операционной системы (Linux или Windows). Мы получили версию 1.5.3, распаковали ее и запустили:
1 2 3 |
tar xvf kflash_gui_v1.5.3_linux.tar.xz cd kflash_gui ./kflash_gui |
Теперь мы можем открыть файл прошивки, выбрать Sipeed Maixduino, а также последовательный порт. Для этого заглянем в журнал ядра (dmesg), чтобы узнать:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
[ 8446.580336] usb 1-2.4: new full-speed USB device number 11 using xhci_hcd [ 8448.559536] usb 1-2.4: New USB device found, idVendor=0403, idProduct=6010, bcdDevice= 5.00 [ 8448.559540] usb 1-2.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 8448.559542] usb 1-2.4: Product: Sipeed-Debug [ 8448.559545] usb 1-2.4: Manufacturer: Kongou Hikari [ 8448.559546] usb 1-2.4: SerialNumber: 414E10D04D [ 8449.173986] usbcore: registered new interface driver usbserial_generic [ 8449.174005] usbserial: USB Serial support registered for generic [ 8449.187366] usbcore: registered new interface driver ftdi_sio [ 8449.187376] usbserial: USB Serial support registered for FTDI USB Serial Device [ 8449.187447] ftdi_sio 1-2.4:1.0: FTDI USB Serial Device converter detected [ 8449.187473] usb 1-2.4: Detected FT2232C [ 8449.582711] usb 1-2.4: FTDI USB Serial Device converter now attached to ttyUSB0 [ 8449.582772] ftdi_sio 1-2.4:1.1: FTDI USB Serial Device converter detected [ 8449.582840] usb 1-2.4: Detected FT2232C [ 8450.094673] usb 1-2.4: FTDI USB Serial Device converter now attached to ttyUSB1 |
Мы мельком просмотрели и заметили только последнюю строку с ttyUSB1, где имеются некоторые ошибки …
Попытаемся проделать тоже самое с помощью утилиты командной строки Python, и те же результаты:
1 2 3 4 5 6 |
jaufranc@CNX-LAPTOP-4:~/edev/Kendryte/kflash_gui/kflash_py$ ./kflash.py -b 1500000 -p /dev/ttyUSB1 -B goE ../../dl.sipeed.com/MAIX/MaixPy/release/master/maixpy_v0.4.0_39_g083e0cc/maixpy_v0.4.0_39_g083e0cc.bin [INFO] COM Port Selected Manually: /dev/ttyUSB1 [INFO] Default baudrate is 115200 , later it may be changed to the value you set. [INFO] Trying to Enter the ISP Mode... ** Greeting fail, check serial port (Attempting to use a port that is not open) |
Мы задали вопрос компании Seeed Studio, и нам посоветовали использовать другой порт, и это сработало!
Глядя на журнал ядра выше, мы видим, что ttyUSB0 и ttyUSB1 заданы Maixduino, и оглядываясь назад, это, вероятно, объясняется тем, что мы можем получить доступ к процессорам ESP32 и Kendryte K210 через разные последовательные порты через один USB-кабель.
Однако, когда мы подключаемся к / dev / ttyUSB0 через Minicom (115200 8N1), кажется, что проблема с прошивкой:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
[MAIXPY]Pll0:freq:832000000 [MAIXPY]Pll1:freq:398666666 [MAIXPY]Pll2:freq:45066666 [MAIXPY]cpu:freq:416000000 [MAIXPY]kpu:freq:398666666 [MAIXPY]Flash:0xc8:0x17 open second core... gc heap=0x801702e0-0x801f02e0 [MaixPy] init end Traceback (most recent call last): File "_boot.py", line 17, in <module> NameError: name 'time' isn't defined MicroPython v0.4.0-39-g083e0cc-dirty on 2019-08-13; Sipeed_M1 with kendryte-k210 Type "help()" for more information. |
MaixPy версии 0.4.0, которую мы использовали, является предварительной версией прошивки, поэтому переходим на MaixPy 0.3.2, которая считается стабильной версией. На этот раз мы используем инструмент командной строки:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
sudo apt update sudo apt install python3 python3-pip sudo pip3 install pyserial sudo pip3 install pyelftools wget http://dl.sipeed.com/MAIX/MaixPy/release/master/maixpy_v0.3.2_x/maixpy_master_2019_07_19_04_42_40_9f3862f.bin ./kflash.py -b 1500000 -p /dev/ttyUSB0 -S 1 -B goE maixpy_master_2019_07_19_04_42_40_9f3862f.bin [INFO] COM Port Selected Manually: /dev/ttyUSB0 [INFO] Default baudrate is 115200 , later it may be changed to the value you set. [INFO] Trying to Enter the ISP Mode... * [INFO] Greeting Message Detected, Start Downloading ISP Downloading ISP: |=============================================| 100.0% 10kiB/s [INFO] Booting From 0x80000000 [INFO] Wait For 0.1 second for ISP to Boot [INFO] Boot to Flashmode Successfully [INFO] Selected Baudrate: 1500000 [INFO] Baudrate changed, greeting with ISP again ... [INFO] Boot to Flashmode Successfully [INFO] Selected Flash: On-Board [INFO] Initialization flash Successfully Programming BIN: |=============================================| 100.0% 52kiB/s [INFO] Rebooting... |
Давайте посмотрим вывод с последовательной консоли:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
>>> [MAIXPY]Pll0:freq:832000000 [MAIXPY]Pll1:freq:398666666 [MAIXPY]Pll2:freq:45066666 [MAIXPY]cpu:freq:416000000 [MAIXPY]kpu:freq:398666666 [MAIXPY]Flash:0xc8:0x17 open second core... gc heap=0x8016d4e0-0x801ed4e0 [MaixPy] init end __ __ _____ __ __ _____ __ __ | \/ | /\ |_ _| \ \ / / | __ \ \ \ / / | \ / | / \ | | \ V / | |__) | \ \_/ / | |\/| | / /\ \ | | > < | ___/ \ / | | | | / ____ \ _| |_ / . \ | | | | |_| |_| /_/ \_\ |_____| /_/ \_\ |_| |_| Official Site : https://www.sipeed.com Wiki : https://maixpy.sipeed.com MicroPython 9f3862f on 2019-07-19; Sipeed_M1 with kendryte-k210 Type "help()" for more information. |
Все хорошо. Давайте попробуем получить больше информации с help():
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
>>> help(); Welcome to MicroPython on the Sipeed Maix! For generic online docs please visit https://maixpy.sipeed.com Official website : http://www.sipeed.com Control commands: CTRL-A -- on a blank line, enter raw REPL mode CTRL-B -- on a blank line, enter normal REPL mode CTRL-C -- interrupt a running program CTRL-D -- on a blank line, do a soft reset of the board CTRL-E -- on a blank line, enter paste mode For further help on a specific object, type help(obj) For a list of available modules, type help('modules') >>> help('modules') KPU hashlib random uheapq Maix heapq re uio __main__ image sensor ujson _boot json socket uos _webrepl lcd struct urandom audio machine sys ure binascii math time usocket board math touchscreen ustruct builtins micropython ubinascii utime cmath modules ucollections utimeq collections nes ucryptolib uzlib errno network uctypes video fpioa_manager os uerrno zlib gc pye_mp uhashlib Plus any modules on the filesystem >>> |
Появляется список модулей, и мы можем, используя help (‘<module_name>’) получить список функций для каждого модуля. Это не самый удобный способ обучения, поэтому давайте вернемся к Wiki и проверим образец, чтобы сделать снимок и показать его на дисплее:
1 2 3 4 5 6 7 8 9 10 11 12 |
import sensor import image import lcd lcd . init ( ) sensor . reset ( ) sensor . set_pixformat ( sensor . RGB565 ) sensor . set_framesize ( sensor . QVGA ) sensor . run ( 1 ) while True : img = sensor . snapshot ( ) lcd . display ( img ) |
Фактический выход в терминале:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
>>> import sensor >>> import image >>> import lcd >>> lcd .init ( ) >>> sensor .reset ( ) init i2c2 [ MAIXPY ] : find ov2640 >>> sensor .set_pixformat ( sensor .RGB565 ) True >>> sensor .set_framesize ( sensor .QVGA ) >>> sensor .run ( 1 ) True >>> while True : . . . img = sensor .snapshot ( ) . . . lcd .display ( img ) . . . |
Мы действительно можем видеть выход камеры на прикрепленном дисплее.
По мере роста вашей программы интерфейс REPL, где вы вводите команды в последовательной консоли, становится непрактичным. Но, хорошие новости: компания также разработала MaixPy IDE для более удобной записи и загрузки кода на плату.
Мы хотели использовать последнюю версию MaixPy IDE 0.2.4, для которой требовалось встроенное ПО 0.4.0 или выше. Нам не повезло с 0.4.0.39. Мы обратили внимание на то, что новая версия была построена 16 августа, поэтому сохраняем ее:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
. / kflash .py - b 1500000 - p / dev / ttyUSB0 - B goE - S 1 maixpy_v0 . 4.0_44_g95f00f0.bin [ INFO ] COM Port Selected Manually : / dev / ttyUSB0 [ INFO ] Default baudrate is 115200 , later it may be changed to the value you set . [ INFO ] Trying to Enter the ISP Mode . . . * [ INFO ] Greeting Message Detected , Start Downloading ISP Downloading ISP : |= === === === === === === === === === === === === === === == | 100.0 % 10kiB / s [ INFO ] Booting From 0x80000000 [ INFO ] Wait For 0.1 second for ISP to Boot [ INFO ] Boot to Flashmode Successfully [ INFO ] Selected Baudrate : 1500000 [ INFO ] Baudrate changed , greeting with ISP again . . . [ INFO ] Boot to Flashmode Successfully [ INFO ] Selected Flash : On - Board [ INFO ] Initialization flash Successfully Programming BIN : |= === === === === === === === === === === === === === === == | 100.0 % 52kiB / s [ INFO ] Rebooting . . . |
На этот раз плата загрузилась. Устанавливаем и запускаем MaixPy IDE в Ubuntu 18.04:
1 2 3 4 5 6 |
mkdir MaixPy-IDE cd MaixPy-IDE wget http://dl.sipeed.com/MAIX/MaixPy/ide/_/v0.2.4/maixpy-ide-linux-x86_64-0.2.4-installer-archive.7z 7z x maixpy-ide-linux-x86_64-0.2.4-installer-archive.7z ./setup.sh ./bin/maixpyide.sh |
Последняя строка запускает IDE с программой hello world по умолчанию.
Теперь мы должны выбрать Maixduino в Инструменты-> Выбрать плату :
Нажимаем на значок зеленой скрепки в левом нижнем углу идентификатора и выбираем /dev/ttyUSB0, чтобы подключиться к плате, и как только это будет сделано, нажимаем кнопку «Play» внизу, чтобы загрузить и запустить пример Hello World на Maixduino.
В верхней правой зоне показан фактический буфер кадра, а также три зоны под гистограммами R, G и B.
Основной особенностью процессора K210 является его KPU AI/ ускоритель машинного зрения. Есть документация.
Сначала давайте загрузим модели:
1 |
wget -r --no-parent http://dl.sipeed.com/MAIX/MaixPy/model/ |
Есть три:
1 2 3 |
ls face_model_at_0x300000 .kfpkg mobilenet_0x300000 .kfpkg mobilenet_7_5_224_tf .h5 |
«Модель лица» – это предварительно обученная крошечная модель Yolo-v2 для обнаружения (человеческих) лиц, а две другие являются мобильными сетями. Мы будем запускать демонстрацию Yolo-V2.
Мы можем вернуться к kflash_gui, загрузить модель и нажать «Загрузить», чтобы перенести ее на плату.
Теперь мы можем написать (скопировать/вставить) код Yolo2 в IDE:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
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 запускается тремя строками:
1 2 3 |
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
: сетевой объект kputhreshold
: предел вероятностиnms_value
: предел box_iouanchor_num
: количество якорейanchor
: параметры привязки, определенные ранее
Цикл while в значительной степени говорит сам за себя: захват изображения, запуск yolo, если лицо обнаружено, очертите прямоугольник, выведите результат на экран и повторите цикл.
Но действительно ли это работает?
Да. Распознавание выполняется в среде IDE со скоростью около 11 кадров в секунду, но оно будет быстрее при работе в автономном режиме. Поэтому мы добавили код, который нашли в демо-версии MaixPy Dock от Тициано Фиорензани, показывающей fps в левом верхнем углу экрана:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
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) #使用kfpkg将 kmodel 与 maixpy 固件打包下载到 flash 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) clock = time.clock() while(True): clock.tick() img = sensor.snapshot() code = kpu.run_yolo2(task, img) if code: fps = clock.fps() img.draw_string(2,2, ("%2.1ffps" % (fps)), color=(0,128,0), scale = 4) for i in code: print(i) a = img.draw_rectangle(i.rect()) a = lcd.display(img) print (clock.fps()) a = kpu.deinit(task) |
Затем мы позвонили сотруднику, чтобы помочь протестировать обнаружение нескольких лиц, и сняли видео.
Обнаружение/отслеживание лица выполняется со скоростью от 15 до 18 кадров в секунду, и наш друг-панда не был обнаружен, но это, вероятно, скорее функция, чем ошибка, так как модель должна быть обучена на обнаружение человеческих лиц. В наши предыдущие попытки, панда, периодически, обнаруживалась, но не так хорошо, как человеческое лицо.
Вы можете использовать функции ESP32, такие как WiFi и/или Bluetooth, но, к сожалению, для этого нет документации. Мы обратились к руководству ESP32 Micropython для настройки WiFi, но он не работал:
1 2 3 4 5 |
>>> import network >>> sta_if = network.WLAN(network.STA_IF); sta_if.active(True) Traceback (most recent call last): File "<stdin>", line 1, in <module> AttributeError: 'module' object has no attribute 'WLAN' |
Мы полагаем, это нормально, так как мы запускаем это в K210 вместо ESP32. Мы надеялись, что разработчики как-то адаптировали его. Взглянув в раздел help, реализовано лишь несколько функций:
1 2 3 4 5 6 |
>>> help(network) object <module 'network'> is of type module __name__ -- network ESP8285 -- <class 'ESP8285'> ESP32_SPI -- <class 'ESP32_SPI'> route -- <function> |
Невозможно использовать /dev/ttyUSB1 для подключения к ESP32, поэтому может потребоваться немного больше работы ..
Если вы хотите обучать и запускать свои собственные модели на Maixduino, используя Keras, сообщение на форуме содержит рекомендации, как это сделать.
Начало работы с Grove AI HAT
Автономный режим
Давайте переключимся на другую плату: Grove AI HAT, которая работает как в автономном режиме, так и подключенная к Raspberry Pi. Мы обратились к Wiki в, где показано, как использовать плату в автономном режиме с Arduino IDE, пропустив материал GPIO/Grove и переходя непосредственно к разделу камера, дисплей и компьютерное зрение.
Подключаем камеру типа «рыбий глаз», вставляем контактный разъем и позаимствуем дисплей из комплекта Maixduino. Обратите внимание, что вы также можете использовать камеру Maixduino с Grove AI HAT, но, обнаружение лиц и отслеживание не работают.
Мы предполагаем, что вы уже установили Arduino IDE на свой хост-компьютер. Для справки, мы используем Arduino 1.8.9 в Ubuntu 18.04.
Сначала нам нужно перейти в File-> Preferences и отредактировать «URL-адреса диспетчера дополнительных плат» со следующим URL-адресом, чтобы добавить поддержку плат Seeed Studio:
1 |
https://raw.githubusercontent.com/Seeed-Studio/Seeed_Platform/master/package_seeeduino_boards_index.json |
Также обратите внимание на путь «Дополнительные настройки можно редактировать прямо в файле», так как позже мы увидим этот каталог.
Теперь перейдите в Tools-> Board-> Boards Manager и найдите «k210». Нажмите «Установить», когда увидите «Grove AI HAT for Edge Computing от Seeed Studio».
Через некоторое время у вас все получится, и вы можете выбрать Seeed K210 Pi и убедиться, что выбран «k-flash» программатор и / dev / ttyUSB0, как показано ниже.
Теперь установите автономный SDK Kendryte в свой рабочий каталог:
1 |
git clone https://github.com/kendryte/kendryte-standalone-demo |
Файл модели необходимо вручную перенести на плату(здесь мы используем путь в настройках, как указано выше):
1 2 |
cd kendryte-standalone-demo/face_detect/kfpkg $HOME/.arduino15/packages/Seeeduino/tools/kflash/1.3.0/kflash.py -n -p /dev/ttyUSB0 -b 2000000 -B dan face_detect.kfpkg |
Вот вывод последней команды, если все идет по планам:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
[INFO] ANSI colors not used [INFO] COM Port Selected Manually: /dev/ttyUSB0 [INFO] Default baudrate is 115200 , later it may be changed to the value you set. [INFO] Trying to Enter the ISP Mode... . [INFO] Greeting Message Detected, Start Downloading ISP [INFO] CH340 mode Downloading ISP: |=============================================| 100.0% 10kiB/s [INFO] Booting From 0x80000000 [INFO] Wait For 0.1 second for ISP to Boot [INFO] Boot to Flashmode Successfully [INFO] Selected Baudrate: 2000000 [INFO] Baudrate changed, greeting with ISP again ... [INFO] Boot to Flashmode Successfully [INFO] Selected Flash: On-Board [INFO] Initialization flash Successfully [INFO] Extracting KFPKG ... [INFO] Writing face_detect.bin into 0x00000000 Programming BIN: |=============================================| 100.0% 65kiB/s [INFO] Writing detect.kmodel into 0x00a00000 Programming BIN: |=============================================| 100.0% 79kiB/s [INFO] Rebooting... |
Теперь вернитесь в свой рабочий каталог и создайте папку и пустую схему с тем же именем, в нашем случае «face_detect»:
1 2 3 |
mkdir face_detect cd face_detect / touch face_detect .ino |
Скопируйте содержимое face_detect из SDK:
1 2 |
cp . . / kendryte - standalone - demo / face_detect / * - rf . |
Теперь откройте face_detect.ino в Arduino IDE. Это автоматически откроет кучу других файлов, включая board_config.h, который нам нужно изменить, чтобы включить датчик OV2640 и плату LICHEEDAN, как показано ниже.
Вы можете перейти на main.c для изучения кода, но для его понимания потребуется немного больше усилий, чем для примера Maixduino MicroPython. Если вы просто хотите попробовать, вы можете проверить, компилируется ли он. У нас было несколько предупреждений из-за неиспользованных переменных:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
sketch/ov5640.c: In function 'ov5640_init': sketch/ov5640.c:266:14: warning: unused variable 'reg' [-Wunused-variable] uint16_t reg = 0; ^~~ At top level: sketch/ov5640.c:258:16: warning: 'ov5640_rd_reg' defined but not used [-Wunused-function] static uint8_t ov5640_rd_reg(uint16_t reg) ^~~~~~~~~~~~~ sketch/ov5640.c:248:13: warning: 'hal_delay' defined but not used [-Wunused-function] static void hal_delay(uint32_t delay) ^~~~~~~~~ sketch/region_layer.c: In function 'do_nms_sort': sketch/region_layer.c:312:56: warning: passing argument 4 of 'qsort' from incompatible pointer type [-Wincompatible-pointer-types] qsort(s, boxes_number, sizeof(sortable_box_t), nms_comparator); ^~~~~~~~~~~~~~ In file included from sketch/region_layer.c:1: /home/jaufranc/.arduino15/packages/Seeeduino/tools/riscv64-unknown-elf-gcc/8.2.0/riscv64-unknown-elf/include/stdlib.h:140:72: note: expected '__compar_fn_t' {aka 'int (*)(const void *, const void *)'} but argument is of type 'int (*)(void *, void *)' void qsort (void *__base, size_t __nmemb, size_t __size, __compar_fn_t _compar); ~~~~~~~~~~~~~~^~~~~~~ sketch/region_layer.c: In function 'region_layer_output': sketch/region_layer.c:351:14: warning: unused variable 'boxes_number' [-Wunused-variable] |
Но скомпилировано нормально:
1 |
Sketch uses 511916 bytes (6%) of program storage space. Maximum is 8388608 bytes. |
Теперь мы можем загрузить схему прямо из IDE:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
[INFO] ANSI colors not used [INFO] COM Port Selected Manually: /dev/ttyUSB0 [INFO] Default baudrate is 115200 , later it may be changed to the value you set. [INFO] Trying to Enter the ISP Mode... . [INFO] Greeting Message Detected, Start Downloading ISP [INFO] CH340 mode Downloading ISP: |===----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| 1.5% ... Downloading ISP: |=========================================================================================================================================================================================================----| 98.5% 10kiB/s Downloading ISP: |=============================================================================================================================================================================================================| 100.0% 10kiB/s [INFO] Booting From 0x80000000 [INFO] Wait For 0.1 second for ISP to Boot [INFO] Boot to Flashmode Successfully [INFO] Selected Baudrate: 2000000 [INFO] Baudrate changed, greeting with ISP again ... [INFO] Boot to Flashmode Successfully [INFO] Selected Flash: On-Board [INFO] Initialization flash Successfully Programming BIN: |======================================================================================================-------------------------------------------------------------------------------------------------------| 50.0% Programming BIN: |=============================================================================================================================================================================================================| 100.0% 67kiB/s [INFO] Rebooting... |
Теперь плата будет захватывать видео и показывать красный прямоугольник, когда человеческое лицо будет обнаружено, аналогично демонстрации Maixduino MicroPyhon.
Дисплей был вверх ногами. Исправлено небольшое изменение в коде (см. Строку 5 ниже):
1 2 3 4 5 6 7 8 |
#if BOARD_LICHEEDAN #if OV5640 lcd_set_direction(DIR_YX_RLUD); #else lcd_set_direction(DIR_YX_LRUD); /* lcd_set_direction(DIR_YX_RLDU);*/ #endif #else |
Это похоже на демонстрацию Maixduino выше, но вместо того, чтобы полагаться на MicroPython, мы сделали это в Arduino IDE.
Grove AI HAT и Raspberry Pi 4
Поскольку у нас есть плата HAT, было бы стыдно, если бы мы не использовали ее с платой Raspberry Pi. Поэтому, вставляем плату в Raspberry Pi 4 SBC. Убедитесь, что перемычка RPI 5В на верхней части платы Grove AI HAT установлена в положение ON.
Первое, что нам показалось интересным, – это разработка кода непосредственно на Raspberry Pi 4. Поэтому, устанавливаем Arduino 1.8.9 для Arm 32-bit и загружаем URL-адрес платы Seeed Studio на основе приведенных выше инструкций.
Но, когда мы попытались установить «Grove AI HAT для Edge Computing от Seeed Studio», мы быстро столкнулись с препятствием:
Сообщение выше: «Инструмент kflash недоступен для вашей операционной системы», а также «Инструмент kendryte-standalone-sdk недоступен для вашей операционной системы». Не удивительно, что инструменты Kendryte K210 (пока) недоступны для Arm.
В качестве примечания, используя Raspberry Pi 4 с 1 ГБ, запускать Chromium было бы не очень хорошей идеей, даже с одной вкладкой и Android IDE, поскольку памяти недостаточно, и он полностью заполнит 512 МБ на карте microSD. Даже с ZRAM нет никакой надежды, поэтому, если вы когда-нибудь рассматривали возможность запуска Arduino IDE на Raspberry Pi 4 (например, для плат Arduino), а также просматривали документацию, приобретайте версию RAM объемом 2 ГБ или 4 ГБ.
Тем не менее, еще один способ использования Grove AI HAT с Raspberry Pi – это отображение данных. Как объясняет Seeed Studio в своем демонстрационном руководстве по подсчету лиц . Давай попробуем.
Установили Arduino IDE и установили демо-прошивку face. Теперь мы можем просто установить программу Face Count на Raspberry Pi:
1 2 3 4 5 6 |
cd ~ git clone https://github.com/LynnL4/face-detected.git cd face-detected sudo chmod -R 777 installer cd installer sudo ./setup.sh |
Однако, при запуске возникает ошибка:
1 2 |
sudo . / face - detected .sh Segmentation fault |
Давайте посмотрим на setup.sh:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
#!/bin/bash #start pi spi pwds = / boot / config .txt sudo sed - i 's/dtparam=spi=off//g' $pwds sudo sed - i 's/dtparam=spi=on//g' $pwds sudo sed - i '$a dtparam=spi=on' $pwds #reboot后生效 CurDir = $PWD "/face-detected.desktop" ExecDir = $PWD "/face-detected.sh" IconDir = $PWD "/Pyte_Data/icon.png" sudo sed - i "4c Exec=$ExecDir" $CurDir sudo sed - i "5c Icon=$IconDir" $CurDir sudo cp $CurDir / usr / share / applications / face - detected .desktop cp $CurDir / home / pi / Desktop / face - detected .desktop |
Мы видим, как Grove AI HAT связывается с платой Raspberry Pi через SPI, и изменяется файл /boot/config.txt. Поэтому перезагружаем систему, но проблема та же. Каталог установщика содержит множество бинарных библиотек, которые были протестированы на Raspberry Pi 3 B + с Debian Wheezy, поэтому переход на Raspberry Pi 4 с Debian Buster, вероятно, привел к ошибкам. Мы сообщили об этом в Seeed Studio, и они изучают это.
Завершим обзор демонстрацией видео по распознаванию лиц, запущенной на Grove AI HAT, к которой снова присоединились несколько «друзей».
Все работает примерно так, как и ожидалось. Отфильтровалось большинство наших друзей, не являющихся людьми, и получилось до 3-4 лиц одновременно с фотографии.
Покупка плат, дисплеев и камер
Хотелось бы поблагодарить Seeed Studio за отправку платы и предоставленной нам возможности поэкспериментировать с платформами Kendryte K210/Sipeeed M1 с использованием MicroPython и Arduino. Если вы хотите воспроизвести наш опыт, вы можете купить Grove AI Hat за 28,90 долларов, камеру «рыбий глаз» OV2640 за 7,60 долларов и/или комплект Maixduino с платой, дисплеем и камерой за 23,90 долларов.
Выражаем свою благодарность источнику из которого взята и переведена статья, сайту cnx-software.com.
Оригинал статьи вы можете прочитать здесь.