常见算法模型示例位于 horizon_model_convert_sample
路径的: 03_classification/
、 04_detection/
和 07_segmentation/
文件夹中。
数据集的下载地址可参考下表:
数据集 | 下载地址 |
---|---|
ImageNet | https://www.image-net.org/download.php |
COCO | https://cocodataset.org/ |
VOC | http://host.robots.ox.ac.uk/pascal/VOC/ (需要下载2007和2012两个版本) |
Cityscapes | https://github.com/mcordts/cityscapesScripts |
为方便您进行后续步骤,在数据集下载完成后,您需要按照如下地平线建议的结构对评测数据集进行处理。
数据集 | 说明 |
ImageNet数据集 | 我们建议您将下载的数据集解压成如下结构,数据准备过程中如遇问题请联系地平线。 |
COCO数据集 | 我们建议您将下载的数据集解压成如下结构,数据准备过程中如遇问题请联系地平线。 |
VOC数据集 | 请注意: |
Cityscapes数据集 | 我们建议您将下载的数据集解压成如下结构,数据准备过程中如遇问题请联系地平线。 |
在使用模型转换示例包时,请您先准备好对应的浮点模型。
OE包默认不携带示例对应的校准数据集和原始模型,您需要在对应的示例文件夹内执行 00_init.sh
获取当前示例所需的模型和校准数据集。
对于各原始模型的来源、修改点(如有)的准备过程,请您参考以下内容。
md5sum码:
md5sum | File |
---|---|
3fd6889ec48bda46451d67274144e2a8 | mobilenet.caffemodel |
8922f90f629d428fecf866e798ac7c08 | mobilenet_deploy.prototxt |
md5sum码:
md5sum | File |
---|---|
54aab8425ea068d472e8e4015f22360c | mobilenet_v2.caffemodel |
13101ee86ab6d217d5fd6ed46f7a4faa | mobilenet_v2_deploy.prototxt |
模型来源:https://pytorch.org/vision/main/models/generated/torchvision.models.resnet50.html
md5sum码:
md5sum | File |
---|---|
ebaeb70c972d1a3e6eb06c0e1541eeb4 | resnet50.onnx |
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/GoogleNet
md5sum码:
md5sum | File |
---|---|
f107ae6806ea1016afbc718210b7a617 | googlenet.onnx |
为了快速运行示例,避免使用第三方工具带来的风险,强烈推荐您直接使用地平线模型发布物 model_zoo/mapper/ 路径下准备好的ONNX浮点模型。如果您有兴趣复现tflite2onnx的模型转换过程,也可以尝试使用以下三方工具。但地平线无法保证第三方工具的质量和转换成功率。
模型来源:可从 https://github.com/tensorflow/tpu/tree/master/models/official/efficientnet/lite 获取tar包。
地平线模型发布物中转换后的ONNX模型md5sum码:
md5sum | File |
---|---|
001a329bd367fbec22b415c7a33d7bdb | efficientnet_lite0_fp32.onnx |
1205e95aea66650c71292bde236d55a9 | efficientnet_lite1_fp32.onnx |
474741c15494b79a89fe51d89e0c43c7 | efficientnet_lite2_fp32.onnx |
550455b41848d333f8359279c89a6bae | efficientnet_lite3_fp32.onnx |
bde7fe57eadb4a30ef76f68da622dcd5 | efficientnet_lite4_fp32.onnx |
下载后可从tar包中得到 .tflite
文件,然后可通过tflite2onnx工具 将tflite转换为ONNX模型。
不同版本的tflite2onnx转换出来的layout会不一样,若转换出来的ONNX模型的输入layout是NHWC排布,则build时,EfficientNet_Lite0/1/2/3/4的 input_layout_train
均应该选择 NHWC
。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/VargConvNet
md5sum码:
md5sum | File |
---|---|
e21b8db17916f9046253bbe0bb8de3ef | vargconvnet.onnx |
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/EfficientnasNet
md5sum码:
md5sum | File |
---|---|
fc36c052c6f034c0b64a6197b91b0c62 | efficientnasnet-m.onnx |
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/EfficientnasNet
md5sum码:
md5sum | File |
---|---|
e2744bd748f4265f4488676835a6ca24 | efficientnasnet-s.onnx |
模型来源:https://pytorch.org/vision/main/models/generated/torchvision.models.resnet18.html
md5sum码:
md5sum | File |
---|---|
62de4ff68317c65ab4bb6a451e719e6d | resnet18.onnx |
为了快速运行示例,避免使用第三方工具带来的风险,强烈推荐您直接使用地平线模型发布物 model_zoo/mapper/ 路径下准备好的Caffe浮点模型。如果您有兴趣复现darknet2caffe的模型转换过程,也可以尝试使用以下三方工具。但地平线无法保证三方工具的质量和转换成功率。
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
该转换工具(darknet2caffe)是一个简化版本,使用时,需要修改该工具生成的.prototxt文件,将其中的 'Reshape'
层修改成 'Passthrough'
层, Passthrough 层具体修改后的参数请见提供的yolov2.prototxt例子,并在输出节点增加一个NCHW2NHWC的Permute操作。
md5sum码:
md5sum | File |
---|---|
7aa7a6764401cebf58e73e72fcbd2a45 | yolov2.caffemodel |
72e9a51c1e284e4b66e69f72ca9214c8 | yolov2_transposed.prototxt |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
URL:https://github.com/ChenYingpeng/caffe-yolov3/ ,caffemodel可以在该github的README.md提供的百度云下载路径中下载,并在输出节点增加一个NCHW2NHWC的Permute操作。
md5sum码:
md5sum | File |
---|---|
935af6e1530af5c0017b3674adce95e9 | yolov3_transposed.prototxt |
9a0f09c850656913ec27a6da06d9f9cc | yolov3.caffemodel |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
在clone代码时,请确认您使用的Tags是v2.0,否则将导致转换失败。
md5sum码:
md5sum | File |
---|---|
2e296b5e31bf1e1b6b8ea4bf36153ea5 | yolov5l.pt |
16150e35f707a2f07e7528b89c032308 | yolov5m.pt |
42c681cf466c549ff5ecfe86bcc491a0 | yolov5s.pt |
069a6baa2a741dec8a2d44a9083b6d6e | yolov5x.pt |
去除了每个输出分支尾部从4维到5维的reshape(即不将channel从255拆分成3x85),然后将layout从NHWC转换成NCHW再输出。
以下左图为修改前的模型某一输出节点的可视化图,右图则为修改后的对应输出节点可视化图。
在使用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。
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
SSD_MobileNetv1模型:可以从URL:https://github.com/chuanqi305/MobileNet-SSD 获得Caffe模型。
md5sum码:
md5sum | File |
---|---|
bbcb3b6a0afe1ec89e1288096b5b8c66 | mobilenet_iter_73000.caffemodel |
3c230e4415195a50c6248be80c49882d | MobileNetSSD_deploy.prototxt |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/EfficientDet
md5sum码:
md5sum | File |
---|---|
ec4129c4b300cd04f1e8f71e0fe54ca5 | efficientdet_nhwc.onnx |
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/Centernet
md5sum码:
md5sum | File |
---|---|
db195ff784792f475e573c5126401d2a | centernet_resnet101_coco_modify.onnx |
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/blob/master/Fcos_Efficientnetb0
md5sum码:
md5sum | File |
---|---|
9f9a1fe8508e2bd068e70146eb559b4f | fcos_efficientnetb0.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/YoloV4
md5sum码:
md5sum | File |
---|---|
aaa3c3e5e4c4c1d4830b6501b1720e4d | yolov4_efficientnetb0.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
URL:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/Yolov3_VargDarknet , 可以在该github的README.md提供的百度云下载路径中下载。
md5sum码:
md5sum | File |
---|---|
fd4e46bc7c9798b51778d3aa09c5053a | yolov3_vargdarknet53.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/Fcos_Resnet50
md5sum码:
md5sum | File |
---|---|
0218942777615fac2f54cefdac4fbfa7 | fcos_resnet50.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/Fcos_Resnext101
md5sum码:
md5sum | File |
---|---|
4b80efd22448021721ac5a860909c59f | fcos_resnext101.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Dequantize节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/MobilenetUnet
md5sum码:
md5sum | File |
---|---|
21c6c645ebca92befbebc8c39d385c1e | tf_unet_trained.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Reshape和Cast节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/DeeplabV3Plus
md5sum码:
md5sum | File |
---|---|
cf3a683f31b4b0ebe090647729f869d9 | deeplabv3plus_efficientnetb0.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Reshape和Cast节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/FastSCNN
md5sum码:
md5sum | File |
---|---|
c1ace8f08a9c7b9c91509fa68327d0c8 | fastscnn_efficientnetb0.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Transpose节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/DeeplabV3Plus
md5sum码:
md5sum | File |
---|---|
ad002e572cbb49e1e99d893aac69f3e3 | deeplabv3_cityscapes_dila1248_permute.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Reshape、Cast和Transpose节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/DeeplabV3Plus
md5sum码:
md5sum | File |
---|---|
0a1dfd01e173c68630d9e8dc1a6036fe | deeplabv3plus_efficientnetm1.onnx |
为保证板端性能达到最优,在编译hbm模型的yaml文件中我们对 remove_node_type 参数进行了配置,将hbm模型中的Reshape、Cast和Transpose节点做了删除的操作。
模型来源:https://github.com/HorizonRobotics-Platform/ModelZoo/tree/master/DeeplabV3Plus
md5sum码:
md5sum | File |
---|---|
c11a2673c4b3cf6e5d7bf1a051925d38 | deeplabv3plus_efficientnetm2.onnx |
本小节以 Resnet50 模型为例,使用算法模型示例包中 03_classification/03_resnet50/
路径下脚本分步骤演示浮点模型到定点模型转换的过程。
首先,根据 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。
在同一路径下继续执行 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文件上板精度无法对齐的情况,建议您优先检查模型输入是否一致。 由于执行定点模型评估脚本时,使用到的是图片类型的数据集;而上板使用到的hbm模型,需要使用hb_eval_preprocess工具转换后的二进制数据集。 基于此点,如果您在上板时使用的数据集并非通过上述方式生成的,我们建议您先在运行定点模型的精度的相同服务器上,使用我们的数据预处理工具(即hb_eval_preprocess工具)重新生成上板需要的数据集,重跑上板精度,以保证模型输入一致。
注意,在使用hb_eval_preprocess工具生成数据集和运行定点模型精度时,两者使用的环境需要保证一致。