RKNN-Toolkit-Lite2の使用方法
1. rknn-toolkit-lite2の使用方法
1.1. rknn-toolkit-lite2 の紹介
RKNN-Toolkit-Lite2 は、Rockchipが自社のRKシリーズチップ(RV1126B、RK3576、RK3588など)向けに特化して開発した軽量なAIモデルデプロイメントツールキットであり、エッジ/組み込みデバイスでのモデル推論シナリオに焦点を当てています。複雑な環境依存関係を必要とせず、システムリソースの消費も非常に少ないのが特徴です。コア機能は、RKNNツールチェーンによって変換されたAIモデルをロードして実行することであり、TensorFlowやPyTorchなどの主流フレームワークからエクスポートされたモデルの適応をサポートしています。
このツールキットは C/C++ および Python のバイリンガルAPIを提供しており、インターフェースはシンプルで使いやすく設計されています。また、RKチップのNPUハードウェアアクセラレーション向けに深く最適化されており、モデルの推論効率を大幅に向上させることができます。スマートセキュリティ、IoT、家電などのエッジAIシナリオに適しており、開発者がモデルのエッジ側へのデプロイを迅速に実現し、組み込みAI開発のハードルを大幅に下げるのに役立ちます。
rknn-toolkit-lite2 は現在、EASY-EAI-Nano-TB への適応が完了しており、ユーザーはこれを使用してディープラーニングアルゴリズムの純粋な Python 開発を行うことができます。また、コンパイル済みのモデルもサポートしており、わずか数行のコードでアルゴリズムの推論を完了できるため、開発コストを大幅に削減できます。同時に、C/C++に不慣れな多くのアルゴリズム開発者にとっても開発のハードルを効果的に下げます。本ドキュメントは、RKNNモデルへの変換が完了したモデルに基づいてボード上で推論を行うためのものです。

1.1. rknn-toolkit-lite2 の紹介 図1
1.2. 環境構築
1.2. 1 gitツールのインストール
sudo apt update && sudo apt install git1.2. 2 miniforge3ツールのインストール
複数の異なるバージョンの Python 環境に対するシステム要件の競合を防ぐため、miniforge3 を使用して Python 環境を管理することをお勧めします。miniforge3とcondaのバージョン情報がインストールされているか確認し、すでにインストールされている場合はこのセクションの手順を省略できます。
miniforge3 インストールパッケージのダウンロード:
cd /userdatawgethttps://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh
1.2. 2 miniforge3ツールのインストール 図2
miniforge3 のインストール:
chmod 777 Miniforge3-Linux-aarch64.shbash Miniforge3-Linux-aarch64.sh
1.2.2 miniforge3ツールのインストール 図3

1.2.2 miniforge3ツールのインストール 図4

1.2.2 miniforge3ツールのインストール 図5
1.2.3 Conda環境の作成
Conda base環境に入る:
source ~/miniforge3/bin/activatePython 3.8バージョン(推奨バージョン)で、`RKNN-Toolkit-lite2` という名前のConda環境を作成する:
conda create -n RKNN-Toolkit-lite2 python=3.8RKNN-Toolkit Conda環境に入る:
conda activate RKNN-Toolkit-lite2Conda環境から退出する:
conda deactivateConda環境を削除する:
conda remove -n RKNN-Toolkit-lite2 --all1.2.4 RKNN-Toolkit-Lite2とOpenCVライブラリのインストール
クラウドストレージからのダウンロード:
pip install rknn_toolkit_lite2-2.3.2-cp38-cp38-manylinux_2_17_aarch64.manylinux2014_aarch64.whl
1.2.4 RKNN-Toolkit-Lite2とOpenCVライブラリのインストール 図6
pip install opencv-python
1.2.4 RKNN-Toolkit-Lite2とOpenCVライブラリのインストール 図7
1.3. ボードでのデモテスト
rknn-toolkit-lite2 の「テストプログラムinference_with_lite2.tar.bz2」をダウンロードし、ファイルをEASY-EAI-Nano-TB ボードのディレクトリに転送します。
以下のコマンドを実行して解凍します:
tar -xvf inference_with_lite2.tar.bz2
1.3. ボードでのデモテスト 図8
以下のコマンドを実行してディレクトリを切り替え、テストプログラムを実行します:
cd /userdata/inference_with_lite/python test.py結果は以下のようになります:

1.3. ボードでのデモテスト 図9
1.4. rknn-toolkit-lite2フローの説明
1.4.1 使用フローチャート
RKNN Tookit Lite2の使用フローは以下の通りです:

1.4.1 使用フローチャート 図10
1.4.2 サンプルプログラム
第3節のサンプルプログラムは以下の通りです:
# -*- coding: utf-8 -*-import cv2import numpy as npfrom rknnlite.api import RKNNLite
# ==================== 設定項目(実際の状況に応じて変更してください) ====================RKNN_MODEL_PATH = "10class_ResNet50_rv1126b.rknn" # RKNNモデルのパスTEST_IMAGE_PATH = "./test-1.jpg" # テスト画像のパスINPUT_SHAPE = (224, 224) # モデルの入力サイズ(モデル変換時と一致させる必要があります)INPUT_CHANNELS = 3 # 入力チャンネル数CLASSES = ("SUV", "bus", "family sedan", "fire engine", "heavy truck", "jeep", "minibus", "racing car", "taxi", "truck")
# ==================== コア関数 ====================def preprocess_image(image_path, input_shape): """ 画像の前処理:読み込み→RGB変換→リサイズ→次元拡張→NCHW変換→型変換 戻り値は4次元NCHWフォーマットの入力テンソル """ # 1. 画像の読み込み img = cv2.imread(image_path) if img is None: raise ValueError(f"画像を読み込めません:{image_path}。パスが正しいか確認してください!") print(f"元の画像shape: {img.shape}") # 元の次元(H,W,C)を出力
# 2. BGRからRGBへの変換(OpenCVのデフォルトはBGR、モデル学習では一般的にRGBが使用されます) img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB) print(f"RGB変換後のshape: {img_rgb.shape}")
# 3. モデルの入力サイズへのリサイズ img_resized = cv2.resize(img_rgb, input_shape) print(f"リサイズ後のshape: {img_resized.shape}") # (224,224,3)
# 4. 4次元への拡張(重要!バッチ次元を追加、N=1) img_4d_nhwc = np.expand_dims(img_resized, axis=0) print(f"バッチ次元拡張後のshape (NHWC): {img_4d_nhwc.shape}") # (1,224,224,3)
# 5. NCHWフォーマットへの変換(モデルログに framework layout: NCHW と表示されます) img_4d_nchw = np.transpose(img_4d_nhwc, (0, 3, 1, 2)) print(f"NCHW変換後のshape: {img_4d_nchw.shape}") # (1,3,224,224)
# 6. 型変換(RKNN Lite2ではfloat32またはuint8が推奨されます。モデルの量子化タイプに応じて調整してください) img_input = img_4d_nchw.astype(np.float32) print(f"最終的な入力shape: {img_input.shape}, タイプ: {img_input.dtype}")
return img_input
def softmax(x): """softmax正規化、出力を確率に変換""" x = x - np.max(x) # 数値のオーバーフローを防止 return np.exp(x) / np.sum(np.exp(x))
def predict(rknn_lite, input_tensor): """モデル推論、入力フォーマットを明示的に指定""" try: # data_formatをNCHWに明示的に指定(重要!RKNN Runtimeに入力フォーマットを伝えます) outputs = rknn_lite.inference( inputs=[input_tensor], data_format='nchw' # 入力フォーマットを強制指定し、自動認識エラーを回避 ) return outputs except Exception as e: print(f"推論失敗:{str(e)}") return None
# ==================== メインプログラム ====================if __name__ == "__main__": # 1. RKNN Liteの初期化 rknn_lite = RKNNLite() print("--> RKNNモデルをロード中") ret = rknn_lite.load_rknn(RKNN_MODEL_PATH) if ret != 0: print(f"モデルのロードに失敗しました。エラーコード:{ret}") exit(ret) print("モデルのロードが完了しました")
# 2. ランタイム環境の初期化(コアの変更点:targetパラメータを削除し、ハードウェアを自動認識させます) print("--> ランタイムを初期化中") ret = rknn_lite.init_runtime() # targetを削除し、システムにRV1126Bを自動認識させる if ret != 0: print(f"ランタイムの初期化に失敗しました。エラーコード:{ret}") exit(ret) print("ランタイムの初期化が完了しました")
# 3. 画像の前処理(強制的に4次元入力を生成) print("--> 画像の前処理") try: input_tensor = preprocess_image(TEST_IMAGE_PATH, INPUT_SHAPE) except ValueError as e: print(e) exit(1)
# 4. モデル推論 print("--> 推論を実行中") outputs = predict(rknn_lite, input_tensor) if outputs is None or len(outputs) == 0: print("推論に出力がありません!") rknn_lite.release() exit(1)
# 5. 結果の解析 print("\n--> 推論結果の解析") output = outputs[0][0] # 最初の出力の最初のバッチを取得 prob = softmax(output) max_idx = np.argmax(prob) print(f"予測カテゴリ:{CLASSES[max_idx]}") print(f"信頼度:{prob[max_idx]:.4f}")
# 6. リソースの解放 rknn_lite.release() print("\nすべての操作が完了しました!")1.5. APIの詳細説明
1.5.1 RKNNLite2の初期化とオブジェクトの解放
RKNN Toolkit Lite2を使用する際、まず RKNNLite()メソッドを呼び出してRKNNLiteオブジェクトを初期化し、使用後はそのオブジェクトのrelease()`メソッドを呼び出してリソースを解放する必要があります。 RKNNLiteオブジェクトを初期化する際、verbose および verbose_fileパラメータを設定して詳細なログ情報を出力することができます。verboseパラメータは画面に詳細なログ情報を出力するかどうかを指定します。verbose_fileパラメータが設定され、かつverbose`パラメータ値がTrueの場合、ログ情報はこのパラメータで指定されたファイルにも書き込まれます。
例は以下の通りです:
# 詳細なログ情報を画面に出力し、inference.logファイルにも書き込むrknn_lite = RKNNLite(verbose=True, verbose_file='./inference.log')
# 画面にのみ詳細なログ情報を出力するrknn_lite = RKNNLite(verbose=True)...rknn_lite.release()1.5.2 RKNNモデルのロード
| 項目 | パラメータ名 / 値 | 説明 |
|---|---|---|
| API | Load_rknn | RKNNモデルをロードします。 |
| パラメータ | path | RKNNモデルファイルのパス。 |
| load_model_in_npu | NPU内のRKNNモデルを直接ロードするかどうか。この場合、path はNPU内のRKNNモデルのパスになります。RKNN Toolkit LiteがNPUデバイスを接続したPC、またはRK3399Pro Linux開発ボードで実行されている場合にのみ True に設定できます。デフォルト値は False です。 | |
| 戻り値 | 0 | ロード成功 |
| -1 | ロード失敗 |
例は以下の通りです:
ret = rknn_lite.load_rknn('10class_ResNet50_pre.rknn')1.5.3 ランタイム環境の初期化
モデルの推論を行う前に、まずランタイム環境を初期化し、モデルがどのチッププラットフォームで実行されるかを決定する必要があります。
| 項目 | パラメータ名 / 値 | 説明 |
|---|---|---|
| API | init_runtime | ランタイム環境を初期化します。モデルが実行されるデバイス情報(チップモデル、デバイスID)を決定します。 |
| パラメータ | target | ターゲットハードウェアプラットフォーム。現在「rk3399pro」、「rk1806」、「rk1808」、「rv1109」、「rv1126」をサポートしています。デフォルトは None で、アプリケーションが実行されている開発ボードに基づいて自動的に選択されます。 |
| device_id | デバイス番号。PCが複数のスマートデバイスに接続されている場合、このパラメータを指定する必要があります。デバイス番号は「list_devices」インターフェースで確認できます。デフォルト値は None です。 | |
| async_mode | 非同期モードを使用するかどうか。推論インターフェースを呼び出す際、入力画像の設定、モデル推論、推論結果の取得という3つの段階が含まれます。非同期モードを有効にした場合、現在のフレームの入力設定は前のフレームの推論と同時に行われるため、最初のフレームを除き、後続の各フレームは入力設定の時間を隠すことができ、パフォーマンスを向上させることができます。非同期モードでは、毎回返される推論結果は前のフレームのものです。デフォルト値は False です。 | |
| 戻り値 | 0 | 成功(原文:ロード成功) |
| -1 | 失敗(原文:ロード失敗) |
例は以下の通りです:
# init runtime environmentprint('--> Init runtime environment')ret = rknn_lite.init_runtime(target=None)if ret != 0: print('Init runtime environment failed') exit(ret)print('done')1.5.4 モデル推論
| 項目 | パラメータ名 / 値 | 説明 |
|---|---|---|
| API | inference | 指定された入力に対して推論を行い、推論結果を返します。 |
| パラメータ | inputs | 推論を行う入力(cv2で処理された画像など)。型は list で、リストの要素は ndarray です。 |
| data_type | 入力データの型。以下の値を指定できます:‘float32’、‘float16’、‘uint8’、‘int8’、‘int16’。デフォルト値は ‘uint8’ です。 | |
| data_format | データモード(フォーマット)。以下の値を指定できます:“nchw”、“nhwc”。デフォルト値は ‘nhwc’ です。これら2つの違いは、channel(チャンネル)が配置される位置です。 | |
| inputs_pass_through | 入力をNPUドライバにパススルー(透過的伝達)します。非パススルーモードでは、入力をNPUドライバに渡す前に、ツールは入力に対して平均の減算や分散による除算などの操作を行います。一方、パススルーモードでは、これらの操作は行われません。このパラメータの値は配列であり、例えば input0 をパススルーし、input1 をパススルーしない場合、このパラメータの値は [1, 0] になります。デフォルト値は None で、すべての入力をパススルーしません。 | |
| 戻り値 | results | 推論結果。型は list で、リストの要素は ndarray です。 |
例は以下の通りです(resnet50などの分類モデルを例とします。完全なコードは第3節を参照してください):
# Inferenceprint('--> Running model')outputs = rknn_lite.inference(inputs=[resize_img])
print("outputs[0]:", outputs[0])print("outputs[0].shape:", outputs[0].shape)show_outputs(softmax(np.array(outputs[0][0])))1.5.5 SDKバージョンの照会
| 項目 | パラメータ名 / 値 | 説明 |
|---|---|---|
| API | get_sdk_version | SDK APIとドライバのバージョン番号を取得します。 注:このインターフェースを使用する前に、モデルのロードとランタイム環境の初期化を完了させる必要があります。 |
| パラメータ | なし | |
| 戻り値 | sdk_version | APIおよびドライバのバージョン情報。型は文字列です。 |
例は以下の通りです:
# SDKバージョン情報を取得...sdk_version = rknn_lite.get_sdk_version()返される SDK 情報は以下のようになります:

1.5.5 SDKバージョンの照会 図11