Комментарии 64
Спасибо за статью, очень познавательно.
Во-первых, как обычно, очень мощная работа и статья! Спасибо!
Первое впечатление - столько ядер и ОС, а памяти всего 256Мб на всё. Без возможности расширить. И на них 2 ОС с ИИ крутить?
После изучения LuckFox Pico и LicheeRV Nano можете их сравнить?
Да, памяти действительно мало, но мне кажется, что это очередная попытка китайцев сэкономить. Теперь о сравнении:
WiFi на плате LicheeRV Nano - однозначно плюс, потому что к Luckfox Pico адекватно добавить поддержку WiFi можно только через самодельный шилд/hat. А это не так удобно
Производительность CPU примерно одинаковая у обоих, но возможность выбора ARM/RISC-V под Linux я считаю бесполезной, лучше бы под Linux было 2 ядра и 1 под RTOS
Производительность NPU: у LicheeRV Nano оно быстрее в 2 раза, но что тоже интересно - LicheeRV Nano поддерживает BF16 (пока не завёлся, но я решу эту проблему).
Разработка под NPU. NPU решает очень узкий набор задач, поэтому необходимо портировать модель под него. У LicheeRV Nano TDL SDK опенсурсный, поэтому потенциально есть возможность портировать любую модель (конечно, это только на словах легко). RKNN Toolkit - закрытый, если он не поддерживает какой - то слой/функцию, то кастомную модель придётся переделывать. YOLO и набор основных SOTA нейронок портирован на обоих фреймворках, но портирование кастомных моделей может вызывать трудности (но это в целом проблема всех NPU, заявленная поддержка ONNX моделей не означает, что любую модель можно запустить).
Камеры. У Luckfox Pico "нестандартный" CSI разъём. У LicheeRV Nano хотя бы разъём подходит под камеры Raspberry PI, но с софтом/драйверами пока есть проблемы. На обоих платах сложно завести камеру не от производителя платы. Хотя Luckfox Pico судя по тексту из документации не планируют заниматься поддержкой других камер.
Документация. У LicheeRV Nano она намного хуже (мало тем рассмотрено), чем у Luckfox Pico
Поддержка FreeRTOS на втором ядре однозначно плюс для LicheeRV Nano
GPIO пины: LicheeRV Nano с включенным WiFi фактически не имеет аппаратных SPI и I2C, что очень неприятно
В общем, LicheeRV Nano мне кажется более перспективной платой для более сложных проектов, но маленький объём оперативки и всего одно ядро под Linux - две основные проблемы.
LuckFox pico max, вроде, на RV 1106G3 и тоже даёт 1TOPS, как и LeechRV. И тоже 256Mb RAM DDR3L. А если ей хирургически отрезать эзернет разъём, то и размер будет на четверть меньше
Кстати LuckFox pico max выглядит интересно, надо будет потестировать
В общем я заказал LuckFox pico max 256 с 1106G3, внятного даташита я не нашёл (не совсем понятно точно ли там 1 TOPS на int8, проверю экспериментально). И если там действительно 1 TOPS, то можно будет провести интересный эксперимент: при одинаковой базовой YOLO модели и входных данных сравнить скорость инференса на разных платах (LicheeRV Nano и LuckFox pico max 256). Всё-таки у Rockchip и SOPHGO разные NPU и SDK под них, интересно есть ли разница в "качестве их софта" или, например, обвязка вокруг SoC'а может влиять на скорость работы.
используйте Radxa zero 3 на rk3566. Стоит 2500р, сильно быстрее и лучше. 4 ядра Cortex-A55, 1 или 2 или 4 или 8 GB. Нет геморроя со сборкой в docker (когда забудете сделать save config), кросс-компилятор buildroot (а еще свой старый debian, и новый armbian на последнем ядре). И главное - поддерживает множество сенсоров камер c isp.
У milk-v duo не завезли V4L2. Вот совсем. Обещали прошлым летом, was и ныне tam.
Luckfox видимо ещё сами не решили какая производительность у NPU на RV1106G3. В одном месте написано 0.5 для всей линейки:

На странице плат с RV1106 упоминается 1 TOPS:

В итоге, приехала мне LuckFox Pico Max, процессор RV1106G3 и на Yolov8 с изображениями 640x640 он выдаёт 14 FPS (чуть больше, чем Luckfox Pico, у которой 11 FPS). К сожалению, это явно не 1 TOPS...
Мощная статья.
Нубский вопрос: в начале в разделе "Энергопотребление", чем вы его меряли и делали такие красивые скрины?
Китайский USB тестер (примерно как на скриншоте ниже). У меня версия с Bluetooth и для него есть приложение под android, которое графики и рисует (и даже в csv вроде может экспортировать), ну и потом я скриншоты немного в GIMP'е обрабатывал (обрезал, текст подписывал) и всё.

