Baidu Flying Paddle PP-YOLOE を Rockchip RK3588 にデプロイする方法を教えます

目次

序文

1. 環境構築

1.Anaconda3のインストール

1.1. ダウンロード

1.2. インストール

2.パドルモデルのエクスポート環境

2.1. 環境を作成する

2.2、環境に入る

2.3、パドルの取り付け

2.4、パドル検出のインストール

 2.5. 関連する依存関係の問題を解決する

3. onnx から rknn 環境へのパドル

3.1. 環境を作成する

3.2、環境に入る

3.3、RKNN-Toolkit2 ツールのインストール

3.3、paddle2onnx ツールのインストール

3.4. 関連する依存関係の問題を解決する

2. モデル変換

1.モデルのエクスポート

2. onnxへのパドル

3. Onnx から rknn

3. ルーチンを実行する


序文

        PP-YOLOE は、Baidu Flying Paddle チームがリリースしたターゲット検出モデルです.PP-YOLOE は、多くの人気の YOLO モデルを凌駕する、PP-YOLOv2 に基づく優れたシングル ステージ アンカー フリー モデルです。PP-YOLOE には一連のモデル、つまり s/m/l/x があり、幅乗数と深さ乗数によって構成できます。PP-YOLOE は Deformable Convolution や Matrix NMS などの特別な演算子の使用を回避するため、さまざまなハードウェアに簡単に展開できます. RK3588 は、ARM アーキテクチャを使用して、Rockchip によってリリースされた新世代の高性能フラグシップ SoC チップです
        。高度な 8nm プロセス技術を採用し、クアッドコア Cortex-A76 とクアッドコア Cortex-A55 (合計 8​​ コア) を統合し、独立した NEON コプロセッサを統合し、8K ビデオ コーデックをサポートし、独立した NPU プロセッサを統合し、最大 6TOPS を提供できます。ほとんどの端末デバイスのエッジ コンピューティングのニーズを満たすことができ、多くの強力な組み込みハードウェア エンジンを提供し、ハイエンド アプリケーションに極端なパフォーマンスを提供し、さまざまな業界の製品カスタマイズのニーズを満たす豊富な機能インターフェイスを提供します。
        この記事では、Baidu Flying Paddle PP-YOLOE モデルを Rockchip RK3588 にデプロイする方法に焦点を当てています。これには、環境の構築、モデルの変換、ルーチンの実行が含まれます。さらに、展開プロセス全体の難しさはモデル変換にあり、モデル変換の全体的なフレームワークは次のとおりです。

パドル モデルを直接 Rockchip の rknn 形式に変換することはできないため、まずパドル モデルを onnx に変換し、次に onnx を rknn に変換する必要があります。

1. 環境構築

        システム: Ubuntu18.04.5 (x64)
        ユーザー: root
        デプロイプロセス中、各ステップの操作で必要な環境が異なり、ソフトウェアパッケージのバージョンが競合する場合もあるため、ここでは conda を使用して環境管理を行います。

1.Anaconda3のインストール

1.1. ダウンロード

        清華鏡公式サイトのダウンロードアドレス:https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/
        ここからAnaconda3-2022.10-Linux-x86_64.shをダウンロード

1.2. インストール

        bash コマンドを使用してインストールします。

# bash Anaconda3-2022.10-Linux-x86_64.sh

        その後、yes とすべて入力して Enter キーを押します. デフォルトでは、ユーザーのホーム ディレクトリに anaconda3 という名前のフォルダーがインストール アドレスとして作成されます. ここでは root アカウントを使用するため、/root/anaconda3 ディレクトリにインストールされます.
        Anaconda のインストールが完了した後に表示されるプロンプトの解釈:
        (1) 変更を有効にするには、現在のシェルを閉じてから再度開きます。翻訳すると、現在のコマンド ラインを閉じてから再度開き、インストールして初期化するだけです。 Anaconda の設定 有効になったら、コマンド ラインを再度開き、直接 conda のベース環境に入ります。
        (2) 起動時に conda の基本環境をアクティブにしない場合は、auto_activate_base パラメーターを false: に設定します。翻訳は次のとおりです。conda の基本環境を起動時にアクティブにしない場合は、auto_activate_base パラメーターを false に設定してください。 、コマンドは次のとおりです。

