常见算法模型示例
位置路径
常见算法模型示例位于 horizon_model_convert_sample 路径的: 03_classification/、 04_detection/ 和 07_segmentation/ 文件夹中。
如何准备数据集
数据集下载地址
数据集的下载地址可参考下表:
数据集参考结构
为方便您进行后续步骤,在数据集下载完成后,您需要按照如下地平线建议的结构对评测数据集进行处理。
| 数据集 | 说明 |
| ImageNet数据集 | 我们建议您将下载的数据集解压成如下结构,数据准备过程中如遇问题请联系地平线。 |
| COCO数据集 | 我们建议您将下载的数据集解压成如下结构,数据准备过程中如遇问题请联系地平线。 |
| VOC数据集 | 请注意: |
| Cityscapes数据集 | 我们建议您将下载的数据集解压成如下结构,数据准备过程中如遇问题请联系地平线。 |
如何准备模型
在使用模型转换示例包时,请您先准备好对应的浮点模型。
OE包默认不携带示例对应的校准数据集和原始模型,您需要在对应的示例文件夹内执行 00_init.sh 获取当前示例所需的模型和校准数据集。
对于各原始模型的来源、修改点(如有)的准备过程,请您参考以下内容。
MobileNetv1
-
md5sum码:
MobileNetv2
-
md5sum码:
ResNet50
GoogleNet
EfficientNet_Lite0/1/2/3/4
为了快速运行示例,避免使用第三方工具带来的风险,强烈推荐您直接使用地平线模型发布物 model_zoo/mapper/ 路径下准备好的ONNX浮点模型。如果您有兴趣复现tflite2onnx的模型转换过程,也可以尝试使用以下三方工具。但地平线无法保证第三方工具的质量和转换成功率。
-
模型来源:可从 https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/lite 获取tar包。
-
地平线模型发布物中转换后的ONNX模型md5sum码:
-
下载后可从tar包中得到
.tflite文件,然后可通过tflite2onnx工具 将tflite转换为ONNX模型。不同版本的tflite2onnx转换出来的layout会不一样,若转换出来的ONNX模型的输入layout是NHWC排布,则build时,EfficientNet_Lite0/1/2/3/4的
input_layout_train均应该选择NHWC。
Vargconvnet
Efficientnasnet_m
Efficientnasnet_s
ResNet18
YOLOv2_Darknet19
-
为了快速运行示例,避免使用第三方工具带来的风险,强烈推荐您直接使用地平线模型发布物 model_zoo/mapper/ 路径下准备好的Caffe浮点模型。如果您有兴趣复现darknet2caffe的模型转换过程,也可以尝试使用以下三方工具。但地平线无法保证三方工具的质量和转换成功率。
-
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
- YOLOv2_Darknet19模型需要首先从YOLO官网,下载YOLOv2 608x608的.cfg和.weight文件并使用darknet2caffe 转换工具将其转换为caffe model。
该转换工具(darknet2caffe)是一个简化版本,使用时,需要修改该工具生成的.prototxt文件,将其中的 'Reshape' 层修改成 'Passthrough' 层, Passthrough 层具体修改后的参数请见提供的yolov2.prototxt例子,并在输出节点增加一个NCHW2NHWC的Permute操作。
-
md5sum码:
YOLOv3_Darknet53
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
- YOLOv3_Darknet53模型获取:
URL:https://github.com/ChenYingpeng/caffe-yolov3/ ,caffemodel可以在该github的README.md提供的百度云下载路径中下载,并在输出节点增加一个NCHW2NHWC的Permute操作。
-
md5sum码:
YOLOv5x
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
- YOLOv5x模型:可以从URL:https://github.com/ultralytics/yolov5/releases/tag/v2.0 中下载相应的pt文件。
在clone代码时,请确认您使用的Tags是v2.0,否则将导致转换失败。
-
md5sum码:
- 为了更好地适配后处理代码,我们在ONNX模型导出前对Github代码做了如下修改(代码参见:https://github.com/ultralytics/yolov5/blob/v2.0/models/yolo.py ):
去除了每个输出分支尾部从4维到5维的reshape(即不将channel从255拆分成3x85),然后将layout从NHWC转换成NCHW再输出。
以下左图为修改前的模型某一输出节点的可视化图,右图则为修改后的对应输出节点可视化图。
- 下载完成后通过脚本 https://github.com/ultralytics/yolov5/blob/v2.0/models/export.py 进行pt文件到ONNX文件的转换。
在使用export.py脚本时,请注意:
在clone代码时,请确认您使用的Tags是v2.0,否则将导致转换失败。
-
由于地平线算法工具链支持的ONNX opset版本为 10 ~ 19,请将
torch.onnx.export的opset_version参数根据您要使用的版本进行修改。 -
将
torch.onnx.export部分的默认输入名称参数由'images'改为'data',与模型转换示例包的YOLOv5x示例脚本保持一致。 -
将
parser.add_argument部分中默认的数据输入尺寸640x640改为模型转换示例包YOLOv5x示例中的672x672。
SSD_MobileNetv1
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
-
SSD_MobileNetv1模型:可以从URL:https://github.com/chuanqi305/MobileNet-SSD 获得Caffe模型。
-
md5sum码:
Efficientdetd0
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
CenterNet_Resnet101
- 我们将maxpool和sigmoid节点放到模型中,并指定编译为BPU节点,用于减少后处理过程中的计算量。
- 在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
Fcos_efficientnetb0
- 该模型为采用PTQ方式训练出来的模型。
- 为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
Yolov4
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
YOLOv3_VargDarknet
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
- YOLOv3_VargDarknet模型获取:
URL:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/Yolov3_VargDarknet , 可以在该github的README.md提供的百度云下载路径中下载。
-
md5sum码:
Fcos_resnet50
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
Fcos_resnext101
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
Unet_mobilenet
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
DeeplabV3plus_efficientnetb0
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Reshape和Cast节点做了删除的操作。
Fastscnn_efficientnetb0
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Reshape和Cast节点做了删除的操作。
Deeplabv3plus_dilation1248
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Transpose节点做了删除的操作。
Deeplabv3plus_efficientnetm1
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Reshape、Cast和Transpose节点做了删除的操作。
Deeplabv3plus_efficientnetm2
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Reshape、Cast和Transpose节点做了删除的操作。
算法模型示例的使用演示
本小节以 Resnet50 模型为例,使用算法模型示例包中 03_classification/03_resnet50/ 路径下脚本分步骤演示浮点模型到定点模型转换的过程。
进入Docker容器
首先,根据 Docker容器部署 一节内容完成Docker环境的安装和配置并进入docker容器。
下载原始模型及校准数据集
在 03_classification/03_resnet50/ 文件夹内执行 00_init.sh 获取当前示例所需的模型和校准数据集。
验证模型是否能够执行
如下所示,运行脚本:
准备校准用的数据集
在同一路径下继续执行 02_preprocess.sh 脚本,如下所示:
-
我们从ImageNet数据集抽取了100张图作为校准数据集,在校准前,我们对数据进行了预处理:short size resize/crop size/NHWC to NCHW/转为rgb。
-
hb_compile工具会从转换得到二进制数据中读取数据,预处理过的二进制数据文件格式为 npy,dtype为uint8。
build模型
在同一路径下继续执行 03_build.sh 脚本,如下所示:
上述脚本使用 hb_compile 工具转换模型,最需要关注的是转换的配置文件,请参考 模型量化编译 章节。
上述脚本的输出如下所示:
您暂时只需要关心 resnet50_224x224_nv12.hbm 文件。
单张图片推理
执行 04_inference.sh 脚本进行单张图片的推理过程,如下所示:
-
因为图片推理过程时,需要对图片进行 前处理,对模型数据进行 后处理,所以我们提供了一个示例Python脚本。具体请参考
sh 04_inference.sh。 -
此脚本只是对单张图片进行推理,验证单张图片的推理结果是否符合预期,如果想做精度测评,可以参考
05_evaluate.sh脚本。
精度测试
继续执行 05_evaluate.sh 脚本进行精度评测,如下所示:
-
因为精度评测时,需要对图片进行 前处理,对模型数据进行 后处理,所以我们提供了一个示例Python脚本。具体请参考
sh 05_evaluate.sh。 -
为了加快评测速度,可以通过
-p选项适当调整并发进程数,但需要注意内存的占用情况。当-p选项值不填或者设置为0时,CPU环境中的定点模型将按照10个进程数处理,其他场景均按1个进程数处理。
常见问题
复现的精度为什么与文档中提供的指标有细微差异?
出现此种现象的原因可能有以下两点:
-
在不同的服务器环境下,计算方式上可能会有细小的区别,就会导致不同的服务器环境中编译出来的定点onnx模型的精度与文档的记录值有细微数据波动。
-
使用的第三方库如opencv、numpy等库的版本不同,导致图片经过前处理后的得到的结果不同,这种情况也会导致精度复现时与文档中的记录值有细微数据波动。
出现这种情况,您可以不用过于担心,文档中提供的记录指标仅作为参考,您在复现时的精度与文档中的记录值有细微差异是正常现象,可以正常跑通精度即可。
定点模型精度为何与ai_benchmark示例中的hbm文件上板精度无法对齐?
在标准交付中,我们在添加示例的时候,定点模型精度和ai_benchmark示例中的hbm文件上板精度是已经做了对齐处理的。
如果您发现定点模型精度与ai_benchmark示例中的hbm文件上板精度无法对齐的情况,建议您优先检查模型输入是否一致。 由于执行定点模型评估脚本时,使用到的是图片类型的数据集;而上板使用到的hbm模型,需要使用hb_eval_preprocess工具转换后的二进制数据集。 基于此点,如果您在上板时使用的数据集并非通过上述方式生成的,我们建议您先在运行定点模型的精度的相同服务器上,使用我们的数据预处理工具(即hb_eval_preprocess工具)重新生成上板需要的数据集,重跑上板精度,以保证模型输入一致。
注意,在使用hb_eval_preprocess工具生成数据集和运行定点模型精度时,两者使用的环境需要保证一致。