Использование Python на этой плате нецелесообразно, ввиду ограниченности ресурсов.
Что конкретно помешает нормальной работе сетевых приложений под python?
Маленькое количество оперативной памяти, сам интерпретатор заберёт достаточно много. Так же сам процесс получения из кадра итогового массива объектов, обнаруженных через YOLO состоит из нескольких шагов. Инференс происходит на NPU и тут Python сильно не проиграет по скорости, но далее результаты с NPU пост-обрабатываются ещё на процессоре (NMS фильтр). Тут Python сильно тормозит
А если рассматривать плату для сервера на python? Без обработки изображений.
Можете ли порекомендовать более подходящую плату подобного формата?
В репозитории Sipeed я открыл issue, касающееся этой камеры, и планируется вести обсуждение поддержки камеры там
Есть шанс запустить камеру?
После такой роскошной статьи захотелось тоже попробовать, но покупать дорогую не очень стандартную родную камеру не хотелось бы, от малинки стоит всего пару баксов и переходник меньше бакса.
Пока считать кадр с камеры не удалось. Недавно в issue писал человек, что смог заставить плату "увидеть" камеру, отпаяв 2 подтягивающих резистора. Но у меня от этого никаких изменений не произошло. Но в любом случае пока, к сожалению, она не запустилась.
В общем, пока не понятно, вроде шансы есть (так как все исходники есть), но почему - то ничего не работает. Ну и со стороны Sipeed, к сожалению, никакой помощи нет.
Жалко не вышло. Я читал затихшую переписку на гитхабе и решил, что раз нет интереса у других, пропал и у вас. Может с LuckFox pico max 256 заработает, хотя даже даташит на вариант 1106G3 не ищется и параметры неясны, да и сопроцессор там непонятен. В SG2002 заинтересовала дешевая возможность попробовать одновременно линукс, FreeRTOS и ИИ.
I tried the sd img on Milk-v Duo 256m, but i am getting problem, infinte loop
Can you help me ?

yes, i tried on Duo 256! No success! Can you try if get the same problem ?

And thanks to help me! It´s a interesting question...because both are the same SG2002
Thank you so much!
Yes, some SD card problem initialization! Thank you so much again. Believe, i spent hours to try before ask for your help!
Thanks again!
Hi :) One more question!
Did you train on Robloflow or on COLAB ?
If possible, send us the step / tips that you follow it...and share your images used to the train...:)
[root@milkv-duo]~# ./sample_yolov8 ./yolov8n_cv181x_int8_sym.cvimodel ./bus_640
.jpg
[ 9792.491457] vb has already inited, set_config cmd has no effect
---------------------openmodel-----------------------version: 1.4.0
yolov8n Build at 2025-03-05 23:09:23 For platform cv181x
Max SharedMem size:385024
open model failed with 0xc0010102!
[root@milkv-duo]~#
because i am having always this erros for the cvimodels that i got when training to new objects
Is yolov8n_cv181x_int8_sym.cvimodel your custom trained and exported model or it is base COCO model? Do you check MODEL_CLASS_CNT define in code?
custom trainned...
what mean MODEL_CLASS_CNT ?
In sample_yolov8 source code there is a line:
#define MODEL_CLASS_CNT 80
You need to change 80 to number of classes, that your model detects
this maybe make sense..
because in the past, i remember that i was not getting success to train more that 2 objects (class) on monkeys and persons
Iot Smartcore: MILK-V - CRIANDO DATASET DO ZERO - BUGGIO
i remember that works only with two class monkey...
i will verify tomorrow the source code of sample_yolov8.cpp
On colab
After unzip your ZIP file...
I executed the batch
from ultralytics import YOLO
model = YOLO('yolov8n.pt')
results = model.train(data=f"data.yaml", epochs=100, imgsz=640)
I got best.pt
then
from ultralytics import YOLO
import types
import sys
def forward2(self, x):
x_reg = [self.cv2i for i in range(self.nl)]
x_cls = [self.cv3i for i in range(self.nl)]
return x_reg + x_cls
model_path = './best.pt'
model = YOLO(model_path)
model.model.model[-1].forward = types.MethodType(forward2, model.model.model[-1])
model.export(format='onnx', opset=11, imgsz=640)
then i got best.onnx
model_transform.py
--model_name yolov8n
--model_def best.onnx
--input_shapes [[1,3,640,640]]
--mean 0.0,0.0,0.0
--scale 0.0039216,0.0039216,0.0039216
--pixel_format "rgb"
--keep_aspect_ratio
--test_input /workspace/tpu-mlir/regression/image/test.jpg
--test_result yolov8n_top_outputs.npz
--mlir yolov8n.mlir
then i got yolov8n.mlir
run_calibration.py yolov8n.mlir
--dataset /workspace/tpu-mlir/regression/dataset/<folder with your train image>
-o yolov8n_cali_table
then i got yolov8n_cali_table
model_deploy.py
--mlir yolov8n.mlir
--quantize INT8
--calibration_table ./yolov8n_cali_table
--chip cv181x
--test_input /workspace/tpu-mlir/regression/image/test.jpg
--test_reference yolov8n_top_outputs.npz
--compare_all
--tolerance 0.96,0.72
--fuse_preprocess
--model yolov8n_int8_fuse.cvimodel
then i got yolov8n_int8_fuse.cvimodel
transfered to milk-v 256
got
[root@milkv-duo]~# ./sample_yolov8 ./yolov8n_cv181x_int8_sym.cvimodel ./bus_640
.jpg
[ 9792.491457] vb has already inited, set_config cmd has no effect
---------------------openmodel-----------------------version: 1.4.0
yolov8n Build at 2025-03-05 23:09:23 For platform cv181x
Max SharedMem size:385024
open model failed with 0xc0010102!
[root@milkv-duo]~# ^C
[root@milkv-duo]~#
yes!
for your cvimodels trainned works nice!
i am doing something wrong during the process from best.pt to cvimodel conversion...
Hi :)
Still tryng o solve the error...
Can you send me your CVIMODEL trainned for the TARGET ?
And on COLAB, your model base used to train and create the best.pt was yolov8n.pt ?