# conda config --set auto_activate_base false

        もちろん、このコマンドを実行した後、conda base 環境に再度入りたい場合は、次のように、対応する conda コマンドを使用するだけで済みます。

# conda activate base

        この時点で、Anaconda3 がインストールされます。

2.パドルモデルのエクスポート環境

        PP-YOLOE は Baidu Flying Paddle パドルのターゲット検出モデルです. パドル ターゲット検出モデルのエクスポートは PaddleDetection に依存するため、PaddleDetection ツールキットをインストールする必要があります。この環境を別途構築する必要があるのは、PaddleDetection ツールが依存する onnx や numpy などのソフトウェア パッケージのバージョンが、Rising Micro RK3588 の rknn-toolkit2 と互換性がないためです。
        PaddleDetection バージョン: 2.5.0
        rknn-toolkit2 バージョン: 1.3.0

2.1. 環境を作成する

        python3.8.13 パッケージを選択して環境を作成します。コマンドは次のとおりです。

# conda create --name paddleExport python==3.8.13

2.2、環境に入る

        コマンドは次のとおりです。

# conda activate paddleExport

        注: 特に断りのない限り、この章以降のすべての操作は、作成された環境で実行されます。

2.3、パドルの取り付け

        パドル検出ツールをインストールする前に、パドル パッケージをインストールしてください. 清華大学のオープン ソース ソフトウェア ミラー ステーションを使用して、パドル パッケージをインストールしてください. アドレス: https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ で確認できます
        .バージョン依存ライブラリをインストールする前に、次の項目を確認してください。

# conda search --full-name paddlepaddle --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/ --info

        ここでは、インストールする 2.3.2 の CPU バージョンを選択します。

# conda install paddlepaddle=2.3.2 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/Paddle/

        インストールを確認します。

        Enter python and press Enter to enter the python interpreter, enter import paddle, and then enter paddle.utils.run_check(). パドルパドルが正常にインストールされた場合! が表示されたら、正常にインストールされたことを意味します。

(paddleExport) root@micro:~# python
Python 3.8.13 (default, Oct 21 2022, 23:50:54) 
[GCC 11.2.0] :: Anaconda, Inc. on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import paddle
>>> paddle.utils.run_check()
Running verify PaddlePaddle program ... 
PaddlePaddle works well on 1 CPU.
W1102 17:33:39.837543  4740 fuse_all_reduce_op_pass.cc:76] Find all_reduce operators: 2. To make the speed faster, some all_reduce ops are fused during training, after fusion, the number of all_reduce ops is 2.
PaddlePaddle works well on 2 CPUs.
PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.
>>> 

2.4、パドル検出のインストール

        インストール ドキュメントのリファレンス: https://toscode.gitee.com/paddlepaddle/PaddleDetection/blob/release/2.5/docs/tutorials/INSTALL_cn.md
        作業ディレクトリを作成し、作業ディレクトリに切り替えてソース コードをダウンロードします。

# mkdir -p /home/tools/baidu/paddle
# cd /home/tools/baidu/paddle
# git clone https://github.com/PaddlePaddle/PaddleDetection

        PaddleDetection 依存ライブラリをインストールします。

# cd /home/tools/baidu/paddle/PaddleDetection
# pip install -r requirements.txt

        PaddleDetection をコンパイルしてインストールします。

# python setup.py install

        インストールを確認します。

# python ppdet/modeling/tests/test_architectures.py
.......
----------------------------------------------------------------------
Ran 7 tests in 5.532s

OK

        インストールが成功したことを示す上記の出力プロンプトを参照してください。

 2.5. 関連する依存関係の問題を解決する

        この時点で、パドルモデルのエクスポート環境は基本的に構築されていますが、パッケージの依存関係の問題を解決する必要があります。

        pip 依存関係表示ツールをインストールします。

# pip install pipdeptree

        依存関係を表示:

# pipdeptree -p paddlepaddle
Warning!!! Possibly conflicting dependencies found:
* paddlepaddle==2.3.2
 - paddle-bfloat [required: ==0.1.7, installed: ?]
