ResNet50訓練デプロイガイド
文書情報
本チュートリアルでは、画像分類アルゴリズム ResNet50 のトレーニング、および CSUN RV1126B 基板へのデプロイについて説明します。
| 項目 | 内容 |
|---|---|
| 文書名 | ResNet50訓練デプロイガイド |
| 会社 | 株式会社日昇テクノロジー |
| URL | https://www.dragonwake.com |
| info@dragonwake.com | |
| 作成日 | 2026/06/02 |
| バージョン | Ver1.0 |
| 修正内容 | 新規作成 |
1. ResNet50概要
ResNet50ネットワークは、Microsoft ResearchのHe Kaiming氏により2015年に提案され、ILSVRC 2015画像分類コンペティションで1位を獲得しました。ResNet以前の従来型CNNは、畳み込み層とプーリング層を積み重ねる構成でしたが、ネットワークが一定以上深くなると劣化問題が発生しました。残差ネットワークは最適化しやすく、十分な深さを追加することで精度を向上できます。内部の残差ブロックではスキップ接続を使用し、深層ニューラルネットワークを深くした際に発生しやすい勾配消失問題を緩和します。
本チュートリアルでは、画像分類アルゴリズムResNet50のトレーニングおよびCSUN RV1126B基板へのデプロイについて説明します。

図1-1 ResNet50訓練およびデプロイの全体フロー
2. 資料ダウンロード
本マニュアルに必要な資料およびソースコードは、以下のリンクからダウンロードしてください。
https://dl.dragonwake.com/download/rv1126b/AI/demo/Resnet50/AIDemo_ResNet50_All.zip
解凍後のディレクトリ構成は次のとおりです。
|-- 01-data データセット|-- 02-training トレーニング用のソース|-- 03-model_convert AIモデル変換用のソース|-- 04-AI_deploy AIモデルデプロイ用のソース
図2-1 AIDemo_ResNet50_All.zip解凍後のディレクトリ構成
3. データセットの準備
本チュートリアルでは、車両分類アルゴリズムを例として使用します。データセットの構成は次のとおりです。
trainフォルダ:訓練用のデータセットvalフォルダ:検証用のデータセット

図3-1 trainおよびvalデータセットフォルダ
データセットを開くと、10種類の車両カテゴリを確認できます。

図3-2 車両分類データセットのカテゴリフォルダ
カテゴリ名およびカテゴリインデックス番号の対応関係は次のとおりです。
| カテゴリ名 | カテゴリインデックス番号 |
|---|---|
| SUV | 0 |
| BUS | 1 |
| family sedan | 2 |
| fire engine | 3 |
| heavy truck | 4 |
| jeep | 5 |
| mini bus | 6 |
| racing car | 7 |
| taxi | 8 |
| truck | 9 |
4. ResNet50画像分類のトレーニング
4.1. トレーニング用ソースコード
トレーニング用ソースコードのディレクトリは次の図のようになります。

図4-1 ResNet50トレーニング用ソースコードディレクトリ
データセットを現在のディレクトリへコピーします。

