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图像分类竞赛中获得第一名。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 pip如果需要在Docker环境中使用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模型转换环境构建
要在RV1126B开发板上运行ONNX模型,需要先将其转换为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数据线和网线,并使用MobaXterm通过SSH登录RV1126B开发板。详细步骤请参考入门指南。
通过网线连接。

图6-1 RV1126B网线连接
通过串口线(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调试进入开发板侧shell,并切换到示例程序的部署目录。
cd /userdata/resnet_classification_demo_release
图6-6 开发板上的ResNet50示例程序目录
示例程序的执行命令如下。
chmod 777 resnet_classification_demo./resnet_classification_demo执行结果如下图所示,算法执行时间约为18 ms。

图6-7 ResNet50示例程序执行结果
至此,ResNet50图像分类示例已在开发板上正常运行。