------------------------------------------------------------------------
paddlepaddle==2.3.2
  - astor [required: Any, installed: 0.8.1]
  - decorator [required: Any, installed: 5.1.1]
  - numpy [required: >=1.13, installed: 1.23.3]
  - opt-einsum [required: ==3.3.0, installed: 3.3.0]
    - numpy [required: >=1.7, installed: 1.23.3]
  - paddle-bfloat [required: ==0.1.7, installed: ?]
  - Pillow [required: Any, installed: 9.2.0]
  - protobuf [required: >=3.1.0,<=3.20.0, installed: 3.19.1]
  - requests [required: >=2.20.0, installed: 2.28.1]
    - certifi [required: >=2017.4.17, installed: 2022.9.24]
    - charset-normalizer [required: >=2,<3, installed: 2.0.4]
    - idna [required: >=2.5,<4, installed: 3.4]
    - urllib3 [required: >=1.21.1,<1.27, installed: 1.26.12]
  - six [required: Any, installed: 1.16.0]

        上記の印刷された情報から、いくつかの依存パッケージの問題を認識し、それらを修正します。

# pip install paddle-bfloat==0.1.7

3. onnx から rknn 環境へのパドル

        paddle から onnx および onnx から rknn の 2 つの環境は、別々に、または一緒に構築できます。ここでは、onnx バージョンの調整を容易にし、変換プロセス中に互換性のない onnx バージョンによって引き起こされる障害を回避するために、一緒にビルドすることを選択します。

3.1. 環境を作成する

        python3.8.13 パッケージを選択して環境を作成します

# conda create --name paddle2rknn libprotobuf python==3.8.13

3.2、環境に入る

        コマンドは次のとおりです。

# conda activate paddle2rknn

        注: 特に断りのない限り、この章以降のすべての操作は、作成された環境で実行されます。

3.3、RKNN-Toolkit2 ツールのインストール

        RKNN-Toolkit2 は、PC および Rockchip NPU プラットフォームでのモデル変換、推論、およびパフォーマンス評価をユーザーに提供する開発キットです. RKNN-Toolkit2 は、RK3566、RK3568、RK3588/RK3588S、RV1103、RV1106 およびその他のタイプのチップに適しています. RKNN-Toolkit2 のオープン ソース アドレスは https://github.com/rockchip-linux/rknn-toolkit2 で、そこから Baidu ネットワーク ディスクのダウンロード アドレスを取得できます。
        Baidu ネットワーク ディスク アドレス: https://eyun.baidu.com/s/3eTDMk6Y#sharelink/path=%2F
        パスワード:
        rknn で取得した RK3588 開発ボード上の rknpu の API とドライバーのバージョンは 1.3.0 であるため、ここで選択しますダウンロードする RK_NPU_SDK_1.3.0 のリリース バージョン。ダウンロードして解凍すると、RKNN-Toolkit2 のルート ディレクトリは /home/tools/rockchip/RK_NPU_SDK_1.3.0/rknn-toolkit2-1.3.0 になります。現在、RKNN-Toolkit2 をインストールするには 2 つの方法があります: 1 つは Python パッケージ インストールおよび管理ツール pip を使用してインストールする方法で、もう 1 つは完全な RKNN-Toolkit2 ツールキットを使用して Docker イメージを実行する方法です。本稿では最初の方法を採用する。
        RKNN-Toolkit2 のルート ディレクトリに切り替えます。

# cd /home/tools/rockchip/RK_NPU_SDK_1.3.0/rknn-toolkit2-1.3.0

        私たちの環境のpythonバージョンは3.8.13であるため、依存関係をインストールします。ここで実行します:

# pip3 install -r doc/requirements_cp38-1.3.0.txt

        RKNN-Toolkit2 をインストールします。

# pip3 install packages/rknn_toolkit2-1.3.0_11912b58-cp38-cp38-linux_x86_64.whl

3.3、paddle2onnx ツールのインストール

        paddle2onnx は、PaddlePaddle モデル形式から ONNX モデル形式への変換をサポートしています。paddle2onnx もパドルパッケージに依存します. 新しい環境では, パドルパッケージを再インストールする必要があります. パドルパッケージのインストールについては, 前の章を参照してください.

        paddle2onnx のインストール可能なバージョンを表示:

