1.环境安装
1.1CSK开发环境安装
我使用的是macOS,文章中全按照macOS的流程进行环境安装
预安装 - 安装依赖
xcode-select --install
如果没有安装xcode的话,先使用这行命令安装开发者工具。
- 搭建开发者环境
wget -qO- https://cdn.iflyos.cn/public/cskTools/lisa-zephyr-install.sh | bash
- 检查开发环境
lisa info zep
如上所示就是正常安装完成。
2.模型开发
- 模型选型
CSK6 芯片面向轻量级端侧AI应用设计,考虑到芯片有限的PSRAM、SRAM、Flash等资源,建议您采用小模型(如squeezenet、mobilenet、mobilenetv2、resnet18 等)。
这里我们选择mobilenetv2作为我们选择的模型。MobileNetV2是一种轻量级的卷积神经网络架构,用于图像分类和目标检测任务。它是MobileNet系列模型的第二个版本,旨在在计算资源受限的移动设备上实现高效的图像识别。
- 网络修改
我们基于pytorch-cifar100这个库进行训练。但是在训练mobilenetv2时有一些问题需要解决。下面我们先贴出mobilenetv2的网络结构图。
在mobilenetv2的倒数第三行中,我们使用了adaptive_avp_pool2d这种方法进行池化,但是在csk6这块开发版上并不支持这种池化方法。所以我们需要使用nn.AvgPool2d达成和自适应池化一样的效果。
这是一件困难的事情,但是我们根据网络和开发版的先验知识可以知道,每次输入网络的图片大小是固定的。那么我们可以通过计算在adaptive_avp_pool2d这个位置的特征图大小来手动设计一个nn.AvgPool2d层来达到相同的效果。
conv/deconv/pool限制
pad_h_up < weight_h,同时pad_h_down < weight_h
pad_w_right < weight_w, 同时pad_w_left < weight_w
CSK6开发版对于卷积和池化层也有如上的限制,在这里我们需要修改一层卷积,它的padding = weight。我们去除padding后。网络层修改结束。
- 模型训练
CSK6有一套自己的模型QAT量化工具,具体流程如下
我们首先进行浮点训练,添加约束条件后开始训练。并在checkpoint/resnet50下得到一个pth文件。
之后使用如下代码进行量化训练
量化训练好后,我们把模型导出成onnx格式。
使用thinker离线工具tpacker对步2生成的onnx计算图打包。
tpacker -g demo/mobilenetv2/mobilenetv2.onnx -d True -o demo/mobilenetv2/mobilenetv2.bin
3.开发版烧录
整体工作流程:
- 初始化摄像头驱动
- 将摄像头的 VYUY 图像转换为 RGB 图像
- 将 640x480 的图像缩放到 32x32 (这里采用的是双线性插值法进行图像缩放)
- 将图像数据转浮点,提高运算精度
- 将浮点数据 Normalize
- 转为 uint8 类型,传递给 Thinker 作为输入
- 获取 Thinker 输出,输出模型判定的图像分类
3.1编译新wasm
wasi下载:下载地址并用tar -xvf 解压
wasm-sdk:
git clone https://cloud.listenai.com/listenai/wasm/wasm-sdk.git --recursive
配置环境变量
export WASM_THINKER_SDK="/path_to_sdk/wasm-sdk"
export WASI_TOOLCHAIN_PATH="/path_to_sdk/wasi-sdk-17.0"
因为我们使用了新的mobilenetv2模型,需要重新编译wasm。
cd app_wasm
lisa zep exec python $WASM_THINKER_SDK/cmake/sdk.py build -p .
编译后在app_wasm/build/下会生成一个aot文件
3.2编译其他&烧录
首先我们下载依赖工程
lisa zep create --from-git https://cloud.listenai.com/listenai/samples/camera_image_detect.git
烧录CP资源
lisa zep exec cskburn -s COMx -C 6 -b 748800 0x100000 resource/cp.bin
注意:COMx 指的是你的串口地址,在 macOS下,使用ls /dev/tty.* 来查看对应的串口号。
烧录NPU应用
# 注意:COMx 指的是你的串口地址
lisa zep exec cskburn -s COMx -C 6 -b 748800 0x200000 resource/thinker_mobilenetv2.aot
注意:这里需要烧录新编译好的aot文件
烧录 WASM 模型资源
# 注意:COMx 指的是你的串口地址
lisa zep exec cskburn -s COMx -C 6 -b 748800 0x300000 resource/mobilenetv2_model.bin
编译工程
lisa zep build -p -b csk6011a_nano
lisa zep flash -r csk --port COMx
3.3 运行结果
- 首先用 USB-C 数据线连接到 NanoKit 后,打开串口终端查看日志。(此处使用 聆思在线串口终端 查看串口日志,你也可以使用自己喜欢的串口终端软件,但要注意需要支持颜色样式渲染)
用usb连接开发版后,这里我们使用screen连接开发版串口
screen /dev/tty.your-port 115200
- 之后按动开发板上的reset按键,使开发板进行复位运行,开发板启动后,会在完成模型资源等加载后控制摄像头拍摄一张照片,送入模型进行推理。
- 在这里我们选择了一张苹果的图片进行推理,图片如下所示
按动reset后,对准这张苹果图片我们进行识别,得到了正确的识别结果
成功完成了模型的部署。
4.总结
这次项目中,我们成功使用mobilenetv2模型部署在CSK开发版。
后续会使用其他模型进行部署。并尝试不同的量化策略。