瑞芯微 rk3568的npu使用,部署unet网络

2023-12-19

rk3568-1.6.0

1.在任一个ubuntu系统上安装RKNN-Toolkit2

1.1 下载

新建 Projects 文件夹
mkdir Projects
进入该目录
cd Projects
下载 RKNN-Toolkit2 仓库
git clone https://github.com/airockchip/rknn-toolkit2.git --depth 1
下载 RKNN Model Zoo 仓库
git clone https://github.com/airockchip/rknn_model_zoo.git --depth 1
注意:
1.参数 --depth 1 表示只克隆最近一次 commit
2.如果遇到 git clone 失败的情况,也可以直接在 github 中下载压缩包到本地,然后解压至该目录

1.2 安装

首先安装依赖库
pip install -r doc/requirements_cpxx.txt

然后安装rknn-toolkit2
pip install packages/rknn_toolkit2-x.x.x+xxxxxxxx-cpxx-cpxxlinux_x86_64.whl

验证安装是否成功,进入 Python 交互模式
python
然后
from rknn.api import RKNN

2.在机器端(板端)查看 RKNPU2的驱动

dmesg | grep -i rknp

在这里插入图片描述

uname -a查看系统架构

3.RKNN使用说明

3.1 模型转换

RKNN-Toolkit2 提供了丰富的功能,包括模型转换、性能分析、部署调试等。本节将重点介绍 RKNN-Toolkit2 的模型转换功能。模型转换是 RKNN-Toolkit2 的核心功能之一,它允许用户将各种深度学习模型从不同的框架转换为 RKNN 格式以在 RKNPU 上运行,用户可以参考模型转换流程图以帮助理解如何进行模型转换。
在这里插入图片描述

支持pytorch , tensorflow , caffe, onnx 模型转换为rknn格式。

a. RHKNN初始化和释放

rknn = RKNN(verbose=True, verbose_file=‘./mobilenet_build.log’)
rknn.release()

b. RKNN config
rknn.config(
    mean_values=[[103.94, 116.78, 123.68]],
    std_values=[[58.82, 58.82, 58.82]],
    quant_img_RGB2BGR=False,
    target_platform='rk3566')

mean_values 和 std_values 用于设置输入的均值和归一化值。这些值在量化过程中使用,
且 C API 推理阶段图片不需再做均值和归一化值减小布署耗时。
因此这里需要注意,这些值不仅是归一化用途,还要用在量化上。

quant_img_RGB2BGR 用于控制量化时加载量化校正图像时是否需要先进行 RGB 到BGR 的转换,默认值为 False。该配置只在量化数据集时生效,实际部署模型时,模型 推 理 阶 段 不 会 生 效 , 需 要 用 户 在 输 入 前 处 理 里 预 先 处 理 好 。 注 :
quant_img_RGB2BGR = True 时 模 型 的 推 理 顺 序 为 先 做 RGB2BGR 转 换 再 做
mean_values 和 std_values 操作,详细注意事项请见 10.3 章节

target_platform 用于指定 RKNN 模型的目标平台,支持 RK3568、RK3566、RK3562、
RK3588、RV1106 和 RV1103

quantized_algorithm 用于指定计算每一层的量化参数时采用的量化算法,可以选择
normal、mmse 或 kl_divergence,默认算法为 normal,详细说明见 3.1.7、6.1 和 6.2 章

quantized_method 支持 layer 或 channel,用于每层的权重是否共享参数,默认为
channel,详细说明见 3.1.7、6.1 和 6.2 章节。

optimization_level 通过修改模型优化等级,可以关掉部分或全部模型转换过程中使用
到的优化规则。该参数的默认值为 3,打开所有优化选项,值为 2 或 1 时关闭一部分
可能会对部分模型精度产生影响的优化选项,值为 0 时关闭所有优化选项。

这一部分很关键,而且转换后的模型和C代码也有很大关系。

c. 加载模型

ret = rknn.load_onnx(model=‘./arcface.onnx’)

d. 构建模型

用户加载原始模型后,下一步就是通过 rknn.build()接口构建 RKNN 模型。构建模型时,
用户可以选择是否进行量化,量化助于减小模型的大小和提高在 RKNPU 上的性能。
rknn.build()接口参数如下:

 do_quantization 参数控制是否对模型进行量化,建议设置为 True。
 dataset 参数用于提供用于量化校准的数据集,数据集的格式是文本文件。
