Navigation

    全志在线开发者论坛

    • Register
    • Login
    • Search
    • Categories
    • Tags
    • 在线文档
    • 社区主页

    飞桨模型在“周易”NPU上的部署(基于R329开发板)

    A Series
    r329
    2
    3
    1835
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • q1215200171
      budbool LV 9 last edited by q1215200171

      本文作者:逍遥
      个人简介:飞桨社区开发者,研究方向为计算机视觉和推理部署

      本教程以搭载安谋科技“周易”(Arm China “Zhouyi”) NPU的“全志R329”开发板为例,介绍如何使用Paddle2ONNX模型转换工具将飞桨模型(以ResNet50为例)转换为ONNX模型,然后通过“周易”的AIPU工具将ONNX模型转换成.bin格式的模型,并在R329上部署。最后我们将会使用“周易”的Demo运行查看ResNet50模型在R329上的运行效果。

      关于“周易” NPU

      “周易”NPU是安谋科技设计的人工智能处理单元IP,采用为神经网络运行及相应的前后处理设计的专用指令集,具有均衡的可编程能力和优化的标准处理能力,融合了多种执行粒度的指令,满足不同人工智能算法需求。“周易”NPU适合各种端(边缘计算)侧人工智能设备,可以广泛应用于安防、智能家居、移动设备、物联网、车载等市场。

      一、准备开发板环境

      在开始部署前需要准备如下软件和硬件来配置开发板环境。

      136483276-61889ceb7bfb7.png
      准备好后即可开始向SD卡中烧录镜像。烧录好镜像的SD卡在插入R329开发板后,即可使用UBS—Type-C数据线连接并操作R329开发板了。详细烧制过程如下所示:

      1.格式化SD工具。使用SD Card Formatter软件格式化SD卡。

      2.png

      2.使用dd命令,烧录镜像到SD卡。

      $:ls /dev/disk*    #通过插拔SD卡,确认待使用SD卡设备号;本教程SD卡号为“/dev/disk4”
      $:diskutil unmountDisk /dev/disk4    #取消待使用SD卡的挂载
      $:sudo dd bs=1m if=Armbian_21.08.0-trunk_Maixsense_bullseye_edge_5.14.0.img of=/dev/disk4    #使用dd命令烧录镜像(dd命令的详细使用方法可以通过输入“参见dd --–help”命令查看)
      $:diskutil eject /dev/disk4    #弹出SD卡
      

      3.插卡开机。将烧录好镜像的SD卡插入R329开发板,使用UBS—Type-C数据线将开发板和Mac电脑连接后,开发板便会自动开机。

      4.在Mac电脑上利用minicom登录开发板,开展后续工作。

      $:minicom -s    # 打开串口配置菜单。如下图所示,在菜单中选择“Serial port setup”后将进入设置界面。修改“A- Serial Device”为开发板串口id:“/dev/tty.usbserial-14110”,再修改“E- Bps/Par/Bits”将波特率设置为:115200 8N1,然后按Esc键退出设置界面,最后选择“Exit”退出。
      $: minicom – D /dev/tty.usbserial-14110 #登录开发板
      

      3.png
      图.串口配置菜单

      4.png
      图.设置界面

      5.配置开发板网络等,熟悉开发板使用。
      利用nmtui命令为开发板配置网络,方便后续使用scp命令将Mac电脑上资料拷贝到开发板上。(注意:使用scp命令时,需要保证本地电脑和开发板在同一个局域网中)参考下方参考链接中“开箱测试”、“上手使用”详细描述,了解配置网络方法,熟悉开发板的使用。

      烧录系统的具体信息请参考:https://wiki.sipeed.com/hardware/zh/maixII/M2A/MaixSense/start/start.html

      二、搭建飞桨开发环境

      1.安装飞桨框架

      根据电脑是否有GPU硬件,从如下命令中选择一条来安装飞桨框架。本教程使用的是CPU版本的安装命令。

      $:pip3 install paddlepaddle --upgrade -i https://mirror.baidu.com/pypi/simple  #安装CPU版本的飞桨框架
      $:pip3 install paddlepaddle-gpu --upgrade -i https://mirror.baidu.com/pypi/simple  #安装GPU版本的飞桨框架
      

      2.安装PaddleClas,并修改处理代码

      $:git clone https://github.com/PaddlePaddle/PaddleClas.git
      $:cd PaddleClas
      $:sudo pip3 install -r requirements.txt   #用于安装必要的安装包。注意:请使用sudo权限,否则包下载完后安装没有权限。
      $:vim ppcls/engine/engine.py    #按照下图修改engine.py中第381行代码。(由于R329配置的屏幕尺寸是224*224,因此需要将Demo的输入图像尺寸设定成固定维度。)
      

      5.png

      安装飞桨框架和PaddleClas具体方法可以参考:https://github.com/PaddlePaddle/PaddleClas/blob/release/2.1/docs/zh_CN/tutorials/install.md

      3.安装Paddle2ONNX

      安装Paddle2ONNX,用于将飞桨模型转换成ONNX格式。具体命令如下:

      $:pip3 install paddle2onnx
      $:pip3 install onnx
      

      安装Paddle2ONNX参考链接:https://github.com/PaddlePaddle/Paddle2ONNX

      三、模型格式转换

      1.飞桨模型转为ONNX格式的模型:

      模型转换包括两步,第1步:导出飞桨模型;第2步:将飞桨模型格式转换成ONNX模型格式。

      第1步:导出飞桨格式模型

      $:cd PaddleClas
      $:wget -P ./cls_pretrain/ https://paddle-imagenet-models-name.bj.bcebos.com/dygraph/legendary_models/ResNet50_vd_pretrained.pdparams   #下载飞桨训练好的分类模型
      $:python3.7 tools/export_model.py -c ppcls/configs/ImageNet/ResNet/ResNet50_vd.yaml -o Global.pretrained_model=./cls_pretrain/ResNet50_vd_pretrained -o Global.save_inference_dir=./deploy/models/class_ResNet50_vd_ImageNet_infer -o Global.device=cpu   #导出飞桨模型,导出格式如下所示。
      

      输出介绍:

      ├── class_ResNet50_vd_ImageNet_infer
      │   ├── inference.pdiparams
      │   ├── inference.pdiparams.info
      │   └── inference.pdmodel
      

      注意:在执行上述命令时,可能存在缺少对应python包的情况,直接使用pip3 install **安装即可。例如作者运行中报错ModuleNotFoundError: No module named‘sklearn',直接pip3 install sklearn即可。

      第2步:飞桨模型格式转ONNX模型格式:

      $:paddle2onnx -m ./deploy/models/class_ResNet50_vd_ImageNet_infer --model_filename inference.pdmodel --params_filename inference.pdiparams -s ./deploy/models/class_ResNet50_vd_ImageNet_infer/paddle2onnx_resnet50_model.onnx --opset_version 11  #参数说明如下所示
      

      参数说明:
      -m:第一步生成.pdmodel、.pdiparams文件路径,相对路径和绝对路径均可。
      -s:最终生成的ONNX模型的保存路径。

      2.ONNX模型转R329支持的.bin格式模型

      第1步:配置转换所需docker环境。(默认系统已经安装docker工具)

      $:sudo docker pull zepan/zhouyi
      $:sudo docker run -i -t zepan/zhouyi  /bin/bash
      $:cd /root/demos/tflite
      

      参考链接:https://aijishu.com/a/1060000000216857

      第2步:准备模型量化校准数据。
      准备模型量化校准数据操作,主要是将图像和对应标签转换成.npy格式,对于模型分类任务,如下命令执行dataset/preprocess_dataset.py即可实现数据准备工作。
      $:python3 dataset/preprocess_dataset.py
      输出dataset/dataset.npy和dataset/label.npy;

      第3步:在docker 中利用AIPU工具进行模型转换

      $:mkdir baidu
      $:cd baidu
      $:docker cp paddle2onnx_resnet50_model.onnx 298d15395846 :/root/demos/tflite/baidu/.  #使用docker cp命令将上一步生成的.onnx格式的模型从Mac电脑拷贝到docker容器中。
      $:vim resnet_50_build_run.cfg    #配置文件完整内容见下方框格。
      $:cd ..
      $:aipubuild baidu/resnet_50_build_run.cfg   #在根目录下生成paddle_onnx_resnet50_50Z2_1104_build.bin模型
      

      注意:
      1.在使用aipubuild命令转换过程中,可能存在无法识别的input/ouput/layer name,是AIPU存在部分特殊字符无法识别的情况,使用node name即可避免该问题。
      2.在模型转换过程中出现negative dimension错误,原因是没有按照二中“2.安装PaddleClas,并修改处理代码”步骤修改shape为“1,3,224,224”造成的。

      resnet_50_build_run.cfg配置文件内容如下:其中[Parser]中input和output可以使用飞桨visualDL工具查看layer name,或者使用node name。

      注:

      [Common]
      mode = build
      
      [Parser]
      model_type = onnx
      input_data_format = NCHW
      model_name = resnet_50
      detection_postprocess = 
      model_domain = image_classification
      input_model = ./baidu/paddle2onnx_resnet50_model.onnx
      input = x
      input_shape = [1, 3, 224, 224]
      output = Softmax_0
      
      [AutoQuantizationTool]
      output_nodes = 
      quantize_method = SYMMETRIC
      ops_per_channel = DepthwiseConv
      reverse_rgb = False
      label_id_offset = 0
      preprocess_mode = normalize
      quant_precision = int8
      calibration_data = ./dataset/dataset.npy 
      calibration_label = ./dataset/label.npy 
      
      [GBuilder]
      output = paddle_onnx_resnet50_50Z2_1104_build.bin
      profile=True
      target = Z1_0701
      

      四、运行Demo

      1.下载官方Demo

      通过下方链接下载官方Demo解压,并使用scp命令拷贝到开发板。该官方Demo已经完成了基于R329开发版的交叉编译工作,可直接在开发板上运行
      官方Demo下载链接:

      https://dl.sipeed.com/shareURL/MaixII/MaixII-A/example
      如需对Demo工程或者其它AIPU工程进行交叉编译,参见下方链接。
      交叉编译参考链接:https://aijishu.com/a/1060000000224083

      2.运行Demo

      $:scp -r zhouyi_test root@*.*.*.*:/root    #4个*为开发板IP,需要保证开发板和Mac电脑在同一个局域网
      $:run.sh     #运行Demo,使用官方自带的aipu.bin模型做推理
      

      命令行输出结果如下图所示:

      8.png
      官方自带的aipu.bin模型推理效果如下图,该模型在R329上推理速度约为在20fps。

      6.png

      3.运行飞桨模型转换Demo
      将三中生成的paddle_onnx_resnet50_50Z2_1104_build.bin模型拷贝到开发板上,替换Demo中的模型,运行查看效果。

      $:scp paddle_onnx_resnet50_50Z2_1104_build.bin root@*.*.*.*:/root/ zhouyi_test
      $:./zhouyi_cam paddle_onnx_resnet50_50Z2_1104_builds.bin unsigned
      

      运行效果如下:

      7.png

      ResnNet50原生模型在R329上推理速度约为7fps。

      4.Demo函数简单说明。
      该Demo教程主要程序在main.cpp函数中实现,通过OpenCV循环读取摄像头数据,送给推理引擎,对采集到的图像进行分类。其中推理引擎使用周易NPU的相关接口。

      至此,利用Paddle2ONNX和周易NPU工具,即可完成分类模型的转换及部署工作。大家可结合自己具体的业务需求,借助上述步骤完成模型转换,并利用周易NPU的相关API完成推理代码,交叉编译后即可放到板子上运行。

      来源:飞桨PaddlePaddle公众号

      1 Reply Last reply Reply Quote Share 0
      • C
        caozilong LV 5 last edited by

        @q1215200171 你好,看到你最后两步使用了两个不同的模型,而无需修改后处理代码,所以很好奇,想请教你,这里的用的两个算法模型是同一个么?如果不是,为何resetnet和aipu.bin无缝替换却不用修改后处理的?
        谢谢指导~!

        q1215200171 1 Reply Last reply Reply Quote Share 0
        • q1215200171
          budbool LV 9 @caozilong last edited by

          @caozilong 这篇是转载的,原文在这:https://mp.weixin.qq.com/s/RRV3tziWjWFoAb3jg5lIFg

          1 Reply Last reply Reply Quote Share 0
          • 1 / 1
          • First post
            Last post

          Copyright © 2024 深圳全志在线有限公司 粤ICP备2021084185号 粤公网安备44030502007680号

          行为准则 | 用户协议 | 隐私权政策