前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >RK35XX NPU开发指南

RK35XX NPU开发指南

作者头像
算法之名
发布2023-10-29 14:08:40
3200
发布2023-10-29 14:08:40
举报
文章被收录于专栏:算法之名算法之名

模拟环境开发

这里的模拟环境就是在PC上去模拟开发板的开发、调试,跟开发板本身没有关系。我这里的操作系统环境为Ubuntu 20.04。

首先安装Anaconda,具体操作请参考乌班图安装Pytorch、Tensorflow Cuda环境 。之后创建Python 3.8的环境。

代码语言:javascript
复制
conda create -n py38 python=3.8.0
source activate
conda activate py38

下载RK35XX开发板的NPU SDK,下载地址https://github.com/rockchip-linux/rknn-toolkit2

他这里有很多个版本,我使用的是1.5.2的。

安装相关依赖

代码语言:javascript
复制
sudo apt-get install libxslt1-dev zlib1g-dev libglib2.0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc

 安装Python组件

代码语言:javascript
复制
cd RK_NPU_SDK/RK_NPU_SDK_1.5.2/release
unzip rknn-toolkit2-1.5.2.zip
cd rknn-toolkit2-1.5.2/doc
pip install -r requirements_cp38-1.5.2.txt -i https://mirror.baidu.com/pypi/simple

安装NPU SDK Python组件

代码语言:javascript
复制
cd ../packages
pip install rknn_toolkit2-1.5.2+b642f30c-cp38-cp38-linux_x86_64.whl

安装PyCharm。

HelloWorld

这里我们将一个Pytorch的模型参数转化为RKNN的专用模型。首先将examples/pytorch/resnet18下面的dataset.txt以及space_shuttle_224.jpg拷贝到PyCharm项目下。

拉取模型参数

代码语言:javascript
复制
import torch
from torchvision import models

if __name__ == '__main__':
    
    net = models.resnet18(pretrained=True)
    net.eval()
    trace_model = torch.jit.trace(net, torch.Tensor(1, 3, 224, 224))
    trace_model.save('./resnet18.pt')

转化

代码语言:javascript
复制
from rknn.api import RKNN

if __name__ == '__main__':

    rknn = RKNN(verbose=True, verbose_file='log.txt')

    rknn.config(
        mean_values=[[123.675, 116.28, 103.53]],
        std_values=[[58.395, 58.395, 58.395]],
        target_platform='rk3568'
    )

    rknn.load_pytorch(model='./resnet18.pt', input_size_list=[[1, 3, 224, 224]])
    rknn.build(do_quantization=True, dataset='dataset.txt', rknn_batch_size=1)
    rknn.export_rknn('resnet18.rknn')

    rknn.release()

运行结果

模型推理

代码语言:javascript
复制
from rknn.api import RKNN
import cv2
import torch

if __name__ == '__main__':

    rknn = RKNN(verbose=True, verbose_file='log.txt')

    rknn.config(
        mean_values=[[123.675, 116.28, 103.53]],
        std_values=[[58.395, 58.395, 58.395]],
        target_platform='rk3568'
    )

    rknn.load_pytorch(model='./resnet18.pt', input_size_list=[[1, 3, 224, 224]])
    rknn.build(do_quantization=True, dataset='dataset.txt', rknn_batch_size=1)
    rknn.export_rknn('resnet18.rknn')

    rknn.init_runtime(
        target=None,
        target_sub_class=None,
        device_id=None,
        perf_debug=False,
        eval_mem=False,
        async_mode=False,
        core_mask=RKNN.NPU_CORE_AUTO
    )

    img = cv2.imread('./space_shuttle_224.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

    outputs = rknn.inference(inputs=[img], data_format='nhwc')
    print(torch.argmax(torch.softmax(torch.Tensor(outputs[0][0]), dim=0)))

    rknn.release()

运行结果

代码语言:javascript
复制
tensor(812)

我们推理的图片为

由于ResNet18模型参数是从ImgNet训练而来的,这是一个1000分类的数据集,812号对应的标签为

故而这里的推理结果是正确的。这里需要说明的是在模拟环境中,我们是不能直接使用resnet18.rknn来推理的,该模型文件只能用于真实开发板中的推理。

精度分析

代码语言:javascript
复制
from rknn.api import RKNN

if __name__ == '__main__':

    rknn = RKNN(verbose=True, verbose_file='log.txt')

    rknn.config(
        mean_values=[[123.675, 116.28, 103.53]],
        std_values=[[58.395, 58.395, 58.395]],
        target_platform='rk3568'
    )

    rknn.load_pytorch(model='./resnet18.pt', input_size_list=[[1, 3, 224, 224]])
    rknn.build(do_quantization=True, dataset='dataset.txt', rknn_batch_size=1)
    rknn.export_rknn('resnet18.rknn')

    rknn.accuracy_analysis(
        inputs=["space_shuttle_224.jpg"],
        output_dir="snapshot",
        target=None,
        device_id=None
    )
    rknn.release()

运行结果

代码语言:javascript
复制
layer_name                     simulator_error        
                              entire    single        
------------------------------------------------------
[Input] x.3                  1.000000  1.000000       
[exDataConvert] x.3_int8     0.999987  0.999987       
[Conv] input.11              
[Relu] 82                    0.999908  0.999908       
[MaxPool] input.13           0.999946  0.999982       
[Conv] input.19              
[Relu] 120                   0.999657  0.999785       
[Conv] out.3                 0.999644  0.999964       
[Add] input.25               
[Relu] 142                   0.999784  0.999965       
[Conv] input.29              
[Relu] 169                   0.999179  0.999821       
[Conv] out.5                 0.998712  0.999934       
[Add] input.33               
[Relu] 191                   0.999385  0.999959       
[Conv] input.37              
[Relu] 222                   0.998591  0.999908       
[Conv] out.7                 0.998813  0.999929       
[Conv] identity.2            0.998559  0.999720       
[Add] input.43               
[Relu] 267                   0.998864  0.999918       
[Conv] input.47              
[Relu] 294                   0.998188  0.999869       
[Conv] out.9                 0.998970  0.999969       
[Add] input.51               
[Relu] 316                   0.998615  0.999916       
[Conv] input.55              
[Relu] 347                   0.998649  0.999901       
[Conv] out.11                0.998943  0.999943       
[Conv] identity.4            0.999071  0.999812       
[Add] input.61               
[Relu] 392                   0.998877  0.999931       
[Conv] input.65              
[Relu] 419                   0.998469  0.999886       
[Conv] out.13                0.999253  0.999970       
[Add] input.69               
[Relu] 441                   0.998728  0.999915       
[Conv] input.8               
[Relu] 472                   0.998261  0.999917       
[Conv] out.2                 0.999045  0.999963       
[Conv] identity.1            0.998884  0.999855       
[Add] input.12               
[Relu] 517                   0.998270  0.999901       
[Conv] input.7               
[Relu] 544                   0.998046  0.999916       
[Conv] out.1                 0.998175  0.999964       
[Add] input.3                
[Relu] 566                   0.998509  0.999976       
[Conv] x.1                   0.999332  0.999990       
[Conv] 572_conv              0.999125  0.999914       
[Reshape] 572_int8           0.999125  0.999933       
[exDataConvert] 572          0.999125  0.999933       
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-29,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 模拟环境开发
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档