RK35XX NPU开发指南

2023-10-29 14:08:40 浏览数 (2)

模拟环境开发

这里的模拟环境就是在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       

0 人点赞