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