図4-2 データセットをトレーニングディレクトリへコピー
4.2. モデルのトレーニング
本ガイドでは、CSUN RV1126BのDocker開発環境にPyTorchなどをインストールし、トレーニング環境として使用します。
pipコマンドがない場合は、以下を実行してインストールしてください。
sudo apt updatesudo apt install pipDocker環境内でCUDAを使用する場合は、ホスト側にnvidia-container-toolkitが必要です。
ホスト側で以下のコマンドを実行し、NVIDIA Container Toolkitをインストールします。
curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor --yes -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg
curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | sed 's#deb https://#deb [arch=amd64 signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | sed 's#$(ARCH)#amd64#g' | sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list
sudo apt-get updateapt-cache policy nvidia-container-toolkitsudo apt-get install -y nvidia-container-toolkitホスト側で以下のコマンドを実行し、DockerコンテナからGPUを認識できることを確認します。
docker run --rm --gpus all nvidia/cuda:11.8.0-runtime-ubuntu22.04 nvidia-smi
図4-3 DockerコンテナからGPUを認識できることを確認
以下の内容でrequirements.txtを作成し、Docker開発環境でpip install -r requirements.txtを実行します。
# GPU environment for NVIDIA GeForce GTX 1070 Ti# GPU: Pascal architecture, Compute Capability 6.1# Recommended: PyTorch 2.5.1 + CUDA 11.8 wheel## Install:# pip install -r requirements.txt## Verify:# python -c "import torch; print(torch.__version__); print(torch.version.cuda); print(torch.cuda.is_available()); print(torch.cuda.get_device_name(0) if torch.cuda.is_available() else 'none')"
--index-url https://download.pytorch.org/whl/cu118--extra-index-url https://pypi.org/simple
torch==2.5.1torchvision==0.20.1numpymatplotlibPillowopencv-pythononnxトレーニング完了後、matplotlibを使用して精度などのグラフを描画します。ただし、matplotlibはデフォルトでGTKグラフィカルインターフェースバックエンドを使用する場合があります。必要に応じて、以下の依存パッケージをインストールしてください。
sudo apt install -y libcanberra-gtk-module libcanberra-gtk3-module librsvg2-commonトレーニングソースコードディレクトリで次のコマンドを実行し、トレーニングを開始します。
python train.py実行結果の例を次に示します。

図4-4 ResNet50トレーニング実行結果
トレーニング終了後のtest loss結果は次のとおりです。

図4-5 ResNet50 test loss結果
トレーニング終了後のtest accuracy結果は次のとおりです。

図4-6 ResNet50 test accuracy結果
生成された最良モデルは次のとおりです。

図4-7 生成された最良モデルファイル
4.3. PC側でモデルをテスト
トレーニングソースコードディレクトリで次のコマンドを実行し、モデルをテストします。生成されたモデル名が異なる場合は、predict.pyソースコード内のモデル名も修正してください。
全体パッケージをダウンロードして解凍した後のパスは次のとおりです。
/data/project/sales/csun/rv1126b/jp/AI/demo/Tutorial/Resnet50/02-training/image_classificationpython predict.py
図4-8 predict.py実行結果
結果のカテゴリインデックス番号は1、つまりBUSです。テスト結果が正しいことを確認できます。

図4-9 BUSカテゴリとして認識されたテスト画像
4.4. pthモデルをONNXモデルへ変換
生成されたモデル名を確認します。

図4-10 pth_to_onnx.pyで指定するモデルファイル名
次のコマンドを実行し、PyTorchのpthモデルをONNXモデルへ変換します。
python pth_to_onnx.py
図4-11 pthモデルからONNXモデルへの変換実行結果
生成されたONNXモデルは次のとおりです。

図4-12 生成されたONNXモデルファイル
5. rknn-toolkitモデル変換
5.1. rknn-toolkitモデル変換環境構築
ONNXモデルをRV1126B基板で実行するには、RKNNモデルへ変換する必要があります。そのため、事前にrknn-toolkitモデル変換ツール環境を構築します。TensorFlow、TensorFlow Lite、Caffe、Darknetなどのモデルも同様の方法で変換できます。本チュートリアルではONNXモデルを例として説明します。
5.1.1. 概要
モデル変換環境の構築手順は次のとおりです。

図5-1 モデル変換ツール環境構築フロー
5.1.2. モデル変換ツールのダウンロード
本節は「AIモデル変換環境構築ガイド」を参考にしてください。
モデル変換ツールを正常に実行するため、以下のDockerイメージファイルをダウンロードしてください。
https://dl.dragonwake.com/download/rv1126b/AI/images/rknn-toolkit2-v2.3.2-cp38-docker.tar.gz
5.1.3. ツールをUbuntu 20.04へ移動
ダウンロード完了後のDockerイメージは次の図のようになります。

