跳转到内容

ResNet50训练部署指南

文档信息

本教程说明图像分类算法 ResNet50 的训练,以及将其部署到 CSUN RV1126B 开发板的完整流程。

项目内容
文档名ResNet50训练部署指南
公司株式会社日昇テクノロジー
URLhttps://www.dragonwake.com
E-mailinfo@dragonwake.com
创建日期2026/06/02
版本Ver1.0
修订内容新建

1. ResNet50概要

ResNet50网络由Microsoft Research的He Kaiming于2015年提出,并在ILSVRC 2015图像分类竞赛中获得第一名。ResNet之前的传统CNN通常通过堆叠卷积层和池化层构建网络,但当网络深度增加到一定程度后,容易出现退化问题。残差网络更易于优化,通过增加足够的网络深度可以提升精度。其内部残差块使用跳跃连接,可以缓解深层神经网络加深时容易出现的梯度消失问题。

本教程说明图像分类算法ResNet50的训练,以及部署到CSUN RV1126B开发板的流程。

ResNet50训练和部署整体流程

图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模型部署用源码

AIDemo ResNet50解压后的目录结构

图2-1 AIDemo_ResNet50_All.zip解压后的目录结构

3. 数据集准备

本教程以车辆分类算法为例。数据集结构如下。

  • train文件夹:训练用数据集
  • val文件夹:验证用数据集

train和val数据集文件夹

图3-1 train和val数据集文件夹

打开数据集后,可以看到10种车辆类别。

车辆分类数据集类别文件夹

图3-2 车辆分类数据集类别文件夹

类别名称与类别索引号的对应关系如下。

类别名称类别索引号
SUV0
BUS1
family sedan2
fire engine3
heavy truck4
jeep5
mini bus6
racing car7
taxi8
truck9

4. ResNet50图像分类训练

4.1. 训练用源码

训练用源码目录如下图所示。

ResNet50训练用源码目录

图4-1 ResNet50训练用源码目录

将数据集复制到当前目录。

复制到训练目录的数据集

图4-2 将数据集复制到训练目录

4.2. 模型训练

本指南将CSUN RV1126B的Docker开发环境配置为训练环境,并在其中安装PyTorch等依赖包。

如果没有pip命令,请先执行以下命令安装。

Terminal window
sudo apt update
sudo apt install pip

如果需要在Docker环境中使用CUDA,宿主机侧需要安装nvidia-container-toolkit

在宿主机侧执行以下命令安装NVIDIA Container Toolkit。

Terminal window
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 update
apt-cache policy nvidia-container-toolkit
sudo apt-get install -y nvidia-container-toolkit

在宿主机侧执行以下命令,确认Docker容器可以识别GPU。

Terminal window
docker run --rm --gpus all nvidia/cuda:11.8.0-runtime-ubuntu22.04 nvidia-smi

Docker GPU确认结果

图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.1
torchvision==0.20.1
numpy
matplotlib
Pillow
opencv-python
onnx

训练完成后,会使用matplotlib绘制精度等曲线。不过,matplotlib默认可能使用GTK图形界面后端。必要时请安装以下依赖包。

Terminal window
sudo apt install -y libcanberra-gtk-module libcanberra-gtk3-module librsvg2-common

在训练源码目录下执行以下命令开始训练。

Terminal window
python train.py

执行结果示例如下。

ResNet50训练执行结果

图4-4 ResNet50训练执行结果

训练结束后的test loss结果如下。

ResNet50 test loss曲线

图4-5 ResNet50 test loss结果

训练结束后的test accuracy结果如下。

ResNet50 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_classification
Terminal window
python predict.py

predict.py执行结果

图4-8 predict.py执行结果

结果类别索引号为1,即BUS。由此可以确认测试结果正确。

识别为BUS类别的测试图片

图4-9 识别为BUS类别的测试图片

4.4. 将pth模型转换为ONNX模型

确认生成的模型名称。

pth_to_onnx.py中指定的模型文件名

图4-10 pth_to_onnx.py中指定的模型文件名

执行以下命令,将PyTorch的pth模型转换为ONNX模型。

Terminal window
python pth_to_onnx.py

pth模型转换为ONNX模型的执行结果

图4-11 pth模型转换为ONNX模型的执行结果

生成的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镜像如下图所示。

rknn-toolkit2 Docker镜像文件

图5-2 rknn-toolkit2 Docker镜像文件

5.1.4. 启动模型转换工具环境

执行以下命令,加载模型转换工具的Docker镜像。

Terminal window
cd /data/project/sales/csun/rv1126b/jp/AI/images
docker load --input rknn-toolkit2-v2.3.2-cp38-docker.tar.gz

执行以下命令进入镜像的bash环境。

Terminal window
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

执行结果示例如下。

rknn-toolkit2 Docker bash环境

图5-3 rknn-toolkit2 Docker bash环境

输入python启动Python环境,并确认可以加载rknn库。环境测试成功示例如下。

rknn库加载确认

图5-4 rknn库加载确认

至此,模型转换工具环境构建完成。

