最后一步:模型转换

训练好了模型该如何快速应用呢?在别的设备安装MMEdu似乎很麻烦。得益于OpenMMLab系列工具的不断进步与发展。MMEdu通过集成OpenMMLab开源的模型部署工具箱MMDeploy模型压缩工具包MMRazor,打通了从算法模型到应用程序这 “最后一公里”!

我们也希望通过本系列教程,带领大家学会如何把自己使用MMEdu训练的计算机视觉任务SOTA模型部署到ONNXRuntimeNCNN等各个推理引擎上。

借助MMEdu完成模型转换

MMEdu内置了一个convert函数,来实现了一键式模型转换,转换前先了解一下转换要做的事情吧。

  • 转换准备:

    待转换的模型权重文件(用MMEdu训练)。

  • 需要配置两个信息:

    待转换的模型权重文件(checkpoint)和输出的文件(out_file)。

  • 模型转换的典型代码:

from MMEdu import MMClassification as cls
model = cls(backbone='MobileNet')
checkpoint = 'checkpoints/cls_model/CatsDog/best_accuracy_top-1_epoch_2.pth'
out_file="catdog.onnx"
model.convert(checkpoint=checkpoint, out_file=out_file)

model.convert函数中有四个参数可以设置:

  • checkpoint(string) - 必需参数,选择想要进行模型转换的权重文件,以.pth为后缀。

  • out_file(string) - 必需参数,指定模型转换后的输出文件路径。

  • opset_version(int) - 可选参数,设置模型算子集的版本,默认为11。

  • ir_version(int) - 可选参数,设置模型转化中间表示的版本。指定中间表示(Intermediate Representation, 简称 IR)规范的版本,一个整数(int)类型的参数。在计算机编程中,中间表示是一种数据结构或代码,它介于原始代码和机器码之间。它通常用于编译器或类似工具中,作为转换和优化代码的一个步骤。指定中间表示的版本,可方便根据不同的需求和优化目标选择最合适的 IR 规范。当前可选范围为1~12,默认为6。

类似的,目标检测模型转换的示例代码如下:

from MMEdu import MMDetection as det
model = det(backbone='SSD_Lite')
checkpoint = 'checkpoints/COCO-80/ssdlite.pth'
out_file="COCO-80.onnx"
model.convert(checkpoint=checkpoint, out_file=out_file)

参考项目:MMEdu模型转换

全流程体验

现在,让我们从“从零开始训练猫狗识别模型并完成模型转换”项目入手,见识一下使用MMEdu工具完成从模型训练到模型部署的基本流程吧!

1.准备数据集

思考自己想要解决的分类问题后,首先要收集数据并整理好数据集。例如想要解决猫狗识别问题,则需准备猫狗数据集。

2.模型训练

训练一个全新的模型,一般要花较长时间。因此我们强烈建议在预训练模型的基础上继续训练,哪怕你要分类的数据集和预训练的数据集并不一样。

如下代码是使用基于MobileNet网络训练的猫狗识别预训练模型,模型训练是在预训练模型基础上继续训练。基于预训练模型继续训练可起到加速训练的作用,并且通常会使得模型达到更好的效果。

from MMEdu import MMClassification as cls
model = cls(backbone='MobileNet')
model.load_dataset(path='/data/TC4V0D/CatsDogsSample') 
model.save_fold = 'checkpoints/cls_model/CatsDog1' 
model.train(epochs=5, checkpoint='checkpoints/pretrain_model/mobilenet_v2.pth' ,batch_size=4, lr=0.001, validate=True,device='cuda')

3.推理测试

使用MMEdu图像分类模块模型推理的示例代码完成模型推理。返回的数据类型是一个字典列表(很多个字典组成的列表)类型的变量,内置的字典表示分类的结果,如“{'标签': 0, '置信度': 0.9417100548744202, '预测结果': 'cat'}”,我们可以用字典访问其中的元素。巧用预测结果设置一些输出。如:

from MMEdu import MMClassification as cls
model = cls(backbone='MobileNet')
checkpoint = 'checkpoints/cls_model/CatsDog1/best_accuracy_top-1_epoch_1.pth'
img_path = '/data/TC4V0D/CatsDogsSample/test_set/cat/cat0.jpg'
result = model.inference(image=img_path, show=True, checkpoint = checkpoint,device='cuda')
x = model.print_result(result)
print('标签(序号)为:',x[0]['标签'])
if x[0]['标签'] == 0:
    print('这是小猫,喵喵喵!')
else:
    print('这是小猫,喵喵喵!')

4.模型转换