図5-2 rknn-toolkit2 Dockerイメージファイル
5.1.4. モデル変換ツール環境の起動
次のコマンドを実行し、モデル変換ツールのDockerイメージを読み込みます。
cd /data/project/sales/csun/rv1126b/jp/AI/imagesdocker load --input rknn-toolkit2-v2.3.2-cp38-docker.tar.gz次のコマンドを実行し、イメージのbash環境に入ります。
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v /data/project/sales/csun/rv1126b/jp/AI/demo/Tutorial:/test rknn-toolkit2:2.3.2-cp38 /bin/bash実行結果の例を次に示します。

図5-3 rknn-toolkit2 Docker bash環境
pythonを入力してPython環境を起動し、rknnライブラリを読み込めることを確認します。環境テストに成功した例を次に示します。

図5-4 rknnライブラリの読み込み確認
以上で、モデル変換ツール環境の構築は完了です。
5.2. モデルをRKNNへ変換
CSUN RV1126Bは、拡張子.rknnのモデルの評価と実行をサポートしています。一般的なTensorFlow、TensorFlow Lite、Caffe、Darknet、ONNX、およびPyTorchモデルは、提供されているツールキットを使用してRKNNモデルに変換できます。その他のフレームワークでトレーニングされたモデルは、まずONNXモデルに変換してからRKNNモデルに変換できます。モデル変換プロセスは次の図のとおりです。

図5-5 RKNNモデル変換プロセス
5.2.1. モデル変換ツールのDocker環境に入る
次のコマンドを実行し、作業領域をDockerイメージへマウントします。/data/project/sales/csun/rv1126b/jp/AI/demo/Tutorialを作業領域として使用し、コンテナ内の/testへマッピングします。また、/dev/bus/usb:/dev/bus/usbによりUSBデバイスをDockerイメージへマウントします。
docker run -t -i --privileged -v /dev/bus/usb:/dev/bus/usb -v /data/project/sales/csun/rv1126b/jp/AI/demo/Tutorial:/test rknn-toolkit2:2.3.2-cp38 /bin/bash実行に成功すると、次の図のように表示されます。

図5-6 モデル変換用Docker環境へのログイン
5.2.2. モデル変換Demoディレクトリの説明
モデル変換テストDemoは、resnet50_model_convertとquant_datasetで構成されます。resnet50_model_convertには変換用スクリプト、quant_datasetには量子化モデルに必要なデータが格納されています。
tar -jxvf resnet50_model_convert.tar.bz2unzip quant_dataset.zip
図5-7 モデル変換Demoの展開後ディレクトリ
resnet50_model_convertフォルダには、次の内容が格納されています。
10class_ResNet50.onnx:テスト用のモデルファイルgen_list.py:量子化画像ファイルリストを生成するPythonスクリプトrknn_convert.py:モデル変換用のPythonスクリプト

図5-8 resnet50_model_convertフォルダの内容
5.2.3. 量子化画像リストの生成
Docker環境に切り替え、モデル変換作業ディレクトリへ移動します。
cd /test/Resnet50/03-model_convert/resnet50_model_convert
図5-9 モデル変換作業ディレクトリ
gen_list.pyを実行し、量子化画像リストを生成します。
python gen_list.py
図5-10 量子化画像リスト生成コマンド
生成された量子化画像リストは次のフォルダに格納されます。