dataset.txt 示例: ./imgs/ILSVRC2012_val_00000665.JPEG
./imgs/ILSVRC2012_val_00001123.JPEG
./imgs/ILSVRC2012_val_00001129.JPEG
./imgs/ILSVRC2012_val_00001284.JPEG
./imgs/ILSVRC2012_val_00003026.JPEG
./imgs/ILSVRC2012_val_00005276.JPEG
示例代码:
ret = rknn.build(do_quantization=True, dataset=‘./dataset.txt’)

e. 导出模型

rknn.export_rknn()接口将RKNN 模型保存为一个文件(.rknn 后缀),以便后续模型的部署。rknn.export_rknn()接口参数如下:

export_path 导出模型文件的路径。
cpp_gen_cfg 可以选择是否生成 C++ 部署示例。
ret = rknn.export_rknn(export_path=‘./mobilenet_v1.rknn’)

f.转换工具

在这里插入图片描述

3.2 python 代码示例导出模型, 下载的仓库里面优很多示例可以参考

import numpy as np
import cv2
from rknn.api import RKNN
import os


def export_pytorch_model():
    import torch
    import torchvision.models as models
    net = models.quantization.resnet18(pretrained=True, quantize=True)
    net.eval()
    trace_model = torch.jit.trace(net, torch.Tensor(1, 3, 224, 224))
    trace_model.save('./resnet18_i8.pt')

def show_outputs(output):
    index = sorted(range(len(output)), key=lambda k : output[k], reverse=True)
    fp = open('./labels.txt', 'r')
    labels = fp.readlines()
    top5_str = 'resnet18\n-----TOP 5-----\n'
    for i in range(5):
        value = output[index[i]]
        if value > 0:
            topi = '[{:>3d}] score:{:.6f} class:"{}"\n'.format(index[i], value, labels[index[i]].strip().split(':')[-1])
        else:
            topi = '[ -1]: 0.0\n'
        top5_str += topi
    print(top5_str.strip())


def show_perfs(perfs):
    perfs = 'perfs: {}\n'.format(perfs)
    print(perfs)


def softmax(x):
    return np.exp(x)/sum(np.exp(x))

def torch_version():
    import torch
    torch_ver = torch.__version__.split('.')
    torch_ver[2] = torch_ver[2].split('+')[0]
    return [int(v) for v in torch_ver]

if __name__ == '__main__':

    if torch_version() < [1, 9, 0]:
        import torch
        print("Your torch version is '{}', in order to better support the Quantization Aware Training (QAT) model,\n"
              "Please update the torch version to '1.9.0' or higher!".format(torch.__version__))
        exit(0)

    model = './resnet18_i8.pt'
    if not os.path.exists(model):
        export_pytorch_model()

    input_size_list = [[1, 3, 224, 224]]

    # Create RKNN object
    rknn = RKNN(verbose=True)

    # Pre-process config
    print('--> Config model')
    rknn.config(mean_values=[123.675, 116.28, 103.53], std_values=[58.395, 58.395, 58.395], target_platform='rk3566')
    print('done')

    # Load model
    print('--> Loading model')
    ret = rknn.load_pytorch(model=model, input_size_list=input_size_list)
    if ret != 0:
        print('Load model failed!')
        exit(ret)
    print('done')

    # Build model
    print('--> Building model')
    ret = rknn.build(do_quantization=False)
    if ret != 0:
        print('Build model failed!')
        exit(ret)
    print('done')

    # Export rknn model
    print('--> Export rknn model')
    ret = rknn.export_rknn('./resnet_18.rknn')
    if ret != 0:
        print('Export rknn model failed!')
        exit(ret)
    print('done')

    # Set inputs
    img = cv2.imread('./space_shuttle_224.jpg')
    img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
    img = np.expand_dims(img, 0)

    # Init runtime environment
    print('--> Init runtime environment')
    ret = rknn.init_runtime()
    if ret != 0:
        print('Init runtime environment failed!')
        exit(ret)
    print('done')

    # Inference
    print('--> Running model')
    outputs = rknn.inference(inputs=[img], data_format=['nhwc'])
    np.save('./pytorch_resnet18_qat_0.npy', outputs[0])
    show_outputs(softmax(np.array(outputs[0][0])))
    print('done')

    rknn.release()