from MMEdu import MMClassification as cls
model = cls(backbone='MobileNet')
checkpoint = 'checkpoints/cls_model/CatsDog1/best_accuracy_top-1_epoch_1.pth'
out_file='out_file/cats_dogs.onnx'
model.convert(checkpoint=checkpoint, out_file=out_file)

此时项目文件中的out_file文件夹下便生成了模型转换后生成的两个文件,可打开查看。一个是ONNX模型权重,一个是示例代码,示例代码稍作改动即可运行(XEduHub)。

  • 硬件上需安装的库:

    XEduHub(pip install xedu-python

  • 需上传到硬件的文件:

    1)out_file文件夹(内含模型转换生成的两个文件)。

    新建一个代码文件,将out_file文件夹中的py文件中的代码稍作修改用于代码运行(当然也可以直接运行)。

生成的示例代码:

from XEdu.hub import Workflow as wf
import numpy as np

# 模型声明
mm = wf(task='mmedu',checkpoint='cats_dogs.onnx')
# 待推理图像,此处仅以随机数组为例
image = 'cat0.jpg'
# 模型推理
res,img = mm.inference(data=image,img_type='cv2')
# 标准化推理结果
result = mm.format_output(lang="zh")
# 可视化结果图像
mm.show(img)

拓展:模型转换在线版

MMDeploy还推出了模型转换工具网页版本,支持更多后端推理框架,具体使用步骤如下。

../_images/Web1.png

  • 点击新建转换任务

../_images/Web2.png

  • 选择需要转换的模型类型、模型训练配置,并点击上传模型上传本地训练好的.pth权重文件,具体的选项如下表所示

../_images/Web3.png

MMEdu模型名称 功能 OpenMMlab算法 模型训练配置
MobileNet 图像分类 mmcls v1.0.0rc5 configs/mobilenet_v2/mobilenet-v2_8xb32_in1k.py
RegNet 图像分类 mmcls v1.0.0rc5 configs/regnet/regnetx-400mf_8xb128_in1k.py
RepVGG 图像分类 mmcls v1.0.0rc5 configs/repvgg/deploy/repvgg-A0_deploy_4xb64-coslr-120e_in1k.py
ResNeXt 图像分类 mmcls v1.0.0rc5 configs/resnext/resnext50-32x4d_8xb32_in1k.py
ResNet18 图像分类 mmcls v1.0.0rc5 configs/resnet/resnet18_8xb32_in1k.py
ResNet50 图像分类 mmcls v1.0.0rc5 configs/resnet/resnet50_8xb32_in1k.py
ShuffleNet_v2 图像分类 mmcls v1.0.0rc5 configs/shufflenet_v2/shufflenet-v2-1x_16xb64_in1k.py
VGG 图像分类 mmcls v1.0.0rc5 configs/vgg/vgg19_8xb32_in1k.py
FasterRCNN 目标检测 mmdet-det v3.0.0rc5 configs/faster_rcnn/faster_rcnn_r50_fpn_1x_coco.py
Mask_RCNN 目标检测 mmdet-det v3.0.0rc5 configs/mask_rcnn/mask_rcnn_r50_fpn_1x_coco.py
SSD_Lite 目标检测 mmdet-det v3.0.0rc5 configs/ssd/ssdlite_mobilenetv2_scratch_600e_coco.py
Yolov3 目标检测 mmdet-det v3.0.0rc5 configs/yolo/yolov3_d53_320_273e_coco.py
  • 选择需要的目标runtime,可选的有ncnn,ort1.8.1(onnxruntime),openvino等,点击提交任务

../_images/Web4.png

  • 点击提交任务后,状态会变为排队中,或处理中,如果转换失败会提示错误日志,根据错误日志提示修改,像下图错误的原因是使用ResNet50(分类)的权重,可对应的OpenMMLab算法误选为了mmdet(检测)的,所以提示的错误是找不到配置文件

../_images/Web5.png

  • 转换成功后,点击下载模型即可使用

../_images/Web6.png

What:什么现象与成果

精度测试结果

软硬件环境

  • 操作系统:Ubuntu 16.04

  • 系统位数:64

  • 处理器:Intel i7-11700 @ 2.50GHz * 16

  • 显卡:GeForce GTX 1660Ti

  • 推理框架:ONNXRuntime == 1.13.1

  • 数据处理工具:BaseDT == 0.0.1

配置

  • 静态图导出

  • batch大小为1

  • BaseDT内置ImageData工具进行数据预处理

精度测试结果汇总

  • 图像分类