# pip3 index versions paddle2onnx
WARNING: pip index is currently an experimental command. It may be removed/changed in a future release without prior warning.
paddle2onnx (1.0.1)
Available versions: 1.0.1, 1.0.0, 0.9.8, 0.9.7, 0.9.6, 0.9.5, 0.9.4, 0.9.2, 0.9.1, 0.9.0, 0.8.2, 0.8.1, 0.8, 0.7, 0.6, 0.5.1, 0.5, 0.4, 0.3.2, 0.3.1

        最新バージョンがデフォルトでインストールされます。ここでバージョン 0.9.8 を指定します。そうしないと、onnx バージョンが高すぎるため、RKNN-Toolkit2 と互換性がなくなります。

# pip install paddle2onnx==0.9.8

3.4. 関連する依存関係の問題を解決する

        ここまでで onnx から rknn 環境へのパドルは基本的に構築できましたが、パッケージの依存関係の問題を解決する必要があります。

        pip 依存関係表示ツールをインストールします。

# pip install pipdeptree

        依存関係を表示:

# pipdeptree -p paddle2onnx
Warning!!! Possibly conflicting dependencies found:
* paddlepaddle==2.3.2
 - paddle-bfloat [required: ==0.1.7, installed: ?]
* rknn-toolkit2==1.3.0-11912b58
 - numpy [required: ==1.17.3, installed: 1.23.3]
 - protobuf [required: ==3.12.0, installed: 3.19.1]
 - requests [required: ==2.21.0, installed: 2.28.1]
------------------------------------------------------------------------
paddle2onnx==0.9.8

        上記の情報から、いくつかの依存パッケージのバージョンが正しくないことがわかっているため、それらを修正します。

# pip install paddle-bfloat==0.1.7
# pip install numpy==1.17.3
# pip install protobuf==3.12.0
# pip install requests==2.21.0

2. モデル変換

        Paddle には現在、ターゲット検出、分類、OCR、およびセグメンテーションの 4 種類のモデルがあり、ここで選択された ppyoloe はターゲット検出のタイプです。

1.モデルのエクスポート

        参照文書:

        https://gitee.com/paddlepaddle/PaddleDetection/tree/develop
        https://gitee.com/paddlepaddle/PaddleDetection/blob/develop/deploy/EXPORT_MODEL.md

        以前に構築したモデル エクスポート環境に切り替えて、PaddleDetection 作業ディレクトリに入ります。

# conda activate paddleExport
# cd /home/tools/baidu/paddle/PaddleDetection

        モデルのエクスポート モデルをオンラインでダウンロードしてエクスポートできます。

# python tools/export_model.py \
    -c configs/ppyoloe/ppyoloe_crn_s_300e_coco.yml \
    --output_dir=/home/tools/baidu/paddle/model/ppyoloe \
    -o weights=https://paddledet.bj.bcebos.com/models/ppyoloe_crn_s_300e_coco.pdparams \
    use_gpu=False exclude_nms=True

        元のモデル ファイルをエクスポート用にローカルにダウンロードすることもできます。

# python tools/export_model.py \
    -c configs/ppyoloe/ppyoloe_crn_s_300e_coco.yml \
    --output_dir=/home/tools/baidu/paddle/model/ppyoloe \
    -o weights=/home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco.pdparams \
    use_gpu=False exclude_nms=True

パラメータの説明:

-c は構成ファイルを指定します

--output_dir モデルの保存パス

-o 出力関連の構成。

                          weights: トレーニング済みモデル、拡張子は pdparams

                          use_gpu: GPU を使用するかどうか

                          exclude_nms: モデルの後処理の nms 部分を切り取ります

現在の環境には GPU がないため、use_gpu=False を設定します。

rknn は現在、NonZero 演算子をサポートしていないため、モデルの後処理の nms 部分を切り取るために、exclude_nms=True を設定します。

予測モデルは、/home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco ディレクトリにそれぞれ infer_cfg.yml、model.pdiparams、model.pdiparams.info、model.pdmodel にエクスポートされます。

2. onnxへのパドル

        参考:https://toscode.gitee.com/paddlepaddle/Paddle2ONNX

        onnx から rknn 環境へのパドルに切り替えます。

# conda activate paddle2rknn

        onnx コマンドへのパドル:

# paddle2onnx --model_dir /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/ \
    --model_filename model.pdmodel  \
    --params_filename model.pdiparams \
    --opset_version 12 \
    --save_file /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/model.onnx \
    --enable_onnx_checker True

パラメータの説明:

--model_dir: パドル モデルを含むディレクトリ パスを構成します。

--model_filename: --model_dir 以下のストレージ ネットワーク構造のファイル名を構成します。

--params_filename: --model_dir モデル パラメーターが保存されるファイルの名前を構成します。

--opset_version: 構成は ONNX の OpSet バージョンに変換されます. 現在、7~16 などの複数のバージョンをサポートしています. デフォルトは 9 で、ここでは 12 が選択され、rknn-toolkit2 と互換性があります.

--save_file: 変換されたモデルの保存ディレクトリ パスを指定します。

--enable_onnx_checker: エクスポートされた ONNX モデルの正確性をチェックするかどうかを構成します。このスイッチをオンにすることをお勧めします。デフォルトは False です。

        変換された onnx ファイルは /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/model.onnx にありますが、このモデルを rknn に変換することはできません。また、input_shape_dict を使用して固定入力形状を設定する必要があります。では、入力形状のパラメータを決定する方法は? から: https://toscode.gitee.com/paddlepaddle/PaddleDetection/blob/release/2.5/deploy/EXPORT_MODEL.md

 パドル ターゲット検出モデルには 1 ~ 3 個の入力があることがわかります。次の python コードを使用して、以前に転送された onnx モデルの入力と出力を最初に出力できます。

import onnx
import numpy as np
import logging
logging.basicConfig(level=logging.INFO)

def onnx_datatype_to_npType(data_type):
    if data_type == 1:
        return np.float32
    else:
        raise TypeError("don't support data type")


def parser_initializer(initializer):
    name = initializer.name
    logging.info(f"initializer name: {name}")

    dims = initializer.dims
    shape = [x for x in dims]
    logging.info(f"initializer with shape:{shape}")

    dtype = initializer.data_type
    logging.info(f"initializer with type: {onnx_datatype_to_npType(dtype)} ")
    
    # print tenth buffer
    weights = np.frombuffer(initializer.raw_data, dtype=onnx_datatype_to_npType(dtype))
    logging.info(f"initializer first 10 wights:{weights[:10]}")



def parser_tensor(tensor, use='normal'):
    name = tensor.name
    logging.info(f"{use} tensor name: {name}")

    data_type = tensor.type.tensor_type.elem_type
    logging.info(f"{use} tensor data type: {data_type}")

    dims = tensor.type.tensor_type.shape.dim
    shape = []
    for i, dim in enumerate(dims):
        shape.append(dim.dim_value)
    logging.info(f"{use} tensor with shape:{shape} ")


def parser_node(node):
    def attri_value(attri):
        if attri.type == 1:
            return attri.i
        elif attri.type == 7:
            return list(attri.ints)
        
    name = node.name
    logging.info(f"node name:{name}")

    opType = node.op_type
    logging.info(f"node op type:{opType}")

    inputs = list(node.input)
    logging.info(f"node with {len(inputs)} inputs:{inputs}")

    outputs = list(node.output)
    logging.info(f"node with {len(outputs)} outputs:{outputs}")
    
    attributes = node.attribute
    for attri in attributes:
        name = attri.name
        value = attri_value(attri)
        logging.info(f"{name} with value:{value}")


def parser_info(onnx_model):
    ir_version = onnx_model.ir_version
    producer_name = onnx_model.producer_name
    producer_version = onnx_model.producer_version
    for info in [ir_version, producer_name, producer_version]:
        logging.info("onnx model with info:{}".format(info))

def parser_inputs(onnx_graph):
    inputs = onnx_graph.input
    for input in inputs:
        parser_tensor(input, 'input')

def parser_outputs(onnx_graph):
    outputs = onnx_graph.output
    for output in outputs:
        parser_tensor(output, 'output')

def parser_graph_initializers(onnx_graph):
    initializers = onnx_graph.initializer
    for initializer in initializers:
        parser_initializer(initializer)


def parser_graph_nodes(onnx_graph):
    nodes = onnx_graph.node
    for node in nodes:
        parser_node(node)
        t = 1