5.2. 将模型转换为RKNN

CSUN RV1126B支持对扩展名为.rknn的模型进行评估和执行。常见的TensorFlow、TensorFlow Lite、Caffe、Darknet、ONNX以及PyTorch模型,都可以使用提供的工具包转换为RKNN模型。其他框架训练得到的模型,可以先转换为ONNX模型,再转换为RKNN模型。模型转换流程如下图所示。

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镜像中。

Terminal window
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

执行成功后,显示效果如下图所示。

进入模型转换用Docker环境

图5-6 进入模型转换用Docker环境

5.2.2. 模型转换Demo目录说明

模型转换测试Demo由resnet50_model_convertquant_dataset组成。resnet50_model_convert保存转换脚本,quant_dataset保存量化模型所需的数据。

Terminal window
tar -jxvf resnet50_model_convert.tar.bz2
unzip quant_dataset.zip

模型转换Demo解压后的目录

图5-7 模型转换Demo解压后的目录

resnet50_model_convert文件夹包含以下内容。

  • 10class_ResNet50.onnx:测试用模型文件
  • gen_list.py:用于生成量化图片文件列表的Python脚本
  • rknn_convert.py:用于模型转换的Python脚本

resnet50_model_convert文件夹内容

图5-8 resnet50_model_convert文件夹内容

5.2.3. 生成量化图片列表

切换到Docker环境后,进入模型转换工作目录。

Terminal window
cd /test/Resnet50/03-model_convert/resnet50_model_convert

模型转换工作目录

图5-9 模型转换工作目录

执行gen_list.py生成量化图片列表。

Terminal window
python gen_list.py

量化图片列表生成命令

图5-10 量化图片列表生成命令

生成的量化图片列表位于以下文件夹中。

生成的量化图片列表

图5-11 生成的量化图片列表

5.2.4. 将ONNX模型转换为RKNN模型

rknn_convert.py默认执行INT8量化操作。脚本示例如下。

import os
import urllib
import traceback
import time
import sys
import numpy as np
import cv2
from 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执行模型转换。

Terminal window
python rknn_convert.py

rknn_convert.py执行结果

图5-12 rknn_convert.py执行结果

生成的模型如下图所示。该模型可以在rknn-toolkit环境以及RV1126B开发板上运行。

生成的RKNN模型文件

图5-13 生成的RKNN模型文件

6. ResNet50图像分类部署

6.1. 模型部署示例说明

本节说明将ResNet50模型部署到RV1126B开发板的流程。本示例模型只进行了简单训练,不能保证模型精度。

6.2. 准备工作

6.2.1. 硬件准备

准备RV1126B开发板、Type-C数据线和网线,并使用MobaXterm通过SSH登录RV1126B开发板。详细步骤请参考入门指南。

通过网线连接。

RV1126B网线连接

图6-1 RV1126B网线连接

通过串口线(Type-C)连接。

RV1126B Type-C串口连接

图6-2 RV1126B Type-C串口连接

6.2.2. 开发环境准备

如果是第一次阅读本文档,请参考《入门指南》,按照其中的步骤构建编译环境。

在PC侧Ubuntu系统中执行run.sh脚本,进入RV1126B编译环境。步骤如下。

Terminal window
cd ~/develop_environment
./run.sh 2204

启动RV1126B Docker开发环境

图6-3 启动RV1126B Docker开发环境

6.3. 构建示例程序

将下载的包移动到RV1126B Docker开发环境后,执行以下命令解压。

Terminal window
tar -xvf resnet50_classification_C_demo.tar.bz2

解压后的目录如下图所示。

ResNet50部署Demo解压后目录

图6-4 ResNet50部署Demo解压后目录

在RV1126B Docker开发环境中进入示例程序解压后的目录,并执行构建操作。具体命令如下。

Terminal window
sudo mount -t nfs -o vers=3,proto=tcp,mountproto=tcp,nolock,retrans=5,timeo=5 192.168.11.85:/ /mnt
cd /opt/linuxshare/work/rv1126b/jp/AI/demo/Tutorial/Resnet50/04-AI_deploy/resnet50_classification_C_demo/
./build.sh

ResNet50示例程序构建结果

图6-5 ResNet50示例程序构建结果

编译成功后,将执行程序目录resnet_classification_demo_release/复制到RV1126B开发板的/userdata目录。

Terminal window
cp resnet_classification_demo_release/ /mnt/userdata/ -rf

6.4. 在开发板上运行ResNet50图像分类

通过串口调试或SSH调试进入开发板侧shell,并切换到示例程序的部署目录。

Terminal window
cd /userdata/resnet_classification_demo_release

开发板上的ResNet50示例程序目录

图6-6 开发板上的ResNet50示例程序目录

示例程序的执行命令如下。

Terminal window
chmod 777 resnet_classification_demo
./resnet_classification_demo

执行结果如下图所示,算法执行时间约为18 ms。

ResNet50示例程序执行结果

图6-7 ResNet50示例程序执行结果

至此,ResNet50图像分类示例已在开发板上正常运行。