Rockchip RKNN モデル変換と PC シミュレーション

1 モデル変換

特記事項: 以下の内容は、rknn 公式 Web サイトの文書 Rockchip_User_Guide_RKNN_Toolkit2_CN-1.3.0.pdf から参照されています。侵害がある場合は、削除するようにお知らせください。

完全なコードは github にあります。コード

1.1 ツールチェーン(RKNN-Toolkit2)

  RKNN ツールチェーンには「pip install によるインストール」と「Docker イメージによるインストール」の 2 つの方法が用意されていますが、「Docker イメージによるインストール」を推奨します。具体的なインストール方法については、提供されている公式ドキュメントを参照してください。ツールチェーン Baidu クラウド ディスクのダウンロード パス、抽出コード: rknn

  RKNN-Toolkit2 は現在、Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch およびその他のモデルの読み込みと変換をサポートしています。これらのモデルは読み込み時に対応するインターフェイスを呼び出す必要があります。以下はこれらのインターフェイスの詳細な説明です。公式ツールチェーン: https://github.com/rockchip-linux/rknn-toolkit2

1.2 Docker イメージによるインストール

# 镜像 load
docker load -i rknn-toolkit2-1.3.0-cp36-docker.tar.gz
# 启动镜像
sudo docker run -v `pwd`/rknn_model_convert:/data -it rknn-toolkit2:1.3.0-cp36 /bin/bash

ブートイメージの例

1.3 モデル変換

1) モデルの初期化

# 将详细的日志信息输出到屏幕,并写到 mobilenet_build.log 文件中
rknn = RKNN(verbose=True, verbose_file='./mobilenet_build.log') 

# 只在屏幕打印详细的日志信息 
rknn = RKNN(verbose=True)

2) さまざまなパラメータを設定する

# mean_values 通道均值
# std_values 方差, rknn是除以方差
# quant_img_RGB2BGR 该参数是将量化图片格式又RGB转换为BGR,通常caffe训练的模型需要这个操作
# quantized_algorithm 量化算法,normal 和 mmse, 不写该参数默认值为 normal, 其中:normal 量化速度快(推荐量化数据量一般为 20-100 张左右,更多的数据量下精度未必会有进一步提升), mmse 量化速度慢(推荐量化数据量一般为 20-50 张左右), 精度稍微比normal保持的好
# quantized_method 量化方法 channel, layer可选; layer:每层的 weight 只有一套量化参数; channel:每层的 weight 的每个通道都有一套量化参数。默认使用channel
# target_platform 可以用来配置不同的芯片, 目前支持 rk3566、rk3568、rk3588、rv1103、rv1106, 该参数的值大小写不敏感。

rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], quant_img_RGB2BGR=True, quantized_algorithm='normal', quantized_method='channel', target_platform='rk3566')
  1. モデルの読み込み
# RKNN-Toolkit2 目前支持 Caffe、TensorFlow、TensorFlow Lite、ONNX、DarkNet、PyTorch 等 模型的加载转换

# 从当前路径加载 mobilenet_v2 的 caffe 模型 
ret = rknn.load_caffe(model='./mobilenet_v2.prototxt', blobs='./mobilenet_v2.caffemodel')

# 从当前目录加载 mobilenet_v2 的 onnx 模型,outputs 为 onnx输出层的名字(outputs可不写)
ret = rknn.load_onnx(model = './mobilenet_v2.onnx', outputs=['output1', 'output2', 'output3'])

4) RKNN モデルの構築

# 构建 RKNN 模型
# do_quantization 是否做量化(不做量化为float16)
# dataset 为量化图片的路径
# rknn_batch_size 为 batch_size 默认值为1(可以不写),建议 batch_size 小于 32
ret = rknn.build(do_quantization=True, dataset='./data.txt', rknn_batch_size=1)

5) RKNN モデルのエクスポート

# 将构建好的 RKNN 模型保存到当前路径的 mobilenet_v1.rknn 文件中 
ret = rknn.export_rknn(export_path='./mobilenet_v1.rknn')

6) RKNN モデルをロードする

# 从当前路径加载 mobilenet_v1.rknn 模型
ret = rknn.load_rknn(path='./mobilenet_v1.rknn')

7) 実行環境の初期化