模型 数据集 权重大小 精度(TOP-1) 精度(TOP-5)
FP32 INT8 FP32 INT8 FP32 INT8
MobileNet ImageNet 13.3 MB 3.5 MB 70.94% 68.30% 89.99% 88.44%
ResNet18 ImageNet 44.7 MB 69.93% 89.29%
ResNet50 ImageNet 97.8 MB 24.6 MB 74.93% 74.77% 92.38% 92.32%
ShuffleNet_v2 ImageNet 9.2 MB 2.28 MB 69.36% 66.15% 88.32% 86.34%
VGG ImageNet 527.8 MB 101.1 MB 72.62% 72.32% 91.14% 90.97%

ImageNet 数据集:ImageNet项目是一个用于视觉对象识别软件研究的大型可视化数据库。ImageNet项目每年举办一次软件比赛,即ImageNet大规模视觉识别挑战赛(ILSVRC),软件程序竞相正确分类检测物体和场景。 ImageNet挑战使用了一个“修剪”的1000个非重叠类的列表。2012年在解决ImageNet挑战方面取得了巨大的突破

准确度(Top-1):排名第一的类别与实际结果相符的准确率

准确度(Top-5):排名前五的类别包含实际结果的准确率

  • 目标检测

模型 数据集 权重大小 精度(mAP)
FP32 INT8 FP32 INT8
SSD_Lite COCO 28.1 MB 8.5 MB 0.2303 0.2285
FasterRCNN COCO 168.5 MB 42.6 MB 0.3437 0.3399
Mask_RCNN COCO 169.7 MB 45.9 MB 0.3372 0.3340
Yolov3 COCO 237 MB 61 MB 0.2874 0.2688

COCO 数据集: MS COCO的全称是Microsoft Common Objects in Context,起源于微软于2014年出资标注的Microsoft COCO数据集,与ImageNet竞赛一样,被视为是计算机视觉领域最受关注和最权威的比赛之一。 COCO数据集是一个大型的、丰富的物体检测,分割和字幕数据集。这个数据集以scene understanding为目标,目前为止有语义分割的最大数据集,提供的类别有80类,有超过33万张图片,其中20万张有标注,整个数据集中个体的数目超过150万个。

AP (average Precision):平均精度,在不同recall下的最高precision的均值(一般会对各类别分别计算各自的AP)

mAP(mean AP):平均精度的均值,各类别的AP的均值

边、端设备测试结果

PC机测试

用于模型训练的机器,性能较优,常见的操作系统有Windows和Linux

软硬件环境

  • 操作系统:Ubuntu 16.04

  • 系统位数:64

  • 处理器:Intel i7-11700 @ 2.50GHz * 16

  • 显卡:GeForce GTX 1660Ti

  • 推理框架:ONNXRuntime == 1.13.1

  • 数据处理工具:BaseDT == 0.0.1

配置
  • 静态图导出

  • batch大小为1

  • BaseDT内置ImageData工具进行数据预处理

  • 测试时,计算各个数据集中 10 张图片的平均耗时

下面是我们环境中的测试结果:

  • 图像分类

模型 数据集 权重大小 吞吐量 (图片数/每秒)
FP32 INT8 FP32 INT8
MobileNet ImageNet 13.3 MB 3.5 MB 201 217
ResNet18 ImageNet 44.7 MB 62
ResNet50 ImageNet 97.8 MB 24.6 MB 29 43
ShuffleNet_v2 ImageNet 9.2 MB 2.28 MB 244 278
VGG ImageNet 527.8 MB 101.1 MB 6 15

吞吐量 (图片数/每秒):表示每秒模型能够识别的图片总数,常用来评估模型的表现

*:不建议部署,单张图片推理的时间超过30s

  • 目标检测

模型 数据集 权重大小 吞吐量 (图片数/每秒)
FP32 INT8 FP32 INT8
SSD_Lite* COCO 28.1 MB 8.5 MB 37 53
SSD_Lite** COCO 28.1 MB 8.5 MB
FasterRCNN COCO 168.5 MB 42.6 MB
Mask_RCNN COCO 169.7 MB 45.9 MB
Yolov3 COCO 237 MB 61 MB 3 6

*:后端支持网络为MobileNetv1,性能弱于以MobileNetv2为后端推理框架的版本

**:后端支持网络为MobileNetv2,即MMEdu中SSD_Lite选用的版本,可从参数对比中得出其精度、准确度、模型大小均优于以MobileNetv1为后端推理框架的SSD_Lite

行空板测试

行空板, 青少年Python教学用开源硬件,解决Python教学难和使用门槛高的问题,旨在推动Python教学在青少年中的普及。官网:https://www.dfrobot.com.cn/

软硬件环境
  • 操作系统:Linux

  • 系统位数:64

  • 处理器:4核单板AArch64 1.20GHz

  • 内存:512MB

  • 硬盘:16GB

  • 推理框架:ONNXRuntime == 1.13.1

  • 数据处理工具:BaseDT == 0.0.1

