转换方法
有两个主流的方法
-
onnx->Caffe Model->om(最主流)
-
onnx->om
使用第一种方法看似麻烦,多了一步,但其实这种转换方式的好处有很多 -
可以通过修改prototxt的方式实现对网络结构的修改,可以添加一些本没有的算子,故可操作性高
-
Caffe支持的算子更多
-
实现同样的功能,使用这种方式进行转换的效率会更高(因为我们可以通过编辑算子的方式来让网络进行某些循环操作,比起手写For循环肯定快得多)
-
在使用昇腾硬件(例如Atlas200)进行模型推理的时候,首先需要使用ATC工具将原始模型转换为适合昇腾硬件的模型(.om),支持原始框架类型为Caffe、TensorFlow、MindSpore、ONNX的模型转换,其中ONNX可以看做是一个中间模型,如果其他模型可以转换为ONNX模型那么也可以在使用ATC进行模型转换,例如pytorch模型转换为ONNX模型,ONNX模型再转换为.om文件。
使用第一种方法转换过程(以YOLOv4为例)
首先,我们要有onnx模型,即PyTorch的训练模型以.pth的方式存储,先通过指令将其转为onnx,随后将onnx转为Caffe文件(使用convertCaffe.py文件,该文件在github上有)。随后对prototxt文件进行修改(添加一些layer层实现自定义算子的功能),随后使用如下指令进行转换
Caffe->om常用参数及指令解释
–model:原始模型文件路径与文件名
–weight:权重文件路径与文件名
–framework:原始模型框架:0是caffe,1是mindspore,3是tensorflow,5是onnx
–input_format:输入数据格式:Caffe默认为NCHW,TensorFlow默认为NHWC
–dynamic_image_size:设置输入图片的动态分辨率参数。适用于执行推理时,每次处理图片宽和高不固定的场景。
–output:存放转换后的离线模型的路径以及文件名
–soc_version:模型转换时指定芯片版本。
–insert_op_conf:插入算子的配置文件路径与文件名,例如aipp预处理算子(包含了图像预处理比如色域转换、减均值等)。
- 例子:
atc --model=yolov5.prototxt --weight=yolov5.caffemodel --framework=0 --output=yolov5s_caffe2om --soc_version=Ascend310 --insert_op_conf=aipp_nv12.cfg
对模型yolov4.prototxt和权重yolov5.caffemodel的caffe原始模型进行转换,framework为0表示caffe,输出文件名字为yolov5s_caffe2om.om,推理芯片选择Ascend310,算子配置文件为aipp_nv12.cfg。
onnx->om指令
atc --model=yolov5.onnx --framework=5 --output=yolov5 --input_format=NCHW --log=info --soc_version=Ascend310 --input_shape="input:1,3,608,608" -out_nodes="feature_map_1;feature_map_2;feature_map_3"
对名为yolov5的模型进行转换,framework为5表示onnx,输出文件名字为yolov5.om,,日志等级为info,推理芯片选择Ascend310,输入和输出的格式如图所示。
运行过程
首先要搞清楚一点,Atlas开发板仅仅只是程序真正进行推理运行的环境,所以我们在开发板上唯一需要做的就是将在Linux环境下编译好的程序上传上去,然后执行脚本运行,为了方便我们就在官方demo给的文件夹下运行。
执行以下命令将转换好的模型复制到样例中model文件夹中。
cp ./yolov5.om $HOME/samples/cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_picture/model/
执行以下命令,执行编译脚本,开始样例编译。
cd $HOME/samples/cplusplus/level2_simple_inference/2_object_detection/YOLOV3_coco_detection_picture/scripts
bash sample_build.sh
这里注意,这个build的脚本里有好多内容都是要改的,就比如运行文件名称、路径等。
运行build之后,会让填arm还是x86,我们填运行环境arm