MindSpore应用系列:树莓派上运行YOLOv5进行实时目标检测(五)

接上文,既然lite 推理走不通,那就走ONNX推理把。

然后看到了下面的说明。


  1. 当前并非所有mindyolo均支持ONNX导出和推理(仅以YoloV3为例)
  2. 当前仅支持Predict功能
  3. 导出ONNX需要调整nn.SiLU算子,采用sigmoid算子底层实现例如:添加如下自定义层并替换mindyolo中所有的nn.SiLU

mindyolo/models/layers/activation.py

有现成的定义

于是就搜索所有用到nn.SiLu的地方,手动替换成上面的Swish

mindyolo/models/layers/conv.py

让后导出为onnx

导出成功后执行推理。

这个错在mindyolo里面遇到好多次了,默认device type都是Ascend,不想传参,直接该默认值。

这个错有点莫名其妙啊。涉及模型结构的,只能用工具打开转换后的模型看看了。

打开工具,就是下面这个网站。可以直接打开模型。

然后找到上面报错的节点,8BatchNormalization. 然后看它的输入,上面一排cast输出是float16,最右边cast输出float32

问题就在这里了。然后看网络结构,定义的时候没有cast操作啊

这个只可能是导出的时候给加上的,

看了下导出里面有个配置是 精度转换相关的。

parser.add_argument(“–ms_amp_level”, type=str, default=“O0”, help=“amp level, O0/O1/O2”)

amp level的含义见如下说明。

amp_level (str) - 支持[“O0”, “O1”, “O2”, “O3”]。默认值: "O0" 。

“O0” - 不变化。

“O1” - 仅将白名单内的Cell和算子转换为低精度运算,其余部分保持全精度运算。

“O2” - 黑名单内的Cell和算子保持全精度运算,其余部分都转换为低精度运算。

“O3” - 将网络全部转为低精度运算。

复制

我导出的时候没有设置该参数,模式又是O0, 也就是不转换。怎么最终导出的模型加上了转换呢?

简单粗暴的方法是注释掉导出中关于 精度转换的代码。

然后再次导出onnx模型。

这回就对了…

然后进行onnx的推理。

需要先安装依赖。

pip install onnx>=1.9.0
pip install onnxruntime>=1.8.0

复制

5n的推理耗时440ms左右。估计视频可以做到1s 刷新一次检测的结果框图。(估计视频处理也会占用cpu,不知道最终能有什么样的效果)

我先去看看视频处理相关方法。

未完待续~