在Ubuntu 24.10下将ONNX模型转换RKNN

道锋潜鳞
2024-12-15 / 0 评论 / 93 阅读 / 正在检测是否收录...

1. RKNPU 简介

NPU(Nerual Processing Unit)是一种专门用于加速神经网络计算的处理器。为了满足人工智能的需求,瑞芯微逐渐将NPU集成到其处理器中,这种内置于瑞芯微处理器的NPU被称为RKNPU。LuckFox Pico 系列开发板搭载瑞芯微 RV1103/RV1106 芯片,内置瑞芯微自研第4代NPU。该NPU具有高运算精度,支持int4、int8、int16混合量化。RKNPU4.0被划分为RKNPU2,因此要使用RKNPU2的SDK和工具套件。


2. RKNN-Toolkit2 简介

RKNN-Toolkit2 工具在 PC 平台上提供 C 或 Python 接口,简化模型的部署和运行。用户可以通过该工具轻松完成以下功能:模型转换、量化、推理、性能和内存评估、量化精度分析以及模型加密。RKNN 软件栈可以帮助用户快速的将 AI 模型部署到 Rockchip 芯片。整体的框架如下:

202412151315077129.webp

为了使用 RKNPU,用户需要首先在计算机上运行 RKNN-Toolkit2 工具,将训练好的模型转换为 RKNN 格式模型,之后使用 RKNN C API 或 Python API 在开发板上进行部署。本节介绍用户如何快速在 Luckfox Pico 系列板子上使用 RKNPU。


3. RKNN-Toolkit2 安装(PC ubuntu22.04)

3.1 本地安装

  1. 环境要求

    操作系统版本Ubuntu18.04(x64)Ubuntu20.04(x64)Ubuntu22.04(x64)
    Python版本3.6/3.73.8/3.93.10/3.11
  2. 下载rknn-toolkit2

    git clone https://github.com/rockchip-linux/rknn-toolkit2
  3. 安装python环境

    sudo apt-get update
    sudo apt-get install python3 python3-dev python3-pip
    sudo apt-get install libxslt1-dev zlib1g zlib1g-dev libglib2.0-0 libsm6 libgl1-mesa-glx libprotobuf-dev gcc
  4. 安装RKNN-ToolKit2依赖包

    pip3 install -r rknn-toolkit2/packages/requirements_cpxx-1.6.0.txt
    
    # such as:
    # pip3 install -r rknn-toolkit2/packages/requirements_cp310-1.6.0.txt

    根据不同的Python版本,选择安装对应的依赖包:

    Python版本RKNN-Toolkit2依赖包
    3.6requirements_cp36-1.6.0.txt
    3.7requirements_cp37-1.6.0.txt
    3.8requirements_cp38-1.6.0.txt
    3.9requirements_cp39-1.6.0.txt
    3.10requirements_cp310-1.6.0.txt
    3.11requirements_cp311-1.6.0.txt
  5. 安装RKNN-ToolKit2

    pip3 install rknn-toolkit2/packages/rknn_toolkit2-x.x.x+xxxxxxxx-cpxx-cpxx-linux_x86_64.whl
    
    # such as:
    # pip3 install rknn-toolkit2/packages/rknn_toolkit2-1.6.0+81f21f4d-cp310-cp310-linux_x86_64.whl

    包名格式为:
    rknn_toolkit2-{版本号}+{commit 号}-cp{Python版本}-cp{Python版本}-linux_x86_64.whl

    若执行以下命令没有报错,则安装成功:

    python3
    >> from rknn.api import RKNN

    202412151316433991.webp


3.2 Conda 安装

推荐使用 Conda 创建 python 虚拟环境,可以在多个应用场景下灵活切换,避免出现版本不匹配而无法运行等问题。实例在 AI 模型的训练和模型的转换过程中需要使用不同的 python 虚拟环境。

3.2.1 安装 miniconda 工具

  1. 检查是否安装了miniconda 或其他 conda 工具

    conda --version
  2. 下载安装包

    wget https://mirrors.tuna.tsinghua.edu.cn/anaconda/miniconda/Miniconda3-4.6.14-Linux-x86_64.sh
  3. 安装miniconda

    chmod 777 Miniconda3-4.6.14-Linux-x86_64.sh
    bash Miniconda3-4.6.14-Linux-x86_64.sh
    • 注意:miniconda 的安装包必须使用 chmod 777 来设置权限。
    • 执行安装后输入回车阅读许可条款,输入 yes 接受许可继续安装,在家目录下创建 miniconda 文件夹。
  4. 在计算机的终端窗口,进入 Conda base环境

    source ~/miniconda3/bin/activate
    • 成功后,命令行提示符会变成 (base) xxx@xxx:~$
  5. 如果你想在每次打开终端时都自动激活 Miniconda 环境,可以将激活命令添加到你的 shell 配置文件中:

    vim nano ~/.bashrc
    
    #在文件末尾添加以下行:
    source ~/miniconda3/bin/activate
    
    #退出conda环境
    conda deactivate