4.c++部署

比如降噪模型,输入是 uint8图片, 利用零拷贝 api
在这里插入图片描述

在这里插入图片描述

因此 在利用python代码进行模型格式转换的时候设置了 mean = [0,0,0], std=[255,255,255]相当于做了归一化,且自动在c++模型推理时应用, 包括归一化,量化,反量化等,c++代码里不需要再加入归一化相关代码。

因此如下图,输入的 uint8的image data, 然后归一化到0-1,因为设置了 outputs[0].want_float=1,然后model infer 得到 float data,范围 0-1. 以上全在 npu中进行,也就是全在rknn_run中进行,因为使用的时零拷贝 api.

最后cpu再 nchw -> hwc, 0-1 -> 0-255 uint8, 即可保存图像。
在这里插入图片描述

buildxxx.sh 中需要设置 gcc,g++交叉编译器, 注意 CMakeLists.txt,这样编译的程序可以在 rk3568平台使用
在这里插入图片描述

5.其他待研究

量化
多核
效果评估,
时间和空间评估
提高推理速度

等内容需要进一步测试。

以上内容在仓库 /doc/xx.pdf 中有详细的官方说明,尽量参考官方说明。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

瑞芯微 rk3568的npu使用,部署unet网络 的相关文章

随机推荐

  • C# DataTable 生成Excel 和 CSV文件

    EXCEL using NPOI SS UserModel using NPOI XSSF UserModel using System Data using System IO public class ExcelService publ
  • 安卓自动化 APP:轻松关闭任意开屏广告 | 开源日报 No.116

    gkd kit gkd Stars 8 7k License GPL 3 0 基于无障碍 高级选择器 订阅规则的自定义屏幕点击 APP 主要功能包括实现跳过任意开屏广告 关闭应用内部弹窗广告以及一些快捷操作 如微信电脑登录自动同意和领取红包
  • 一键生成精美电子书:让阅读更加惬意 | 开源日报 No.115

    keyvanakbary learning notes Stars 4 0k License NOASSERTION 这个项目是一个学习笔记的仓库 作者在这里记录了自己阅读书籍 观看讲座 研究文章和喜爱论文时所做的简要总结 主要功能包括提供
  • 服务器安全最常见的5大威胁!

    服务器安全是将服务器的软件和硬件保护起来 以防止黑客对服务器构架和数据进行未经授权的访问及操作 也是网络安全体系中的重要组成部分 本文主要为大家介绍一下最常见的影响服务器安全的5大因素 一起来了解一下 1 电子邮件欺骗 电子邮件欺骗是一种网
  • 网络安全岗位面试题

    前言 介绍了网络安全岗位常见的面试题 仅供参考 一 常识部分 1 Linux服务器种用户关键信息存储在那个文件中 启动 停止 重启 开机自启mysql服务命令 如何查找 etc test txt文件中 password 关键字信息 如何精确
  • SpringCloud有什么优势

    SpringCloud是一个基于Spring Boot的微服务框架 它提供了许多工具和库 可以帮助开发者更容易地构建和部署分布式系统 以下是SpringCloud的一些主要优势 易于集成 SpringCloud提供了丰富的工具和库 可以帮助
  • 【思扬赠书 | 第1期】教你如何一站式解决OpenCV工程化开发痛点

    写在前面参与规则 参与方式 关注博主 点赞 收藏 评论 任意评论 每人最多评论三次 本次送书1 3本 取决于阅读量 阅读量越多 送的越多 思扬赠书 第1期活动开始了 机器视觉 缺陷检测 工业上常见缺陷检测方法 方法一 基于简单二值图像分析
  • 【华为OD】给定一个整数数组nums,请你在该数组中找出两个数,使得这两个数 的和的绝对值abs(nums[x] + nums[y])为最小值并按从小到大返回这 两个数以及它们和的绝对值

    题目描述 给定一个整数数组nums 请你在该数组中找出两个数 使得这两个数 的和的绝对值abs nums x nums y 为最小值并按从小到大返回这 两个数以及它们和的绝对值 每种输入只会对应一个答案 数组中同一 个元素不能使用两遍 输入
  • 2023年30米分辨率土地利用遥感监测数据

    改革开放以来 中国经济的快速发展对土地利用模式产生了深刻的影响 同时 中国又具有复杂的自然环境背景和广阔的陆地面积 其土地利用变化不仅对国家发展 也对全球环境变化产生了深刻的影响 为了恢复和重建我国土地利用变化的现代过程 更好地预测 预报土
  • 请解释Nginx代理中的正向代理和反向代理

    正向代理 Forward Proxy 和反向代理 Reverse Proxy 是Nginx代理模式中的两种主要类型 正向代理 Forward Proxy 是一种代理服务器 它允许客户端 用户 通过它访问远程服务器 在这种模式下 客户端发送的
  • 讲解module ‘tensorflow‘ has no attribute ‘Session‘

    目录 讲解module tensorflow has no attribute Session 错误原因 解决方案 总结 讲解module tensorflow has no attribute Session 在使用TensorFlow进
  • 广州软件第三方测试报告需要盖CNAS\CMA吗?怎么取费?

    CNAS CMA资质 1 CMA资质标识 根据报告接收方要求 第三方测试报告上是否加盖CMA标识 第三方测试机构执行标准为GB T25000 51和GB T25000 10标准 2 CNAS标识 ILAC MRA国际互认标识 通常第三方测试
  • SDN前沿技术【SMaRT-5G项目】

    目录 引言 节能方法 快速了解投资回报率 ROI ONF SMaRT 5G Initiative RAN 能量优化 方法 电池开 关方法 MIMO 睡眠和 RF 通道打开 关闭 高级睡眠模式 ASM RAN节能解决方案的
  • 【最新】2023年30米分辨率土地利用遥感监测数据

    改革开放以来 中国经济的快速发展对土地利用模式产生了深刻的影响 同时 中国又具有复杂的自然环境背景和广阔的陆地面积 其土地利用变化不仅对国家发展 也对全球环境变化产生了深刻的影响 为了恢复和重建我国土地利用变化的现代过程 更好地预测 预报土
  • Dubbo 注册中心挂了,consumer 还能不能调用 provider?

    在 Dubbo 中 如果注册中心 如 Zookeeper Nacos 等 出现故障 消费者 consumer 仍然可以调用提供者 provider 的服务 但需要满足以下条件 消费者和提供者之间的通信配置正确 消费者需要知道提供者的地址和端
  • Clion远程开发无法解析头文件,但是代码可以正常编译运行

    问题 当我在使用Clion进行远程开发时 需要用到Opencv库 我首先在CMakeLists txt添加了opencv库 如下 find package OpenCV REQUIRED INCLUDE DIRECTORIES OpenCV
  • 天眼情报分析——问题收集

    分为几类 一 代码实现问题 1 将两个字符串交替合并 这段代码错在逻辑错误 由于w1此时小于w2剩下的部分应该是w2而不是w1 我分析这位星友错误的原因应该是对底层逻辑实现没有深入理解 学到了不少 多多交流是好事 二 如何使用GitHub
  • NFS原理详解

    一 NFS介绍 1 什么是NFS 它的主要功能是通过网络让不同的机器系统之间可以彼此共享文件和目录 NFS服务器可以允许NFS客户端将远端NFS服务器端的共享目录挂载到本地的NFS客户端中 在本地的NFS客户端的机器看来 NFS服务器端共享
  • Java是怎么运行起来的?深入理解Java虚拟机

    介绍Java的工作原理和JVM的内部结构 微信搜索关注 Java学研大本营 Java虚拟机 JVM 是一个运行时环境 可以执行用Java编程语言编写的程序 Java语言是一种高级语言 它通过抽象和封装的机制 让开发者可以专注于业务逻辑和功能
  • 瑞芯微 rk3568的npu使用,部署unet网络

    文章目录 rk3568 1 6 0 1 在任一个ubuntu系统上安装RKNN Toolkit2 1 1 下载 1 2 安装 2 在机器端 板端 查看 RKNPU2的驱动 3 RKNN使用说明