def onnx_parser():
    model_path = '/home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/model.onnx'
    
    model = onnx.load(model_path)

    # 0.
    parser_info(model)

    graph = model.graph

    # 1.
    parser_inputs(graph)

    # 2. 
    parser_outputs(graph)

    # 3.
    #parser_graph_initializers(graph)

    # 4. 
    #parser_graph_nodes(graph)


if __name__ == '__main__':
    onnx_parser()

コードは printOnnx.py として保存され、実行されます。

# python printOnnx.py 
INFO:root:onnx model with info:7
INFO:root:onnx model with info:PaddlePaddle
INFO:root:onnx model with info:
INFO:root:input tensor name: image
INFO:root:input tensor data type: 1
INFO:root:input tensor with shape:[-1, 3, 640, 640] 
INFO:root:input tensor name: scale_factor
INFO:root:input tensor data type: 1
INFO:root:input tensor with shape:[-1, 2] 
INFO:root:output tensor name: tmp_17
INFO:root:output tensor data type: 1
INFO:root:output tensor with shape:[-1, 8400, 4] 
INFO:root:output tensor name: concat_14.tmp_0
INFO:root:output tensor data type: 1
INFO:root:output tensor with shape:[-1, 80, 8400]

出力された情報から、ppyoloe には 2 つの入力形状があることがわかります。ここで、バッチは -1 であり、これは不確実であることを意味し、画像サイズなどの他のパラメーターはそこから学習できます。次の新しいコマンドを使用して、固定入力形状で onnx モデルをエクスポートします。

# paddle2onnx --model_dir /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/ \
    --model_filename model.pdmodel  \
    --params_filename model.pdiparams \
    --opset_version 12 \
    --save_file /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/model.onnx \
    --input_shape_dict="{'image':[1,3,640,640], 'scale_factor':[1,2]}" \
    --enable_onnx_checker True

paddle2onnx の上位バージョン (> 0.9.8 のように見える) の場合は、次のコマンドを使用する必要があります。

# paddle2onnx --model_dir /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/ \
    --model_filename model.pdmodel  \
    --params_filename model.pdiparams \
    --opset_version 12 \
    --save_file /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/model.onnx \
    --enable_onnx_checker True

# python -m paddle2onnx.optimize \
    --input_model /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/model.onnx \
    --output_model /home/tools/baidu/paddle/model/ppyoloe/ppyoloe_crn_s_300e_coco/model.onnx \
    --input_shape_dict "{'image':[1,3,640,640], 'scale_factor':[1,2]}"

変換後、入力と出力の形状が固定されていることがわかります。

# python printOnnx.py 
INFO:root:onnx model with info:7
INFO:root:onnx model with info:PaddlePaddle
INFO:root:onnx model with info:
INFO:root:input tensor name: image
INFO:root:input tensor data type: 1
INFO:root:input tensor with shape:[1, 3, 640, 640] 
INFO:root:input tensor name: scale_factor
INFO:root:input tensor data type: 1
INFO:root:input tensor with shape:[1, 2] 
INFO:root:output tensor name: tmp_17
INFO:root:output tensor data type: 1
INFO:root:output tensor with shape:[1, 8400, 4] 
INFO:root:output tensor name: concat_14.tmp_0
INFO:root:output tensor data type: 1
INFO:root:output tensor with shape:[1, 80, 8400] 

3. Onnx から rknn

        RKNN-Toolkit2 をダウンロードすると rknpu2_1.3.0.tar.gz ファイルが入っているので、解凍後 RK_NPU_SDK_1.3.0/rknpu2_1.3.0/examples/rknn_yolov5_demo/convert_rknn_demo/yolov5/onnx2rknn.py を参照して ppyoloe の onnx のコードを記述します。 rknn:

# coding=gbk
import cv2
import numpy as np

from rknn.api import RKNN
import os

ONNX_MODEL = 'ppyoloe_crn_s_300e_coco/model.onnx'
RKNN_MODEL = 'ppyoloe_crn_s_300e_coco/model.rknn'