3.2.2 创建 RKNN-Toolkit2 Conda 环境

  1. 创建 RKNN-Toolkit2 开发 Conda 环境-n 参数表示环境名称,指定 python 版本为3.10(建议版本):

    conda create -n RKNN-Toolkit2 python=3.10
  2. 进入 RKNN-Toolkit2 Conda 环境

    conda activate RKNN-Toolkit2
  3. 验证 Python 版本是否使用正确

    python --version
  4. 获取 RKNN-Toolkit2 安装包

    git clone https://github.com/rockchip-linux/rknn-toolkit2.git
  5. 进入文件夹

    cd rknn-toolkit2
  6. 安装 RKNN-Toolkit2 相关的依赖库 (以 python3.10 为例):

    pip install tf-estimator-nightly==2.8.0.dev2021122109
    pip install -r rknn-toolkit2/packages/requirements_cp310-1.6.0.txt -i https://pypi.mirrors.ustc.edu.cn/simple/
  7. 安装 RKNN-Toolkit2

    pip install rknn-toolkit2/packages/rknn_toolkit2-1.6.0+81f21f4d-cp310-cp310-linux_x86_64.whl
  8. 验证是否安装成功

    python
    >>> from rknn.api import RKNN

    如果没有报错说明安装成功。
    202412151316433991.webp


4. 模型部署

4.1 什么是 ONNX

ONNX(Open Neural Network Exchange),开放神经网络交换,是一种模型IR,用于在各种深度学习训练和推理框架转换的一个中间表示格式,支持多种深度学习框架。将模型转换为 ONNX 格式后,可以更容易地在不同的深度学习框架中进行部署和推理,而无需重新训练模型。

4.2 获取 ONNX 模型

ONNX 文件不仅储存了神经网络模型的权重,也储存了模型的结构信息以及网络中每一层的输入输出等信息,可以使用 Netron 中进行查看。

4.2.1 转换自定义 YOLOv5 模型为 ONNX 格式

  1. 进入yolov5项目目录:

    cd yolov5
  2. 使用以下命令导出自定义权重的 ONNX 文件:

    python export.py --rknpu --weight runs/train/exp/weight/s-150b.pt

    202412151332048101.webp

    • --weights 指定自定义模型的权重路径(.pt 文件)。

4.3 调整 ONNX 模型

使用 Netron 工具查看 ONNX 模型的结构,确定是否存在 RV1103/RV1106 暂时无法支持的操作符。参考手册 RKNN支持操作列表
如果不支持的操作符位于模型的最后几层,可以考虑使用 CPU 实现。

202412151319274895.webp


5. Luckfox RKNN 应用示例

5.1 转换为 RKNN 模型

5.1.1 模型转换

  1. 源码获取

    git clone https://github.com/LuckfoxTECH/luckfox_pico_rknn_example.git
  2. 进入 scripts/luckfox_onnx_to_rknn 目录

    cd luckfox_pico_rknn_example/scripts/luckfox_onnx_to_rknn
  3. 文件结构
    202412151328093851.webp
  4. 进入RKNN-Toolkit2 Conda 开发环境

    conda activate RKNN-Toolkit2
    • 注意: 如果没有进入正确的 Conda 虚拟环境会导致模型转换失败。
  5. 模型转换

    cd convert
    python convert.py <onnx模型地址> <训练集地址> <导出模型地址> <模型类型(Retinaface等)>
  1. 准备数据集

    如果你已有 YOLOv5 数据集格式,只需提取图片路径。可以通过以下脚本生成路径文件:

    import os
    
    image_folder = "dataset/images/train"
    output_file = "retinaface_dataset.txt"
    valid_extensions = [".jpg", ".jpeg", ".png"]
    
    image_paths = []
    for root, dirs, files in os.walk(image_folder):
     for file in files:
         if os.path.splitext(file)[1].lower() in valid_extensions:
             image_paths.append(os.path.join(root, file))
    
    with open(output_file, "w") as f:
     for path in image_paths:
         f.write(path + "\n")
    
    print(f"路径文件已生成:{output_file}")
    
    
  2. 示例

    convert.py ../model/retinaface.onnx ../dataset/retinaface_dataset.txt ../model/retinaface.rknn Retinaface
    • onnx 模型地址:例如 luckfox_onnx_to_rknn/model 中的模型。
    • 训练集地址:txt 文件中列举少量图片。
    • 导出模型地址:后缀 .rknn
    • 模型类型:Retinaface、Facenet、Yolov5。

0

评论 (0)

取消