Milk-V Duo 是一款基于CV1800B芯片的RISC-V架构开发板,它可以运行 Linux 和 RTOS,适用于嵌入式系统和物联网设备的开发。其中,CV1800B 是一款高性能、低功耗芯片,适用于住宅消费监控 IP 摄像机、家庭智能等众多产品。它提供丰富的教程和资料,支持多种操作系统,具有活跃的社区支持,并且接口丰富,易于上手。该开发板可用于教育和研究,尤其在计算机体系结构、嵌入式系统设计、硬件原型制作等方面。
一、启动 Duo
1、准备一个大于1GB的microSD和一根Type-C 数据线
2、下载镜像和工具从官方镜像和SDK下载系统镜像,下载Flash工具 balenaEtcher。使用读卡器将SD卡插到电脑上,打开balenaEtcher,按照界面提示进行烧录。
3、将Milk-V Duo 通过Type-C数据线与电脑进行连接;想要通过数据线来连接Milk-V Duo 开发板可以采用RNDIS的方式,需要先安装RNDIS驱动,如果打开设备管理器有一个RNDIS设备,但是会有一个警告标致,请参考Milk -v 开发板烧录系统以及ssh连接_milkv-CSDN博客解决连接问题。
4、如果SDK烧录成功,Duo上的蓝色LED灯将会闪烁。
二、配置Docker开发环境
MilkV Duo的开发板的模型转换环境需要在docker中运行,这样可以避免无意中篡改了主机的系统环境变量。Docker是一个用于创建、部署和运行应用程序的轻量级容器化平台,允许开发者将应用及其依赖打包成一个可在任何环境中一致运行的容器。
1.、在 Windows 下运行 Docker 需要相关依赖,即如图中所示,需要使用 WSL2 (WSL2是Windows Subsystem for Linux的升级版,它通过虚拟化技术在Windows 10及更高版本上高效地运行Linux环境,提供近乎原生的性能和系统调用兼容性,极大地方便了需要在Windows系统中使用Linux工具和应用程序的开发者)后端或者 Hyper-V 后端作为运行依赖,我配置的是WSL2 后端。具体安装过程参考
十七、WSL2的安装与使用(Win11)_win11 wsl2-CSDN博客
2.、在 windows 环境下,可以安装 Docker Desktop for Windows
,Docker 下载地址
安装完成后,需要重启电脑,然后即可使用 Docker,如果出现以下问题:
3、然后,拉取开发所需 Docker 镜像
docker pull sophgo/tpuc_dev:v3.1
4、启动 Docker 容器,在 Windows 终端中执行
docker run --privileged --name <container_name> -v /workspace -it sophgo/tpuc_dev:v3.1
其中,<container_name>
为自己定义的容器名,比如叫 DuoTPU
docker run --privileged --name DuoTPU -v /workspace -it sophgo/tpuc_dev:v3.1
5、登陆到 Docker 容器启动容器后会自动登陆到 Docker 窗口的终端界面,如果需要新开窗口,可以在 Windows 终端中用 docker ps
命令查看当前 Docker 容器列表
docker exec -it f3a060efb1d3 /bin/bash
用 CONTAINER ID登陆到 Docker 容器中,在 Docker 终端中,检查当前是否为 /workspace
目录,如果不是,用 cd 命令进入该目录。
获取开发工具包并添加环境变量
git clone https://github.com/milkv-duo/tpu-mlir.git
在 Docker 终端中,用 source 命令添加环境变量 In the Docker terminal, use the source command to add environment variables
source ./tpu-mlir/envsetup.sh
三、在 Docker 中准备工作目录
1、创建并进入 mobilenet_v2 工作目录,注意是与 tpu-mlir 同级的目录
mkdir mobilenet_v2 && cd mobilenet_v2
2、将克隆的 MobileNet-Caffe
目录下的模型文件、 tpu-mlir
工具链目录下的图片文件放入当前目录下
cp MobileNet-Caffe/mobilenet_v2_deploy.prototxt .
cp MobileNet-Caffe/mobilenet_v2.caffemodel .
cp -rf ${TPUC_ROOT}/regression/dataset/ILSVRC2012/ .
cp -rf ${TPUC_ROOT}/regression/image/ .
这里的 ${TPUC_ROOT}
是环境变量,对应 tpu-mlir
目录,是在前面配置 Docker 开发环境中 source ./tpu-mlir/envsetup.sh
这一步加载的
3、创建并进入 work
工作目录,用于存放编译生成的 MLIR
、cvimodel
等文件
# mkdir work && cd work
四、MobileNet-Caffe 模型转换
1、Caffe 模型转换成 MLIR
模型输入是图片,在转模型之前我们需要了解模型的预处理。如果模型用预处理后的 npz 文件做输入,则不需要考虑预处理。预处理过程用公式表达如下($x$代表输入): $$ y = (x-mean)\times scale $$
本例中的模型是 BGR 输入, mean
和 scale
分别为 103.94
,116.78
,123.68
和 0.017
,0.017
,0.017
,模型转换命令如下:
model_transform.py \
--model_name mobilenet_v2 \
--model_def ../mobilenet_v2_deploy.prototxt \
--model_data ../mobilenet_v2.caffemodel \
--input_shapes [[1,3,224,224]] \
--resize_dims=256,256 \
--mean 103.94,116.78,123.68 \
--scale 0.017,0.017,0.017 \
--pixel_format bgr \
--test_input ../image/cat.jpg \
--test_result mobilenet_v2_top_outputs.npz \
--mlir mobilenet_v2.mlir
运行成功效果示例
转成 MLIR 模型后,会生成一个 mobilenet_v2.mlir
文件,该文件即为 mlir 模型文件,还会生成一个 mobilenet_v2_in_f32.npz
文件和一个 mobilenet_v2_top_outputs.npz
文件,是后续转模型的输入文件
2、MLIR 转 INT8 模型
生成量化需要的校准表
运行 run_calibration.py
得到校准表,输入数据的数量根据情况准备 100~1000 张左右。 这里用现有的 100 张来自 ILSVRC2012 的图片举例,执行 calibration 命令:
run_calibration.py mobilenet_v2.mlir \
--dataset ../ILSVRC2012 \
--input_num 100 \
-o mobilenet_v2_cali_table
运行成功效果示例
运行完成后会生成名为 mobilenet_v2_cali_table
的文件, 该文件用于后续编译 INT8 模型的输入文件
3、MLIR 量化成 INT8 非对称 cvimodel
用 model_deploy.py
脚本参数使用 asymmetric
进行非对称量化,将 MLIR 文件转成 INT8 非对称量化模型:
model_deploy.py \
--mlir mobilenet_v2.mlir \
--asymmetric \
--calibration_table mobilenet_v2_cali_table \
--fuse_preprocess \
--customization_format BGR_PLANAR \
--chip cv180x \
--quantize INT8 \
--test_input ../image/cat.jpg \
--model mobilenet_v2_cv1800_int8_asym.cvimodel
运行成功效果示例
编译完成后, 会生成名为 mobilenet_v2_cv1800_int8_asym.cvimodel
的文件
五、 在 Duo 开发板上进行验证
连接 Duo 开发板、根据前面的教程完成 Duo 开发板与电脑的连接,并使用 mobaxterm
或 Xshell
等工具开启终端操作 Duo 开发板
1、获取 tpu-sdk
在 Docker 终端下切换到 /workspace
目录
cd /workspace
下载 tpu-sdk(注意区分自己板子是64MB还是256MB)
git clone https://github.com/milkv-duo/tpu-sdk.git
2、将开发工具包和模型文件拷贝到 Duo 开发板上
在 duo 开发板的终端中,新建文件目录 /mnt/tpu/
mkdir -p /mnt/tpu && cd /mnt/tpu
在 Docker 的终端中,将 tpu-sdk
和模型文件拷贝到 Duo 开发板上
scp -r /workspace/tpu-sdk root@192.168.42.1:/mnt/tpu/
scp /workspace/mobilenet_v2/work/mobilenet_v2_cv1800_int8_asym.cvimodel root@192.168.42.1:/mnt/tpu/tpu-sdk/
3、设置环境变量
在 Duo 开发板的终端中,进行环境变量的设置
cd /mnt/tpu/tpu-sdk
source ./envs_tpu_sdk.sh
六、进行图像分类测试,进行图像分类测试
进入 samples 目录
cd samples
查看 cvimodel info
./bin/cvi_sample_model_info ../mobilenet_v2_cv1800_int8_asym.cvimodel
运行图像分类测试
./bin/cvi_sample_classifier_fused_preprocess \
../mobilenet_v2_cv1800_int8_asym.cvimodel \
./data/cat.jpg \
./data/synset_words.txt
分类成功结果示例