Stephen
In your side detected something ?
[root@milkv-duo]~# ./sample_yolov8 ./yolo11n_320_int8_2_class.cvimodel ./blue_ci
rcle_mat_mp4-0129_jpg.rf.248f6b4aecdc00b275f4a6ca63794d25.jpg
[169309.974946] vb has already inited, set_config cmd has no effect
enter CVI_TDL_Get_YOLO_Preparam...
asign val 0
asign val 1
asign val 2
setup yolov8 param
enter CVI_TDL_Get_YOLO_Preparam...
setup yolov8 algorithm param
yolov8 algorithm parameters setup success!
version: 1.4.0
yolo11n_320 Build at 2025-01-25 17:10:07 For platform cv181x
Max SharedMem size:588800
image read,width:640
image read,hidth:640
Detection FPS: 1487.707814
Detected objects cnt: 0
Detected objects:
[root@milkv-duo]~#
i am executing on MILK-V DUO 256 your bin files...
better is me wait for the module that i order from ALIEXPRESS:(
But in you side, detected, right ?
hi, got progress, updated the libraries to latest and your model inference is ok
thanks
Is this the sequence that you you use to convert MLIR to CVIMODEL ?

Big progress here!
Stepher, have you a Whatsupp number ? i want to add you! And a friend from china too!
Or, telegram ?
Статья поразительно шикарная! Правда, я не сильно в этой теме разбираюсь, но устройство мне очень понравилось. Интересно, насколько вообще реально и сложно будет на этой штуке запустить openwrt? В openwrt имеется какая-никакая поддержка risc-v. Ну и по железу этой операционной системе, мне кажется, будет вполне комфортно на этой железке.
Я с openwrt никогда не работал, поэтому не могу сказать насколько просто его будет запустить. Но в целом, скорее всего это возможно
Прикольная маленькая ОС для роутеров с соответствующим (зачастую минималистичным, но и с хорошим веб интерфейсом) софтом. Кстати, там мне там удаётся запускать бинарники, собранные под linux для нужной архитектуры. Прям вообще не вижу смысла в какой-то другой ОС, несмотря на размер openwrt в несколько мегабайт.
Есть может быть каике-то другие мелкие linux, где убрано всё лишнее, а если что-то и нужно, то можно добавить как в конструкторе? Просто мой путь знакомства с linux начался с openwrt. Может какой-то другой подобный linux имеется под эту мини-платку?
Под эту плату из официального только buildroot, но он наверное даже ещё меньше openwrt должен быть. Тут главная проблема в том, чтобы всякие драйверы для работы со специфичными аппаратными возможностями завелись (в оф. образе они работают, но переносить в другие дистрибутивы, наверное, не очень просто будет). В целом, в buildroot не сложно добавлять кастомные пакеты. Но всё-таки buildroot это не дистрибутив, а просто система сборки
AI, FreeRTOS и Linux в кармане: возможности LicheeRV Nano