配置
  • 静态图导出

  • batch大小为1

  • BaseDT内置ImageData工具进行数据预处理

  • 测试时,计算各个数据集中 10 张图片的平均耗时

下面是我们环境中的测试结果:

  • 图像分类

模型 数据集 权重大小 吞吐量 (图片数/每秒)
FP32 INT8 FP32 INT8
MobileNet ImageNet 13.3 MB 3.5 MB 1.77 4.94
ResNet18 ImageNet 44.7 MB 0.46
ResNet50 ImageNet 97.8 MB 24.6 MB 0.22 0.58
ShuffleNet_v2 ImageNet 9.2 MB 2.28 MB 3.97 8.51
VGG ImageNet 527.8 MB 101.1 MB * *

吞吐量 (图片数/每秒):表示每秒模型能够识别的图片总数,常用来评估模型的表现

*:不建议部署,单张图片推理的时间超过30s

  • 目标检测

模型 数据集 权重大小 吞吐量 (图片数/每秒)
FP32 INT8 FP32 INT8
SSD_Lite* COCO 28.1 MB 8.5 MB 0.55 1.30
SSD_Lite** COCO 28.1 MB 8.5 MB
FasterRCNN COCO 168.5 MB 42.6 MB
Mask_RCNN COCO 169.7 MB 45.9 MB
Yolov3 COCO 237 MB 61 MB 0.026 0.066

*:后端支持网络为MobileNetv1,性能弱于以MobileNetv2为后端推理框架的版本

**:后端支持网络为MobileNetv2,即MMEdu中SSD_Lite选用的版本,可从参数对比中得出其精度、准确度、模型大小均优于以MobileNetv1为后端推理框架的SSD_Lite

树莓派(4b)测试

Raspberry Pi。中文名为“树莓派”,简写为RPi,或者RasPi(RPi)是为学生计算机编程教育而设计,卡片式电脑,其系统基于Linux。

软硬件环境
  • 操作系统:Linux

  • 系统位数:32

  • 处理器:BCM2711 四核 Cortex-A72(ARM v8) @1.5GHz

  • 内存:4G

  • 硬盘:16G

  • 推理框架:ONNXRuntime == 1.13.1

  • 数据处理工具:BaseDT == 0.0.1

配置
  • 静态图导出

  • batch大小为1

  • BaseDT内置ImageData工具进行数据预处理

  • 测试时,计算各个数据集中 10 张图片的平均耗时

下面是我们环境中的测试结果:

  • 图像分类

模型 数据集 权重大小 吞吐量 (图片数/每秒)
FP32 INT8 FP32 INT8
MobileNet ImageNet 13.3 MB 3.5 MB 6.45
ResNet18 ImageNet 44.7 MB 3.20
ResNet50 ImageNet 97.8 MB 24.6 MB 1.48 2.91
ShuffleNet_v2 ImageNet 9.2 MB 2.28 MB 19.11 10.85*
VGG ImageNet 527.8 MB 101.1 MB 0.43 0.44

吞吐量 (图片数/每秒):表示每秒模型能够识别的图片总数,常用来评估模型的表现

*:量化后在树莓派上推理速度变慢

  • 目标检测

模型 数据集 权重大小 吞吐量 (图片数/每秒)
FP32 INT8 FP32 INT8
SSD_Lite* COCO 28.1 MB 8.5 MB 2.55
SSD_Lite** COCO
FasterRCNN COCO 168.5 MB 42.6 MB
Mask_RCNN COCO 169.7 MB 45.9 MB
Yolov3 COCO 237 MB 61 MB 0.21 0.34

*:后端支持网络为MobileNetv1,性能弱于以MobileNetv2为后端推理框架的版本

**:后端支持网络为MobileNetv2,即MMEdu中SSD_Lite选用的版本,可从参数对比中得出其精度、准确度、模型大小均优于以MobileNetv1为后端推理框架的SSD_Lite

注:硬件测试模块持续更新中,如有更多硬件测试需求,请联系我们

多模态交互

回顾用AI解决真实问题的流程图,我们已经介绍了收集数据、训练模型、模型推理和应用部署。结合项目设计,我们还会去思考如何通过摄像头获得图像,如何控制灯光发亮,如何操纵舵机,如何设计显示界面UI等需要使用输入设备和输出设备等来实现的交互设计,即对多模态交互的考量。

../_images/SolveRealProblemsWithAI.JPG

更多传感器、执行器使用教程参见:DFRobot

更多模型转换和应用的教程详见后文