if __name__ == '__main__':
    NEED_BUILD_MODEL = True
    # NEED_BUILD_MODEL = False
    
    #生成scale_factor.npy
    arr = np.array([1.0, 1.0])
    np.save("scale_factor.npy", arr)
    
    # Create RKNN object
    rknn = RKNN(verbose=True)
    if NEED_BUILD_MODEL:
        DATASET = './dataset.txt'
        #mean_values和std_values查看相应的infer_cfg.yml文件
        #注意:infer_cfg.yml下is_scale:值为true,所以values值要除以scale[1.0/255],即:将values*255得到的值填入下面代码 
        #rknn默认读图方式是RGB,如果这里训练时是使用BGR,则量化时需要RGB转BGR
        #rknn.config(mean_values=[[123.675, 116.28, 103.53]], std_values=[[58.395, 57.12, 57.375]], target_platform="rk3588")
        rknn.config(mean_values=[[123.675, 116.28, 103.53]], std_values=[[58.395, 57.12, 57.375]], target_platform="rk3588", quant_img_RGB2BGR=True)
        # Load model
        print('--> Loading model')
        #ret = rknn.load_onnx(model=ONNX_MODEL)
        ret = rknn.load_onnx(model=ONNX_MODEL, input_size_list=[[1,3,640,640],[1,2]])
        if ret != 0:
            print('load model failed!')
            exit(ret)
        print('done')

        # Build model
        print('--> Building model')
        ret = rknn.build(do_quantization=True, dataset=DATASET)                 #量化
        #ret = rknn.build(do_quantization=False, dataset=DATASET)                 #不量化
        if ret != 0:
            print('build model failed.')
            exit(ret)
        print('done')

        # Export rknn model
        print('--> Export RKNN model: {}'.format(RKNN_MODEL))
        ret = rknn.export_rknn(RKNN_MODEL)
        if ret != 0:
            print('Export rknn model failed.')
            exit(ret)
        print('done')
        
    else:
        ret = rknn.load_rknn(RKNN_MODEL)

    rknn.release()

数値化する際に注意すべきいくつかの場所を次に示します。

(1) rknn のデフォルトの画像読み込み方法は RGB です. ここでトレーニングに BGR を使用する場合, 量子化のために RGB を BGR に変換する必要があります. rknn.config で Quant_img_RGB2BGR=True を設定する必要があります. ppyoloe がトレーニングに使用する形式は何ですか? ? ここではまだ確認していません。

(2) paddle から onnx に移行する際に、ppyoloe には 2 つの入力形状があることがわかったので、量子化補正データ セットを準備するときに、2 つの入力形状データも提供する必要があります。スペース区切り:

# cat dataset.txt 
bus.jpg scale_factor.npy
1.jpg scale_factor.npy

最初のファイルは画像ファイルです

2 番目のファイルは、入力された名前が scale_factor である npy 形式の形状情報であり、ここでは 1.0 に設定されている実際の画像のサイズよりも入力画像のサイズの方が大きいことを示し、ファイルは直接に生成されます。上記のコード。

        上記のコードを実行して、onnx から rknn を実現します。

# python3 onnx2rknn.py

        考えられるエラー:

E build: Catch exception when building RKNN model!
E build: Traceback (most recent call last):
E build:   File "rknn/api/rknn_base.py", line 1680, in rknn.api.rknn_base.RKNNBase.build
E build:   File "rknn/api/rknn_base.py", line 363, in rknn.api.rknn_base.RKNNBase._generate_rknn
E build:   File "rknn/api/rknn_base.py", line 270, in rknn.api.rknn_base.RKNNBase._build_rknn
E build: ImportError: /lib/x86_64-linux-gnu/libm.so.6: version `GLIBC_2.29' not found (required by /root/anaconda3/envs/paddle2rknn/lib/python3.8/site-packages/rknn/api/lib/linux-x86_64/cp38/librknnc_v2.so)
build model failed.

その理由は、GLIBC のバージョン 2.29 が必要であるためです. 解決策については、https: //www.cnblogs.com/chenyirong/p/16342370.htmlを参照してください。

その後、再変換して、問題がなければ、コードで設定されたパスの下に必要な rknn モデル ファイルが生成され、開発ボードに展開され、楽しくプレイできます〜

3. ルーチンを実行する

        現在、開発ボードを持っていません。開発ボードがあれば追加します。

おすすめ

転載: blog.csdn.net/buyishengun/article/details/127653529