# target 目标硬件平台,rk3566、rk3568、rk3588、rv1103、rv1106, 默认只为None。在 PC 使用工具时,模型在模拟器上运行,需要配置成None(或不配置该参数)。
# device_id:设备编号,如果 PC 连接多台设备时,需要指定该参数,设备编号可以通 过 list_devices 接口查看。默认值为 None。
# perf_debug:进行性能评估时是否开启 debug 模式。在 debug 模式下,可以获取到每 一层的运行时间,否则只能获取模型运行的总时间。默认值为 False。
# eval_mem:是否进入内存评估模式。进入内存评估模式后,可以调用 eval_memory 接口获取模型运行时的内存使用情况。默认值为 False。
ret = rknn.init_runtime(target=None, device_id=None, perf_debug=False, eval_mem=False)
  1. モデル推論
# inputs:待推理的输入,如经过 cv2 处理的图片。格式是 ndarray list。 
# data_format:数据模式,可以填以下值:nchw, nhwc。默认值为nhwc。只对 4 维的输入有效。
# inputs_pass_through:将输入透传给 NPU 驱动。非透传模式下,在将输入传给 NPU 驱动之前,工具会对输入进行减均值、除方差等操作;而透传模式下,不会做这些 操作。这个参数的值是一个数组,比如要透传 input0,不透传 input1,则这个参数的 值为[1, 0]。默认值为 None,即对所有输入都不透传。
outputs = rknn.inference(inputs=[img])

9) モデルの評価 (モデルはボード上で実行する必要があります)

# 对模型性能进行评估
rknn.eval_perf(inputs=[image], is_print=True)
  1. メモリ使用量を取得します (モデルはボード上で実行する必要があります)
# 对模型内存使用情况进行评估 
memory_detail = rknn.eval_memory()

11) SDK バージョンをクエリします (モデルはボード上で実行する必要があります)

# 获取 SDK 版本信息
sdk_version = rknn.get_sdk_version()
print(sdk_version)

ステップ 1 ~ 8 の完全なコード

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


ONNX_MODEL = 'yolov5.onnx'
RKNN_MODEL = 'yolov5.rknn'

DATASET = './dataset.txt'
QUANTIZE_ON = True


def export_rknn_inference(img):
    # Create RKNN object
    rknn = RKNN(verbose=True)

    # pre-process config
    print('--> Config model')
    rknn.config(mean_values=[[0, 0, 0]], std_values=[[255, 255, 255]], quantized_algorithm='normal', quantized_method='channel', target_platform='rk3566')
    print('done')

    # Load ONNX model
    print('--> Loading model')
    ret = rknn.load_onnx(model=ONNX_MODEL, outputs=['output1', 'output2', 'output3'])
    if ret != 0:
        print('Load model failed!')
        exit(ret)
    print('done')

    # Build model
    print('--> Building model')
    ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET, rknn_batch_size=1)
    if ret != 0:
        print('Build model failed!')
        exit(ret)
    print('done')

    # Export RKNN model
    print('--> Export rknn model')
    ret = rknn.export_rknn(RKNN_MODEL)
    if ret != 0:
        print('Export rknn model failed!')
        exit(ret)
    print('done')
    
    # Init runtime environment
    print('--> Init runtime environment')
    ret = rknn.init_runtime(target=None, device_id=None, perf_debug=True)
    # ret = rknn.init_runtime(target='rk3566')
    if ret != 0:
        print('Init runtime environment failed!')
        exit(ret)
    print('done')

    # Inference
    print('--> Running model')
    outputs = rknn.inference(inputs=[img])
    rknn.release()
    print('done')

    return outputs

if __name__ == '__main__':
    print('This is main ....')

    # Set inputs
    img_path = 'test.jpg'
    model_input_w = 512
    model_input_h = 512
    
    origimg = cv2.imread(img_path)
    origimg = cv2.cvtColor(origimg, cv2.COLOR_BGR2RGB)
    img = cv2.resize(origimg, (model_input_w , model_input_h ))
    outputs = export_rknn_inference(img)
	
	# 后处理
	'''
	........
	'''

RKNN が提供する yolov5 サンプルをテストします。
rknn によって提供された yolov5Demo を変換します

1.4 変換コード + モデル + テスト画像 + 検出後処理

完全なコードは github にあります。コード

参照文書

[1] Rockchip_User_Guide_RKNN_Toolkit2_CN-1.3.0.pdf

おすすめ

転載: blog.csdn.net/zhangqian_1/article/details/126831502