企鹅火烈鸟🦩 · 2023年10月19日 · 北京市

【聆思CSK6 LNN工具体验】使用CSK6 部署分类模型全流程

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

截屏2023-10-19 12.06.33.png
如上所示就是正常安装完成。

2.模型开发

  • 模型选型
CSK6 芯片面向轻量级端侧AI应用设计,考虑到芯片有限的PSRAM、SRAM、Flash等资源,建议您采用小模型(如squeezenet、mobilenet、mobilenetv2、resnet18 等)。

这里我们选择mobilenetv2作为我们选择的模型。MobileNetV2是一种轻量级的卷积神经网络架构,用于图像分类和目标检测任务。它是MobileNet系列模型的第二个版本,旨在在计算资源受限的移动设备上实现高效的图像识别。

  • 网络修改
    我们基于pytorch-cifar100这个库进行训练。但是在训练mobilenetv2时有一些问题需要解决。下面我们先贴出mobilenetv2的网络结构图。
    截屏2023-10-19 12.17.37.png
    在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量化工具,具体流程如下
lnn_flow_path.png
我们首先进行浮点训练,添加约束条件后开始训练。并在checkpoint/resnet50下得到一个pth文件。
linger_set1.png

之后使用如下代码进行量化训练
linger_set2.png
量化训练好后,我们把模型导出成onnx格式。

使用thinker离线工具tpacker对步2生成的onnx计算图打包。

tpacker -g demo/mobilenetv2/mobilenetv2.onnx -d True -o demo/mobilenetv2/mobilenetv2.bin

3.开发版烧录

整体工作流程:

  1. 初始化摄像头驱动
  2. 将摄像头的 VYUY 图像转换为 RGB 图像
  3. 将 640x480 的图像缩放到 32x32 (这里采用的是双线性插值法进行图像缩放)
  4. 将图像数据转浮点,提高运算精度
  5. 将浮点数据 Normalize
  6. 转为 uint8 类型,传递给 Thinker 作为输入
  7. 获取 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按键,使开发板进行复位运行,开发板启动后,会在完成模型资源等加载后控制摄像头拍摄一张照片,送入模型进行推理。
  • 在这里我们选择了一张苹果的图片进行推理,图片如下所示
    截屏2023-10-19 12.55.42.png

按动reset后,对准这张苹果图片我们进行识别,得到了正确的识别结果
截屏2023-10-19 12.55.52.png
成功完成了模型的部署。

4.总结

这次项目中,我们成功使用mobilenetv2模型部署在CSK开发版。
后续会使用其他模型进行部署。并尝试不同的量化策略。

推荐阅读
关注数
5165
内容数
99
聆思科技官方专栏,专注AIOT芯片,持续分享有趣的解决方案。商务合作微信:listenai-csk 技术交流QQ群:825206462
目录
极术微信服务号
关注极术微信号
实时接收点赞提醒和评论通知
安谋科技学堂公众号
关注安谋科技学堂
实时获取安谋科技及 Arm 教学资源
安谋科技招聘公众号
关注安谋科技招聘
实时获取安谋科技中国职位信息