図5-11 生成された量子化画像リスト
5.2.4. ONNXモデルをRKNNモデルへ変換
rknn_convert.pyはデフォルトでINT8量子化を行います。スクリプト例は次のとおりです。
import osimport urllibimport tracebackimport timeimport sysimport numpy as npimport cv2from rknn.api import RKNN
ONNX_MODEL = '10class_ResNet50.onnx'RKNN_MODEL = './10class_ResNet50_rv1126b.rknn'DATASET = './pic_path.txt'QUANTIZE_ON = True
if __name__ == '__main__': # Create RKNN object rknn = RKNN(verbose=False)
if not os.path.exists(ONNX_MODEL): print('model not exist') exit(-1)
# pre-process config print('--> Config model') rknn.config( mean_values=[[123.67, 116.28, 103.53]], std_values=[[58.395, 57.12, 57.375]], target_platform='rv1126b' ) print('done')
# Load ONNX model print('--> Loading model') ret = rknn.load_onnx(model=ONNX_MODEL) if ret != 0: print('Load failed!') exit(ret) print('done')
# Build model print('--> Building model') ret = rknn.build(do_quantization=QUANTIZE_ON, dataset=DATASET) if ret != 0: print('Build resnet failed!') exit(ret) print('done')
# Export RKNN model print('--> Export RKNN model') ret = rknn.export_rknn(RKNN_MODEL) if ret != 0: print('Export resnet failed!') exit(ret) print('done')
rknn.release()ONNXモデル10class_ResNet50.onnxをresnet50_model_convertディレクトリへ配置し、rknn_convert.pyでモデル変換を行います。
python rknn_convert.py
図5-12 rknn_convert.py実行結果
生成されたモデルを次の図に示します。このモデルはrknn-toolkit環境およびRV1126B基板で実行できます。

図5-13 生成されたRKNNモデルファイル
6. ResNet50画像分類デプロイ
6.1. モデルデプロイ例の説明
本節では、ResNet50モデルをRV1126B基板へデプロイする手順を説明します。本サンプル用モデルは簡単なトレーニングのみを行ったものであり、モデル精度は保証しません。
6.2. 準備作業
6.2.1. ハードウェア準備
RV1126B基板、Type-Cデータケーブル、LANケーブルを用意し、MobaXtermからSSHでRV1126B基板にログインします。詳細は入門ガイドを参照してください。
LANケーブルで接続します。

図6-1 RV1126B LAN接続
シリアルケーブル(Type-C)で接続します。

図6-2 RV1126B Type-Cシリアル接続
6.2.2. 開発環境の準備
本書を初めて読む場合は、『入門ガイド』を参照し、記載された手順に従ってコンパイル環境を構築してください。
PC側のUbuntuシステムでrun.shスクリプトを実行し、RV1126Bコンパイル環境に入ります。手順は次のとおりです。
cd ~/develop_environment./run.sh 2204
図6-3 RV1126B Docker開発環境の起動
6.3. サンプルプログラムのビルド
ダウンロードしたパッケージをRV1126B Docker開発環境へ移動した後、次のコマンドを実行して展開します。
tar -xvf resnet50_classification_C_demo.tar.bz2展開後のディレクトリは次の図のようになります。

図6-4 ResNet50デプロイDemo展開後ディレクトリ
RV1126B Docker開発環境上でサンプルプログラムの展開後ディレクトリに入り、ビルドを実行します。具体的なコマンドは次のとおりです。
sudo mount -t nfs -o vers=3,proto=tcp,mountproto=tcp,nolock,retrans=5,timeo=5 192.168.11.85:/ /mntcd /opt/linuxshare/work/rv1126b/jp/AI/demo/Tutorial/Resnet50/04-AI_deploy/resnet50_classification_C_demo/./build.sh
図6-5 ResNet50デモプログラムのビルド結果
コンパイルに成功した後、実行プログラムディレクトリresnet_classification_demo_release/をRV1126B基板の/userdataディレクトリへコピーします。
cp resnet_classification_demo_release/ /mnt/userdata/ -rf6.4. 開発ボードでResNet50画像分類を実行
シリアルデバッグまたはSSHデバッグによりボード側シェルへ入り、サンプルプログラムのデプロイ先へ移動します。
cd /userdata/resnet_classification_demo_release
図6-6 開発ボード上のResNet50デモディレクトリ
サンプルプログラムの実行コマンドは次のとおりです。
chmod 777 resnet_classification_demo./resnet_classification_demo実行結果を次の図に示します。アルゴリズム実行時間は約18 msです。

図6-7 ResNet50デモ実行結果
以上で、ResNet50画像分類サンプルはボード上で正常に実行されました。