接上文,既然lite 推理走不通,那就走ONNX推理把。
然后看到了下面的说明。
- 当前并非所有mindyolo均支持ONNX导出和推理(仅以YoloV3为例)
- 当前仅支持Predict功能
- 导出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,不知道最终能有什么样的效果)
我先去看看视频处理相关方法。
未完待续~













