我在做一个病虫害识别的的小玩意,用的是YOLO-fastestv2
我根据某位老哥的方法,导出了ONNX文件https://blog.csdn.net/weixin_47296244/article/details/120943801
但是同时我有很多问题
1,我在用它的方法测试使用,命令行可以输出预测时间,但是没有反馈图片
2,我在用这个ONNX文件导入STM32CUBEMX转为底层库函数时候出现INTERNAL ERROR: Shape with 0 value [0, 24, 44, 44],可以看出这个是张量有问题,我试着导出原版检测ONNX给他的但是结果还是一样,我应该怎么解决这个问题
3,我并不知道其格式位,这个CUBEMX只支持INT8和FP32,如果出现格式不匹配我又应该如何处理
先说格式问题。格式这个可以选择导出对应的格式的onnx,或者应该你用的库有转onnx格式的功能,类似于onnxruntime就可以在推理的时候选择推理的格式。正常来说一般都是FP32的格式,除非你这个格式速度跟不上你的需求才回去考虑int8的问题,不然我建议你先将FP32的运行跑通再去考虑int8的问题。
第二,你的shape报错的意思是第一维度不能为0.也就是你的batch size至少要为1才对,一般图片是三维的,[c,H,W] ,而网络都是4维度的输入,就是多了一个batch size的维度,也就是[N,C,H,W]或者[N,H,W,C],后者是channel 在后的模式,一般是tensorflow用的多,pytorch一般是channel在前。所以你需要检查一下你这里的升维是否正确
这个问题可能由于以下几个原因造成:
解决方法如下:
在导出ONNX文件时,检查模型输出节点的设置是否正确。确保输出节点设置中包含了预测图片的信息。
可以通过以下方式检查模型输出节点:
import onnx
model_path = 'path/to/model.onnx'
model = onnx.load(model_path)
for output in model.graph.output:
print(output.name, output.type)
确保输出的结果中包含了预测图片的信息。
检查命令行中传入的测试图片路径是否正确。确保图片存在并且路径正确。
这个问题可能由于以下几个原因造成:
解决方法如下:
在导出ONNX文件时,检查模型输入节点的形状设置是否正确。确保输入节点的形状设置与模型的输入形状一致。
可以通过以下方式检查模型输入节点的形状设置:
import onnx
model_path = 'path/to/model.onnx'
model = onnx.load(model_path)
for input in model.graph.input:
print(input.name, input.type)
确保输入的结果与模型的输入形状一致。
检查输入的测试图片的尺寸是否与模型的输入形状匹配。确保测试图片的尺寸与模型的输入形状一致。
如果测试图片的尺寸与模型的输入形状不匹配,可以尝试调整测试图片的尺寸使其与模型的输入形状一致。
如果不确定模型的格式是INT8还是FP32,可以通过以下方式检查模型的格式:
在导出ONNX文件时,可以查看模型的数据类型。
可以通过以下方式检查模型的数据类型:
import onnxruntime as ort
model_path = 'path/to/model.onnx'
session = ort.InferenceSession(model_path)
print(session.get_inputs()[0].type, session.get_outputs()[0].type)
结果会显示输入节点和输出节点的数据类型。可以根据输出结果来确定模型的数据类型。
import onnx
import onnxruntime as ort
# 检查模型输出节点设置
def check_output_nodes(model_path):
model = onnx.load(model_path)
for output in model.graph.output:
print(output.name, output.type)
# 检查模型输入节点设置
def check_input_nodes(model_path):
model = onnx.load(model_path)
for input in model.graph.input:
print(input.name, input.type)
# 检查模型的数据类型
def check_model_data_type(model_path):
session = ort.InferenceSession(model_path)
print(session.get_inputs()[0].type, session.get_outputs()[0].type)
model_path = 'path/to/model.onnx'
# 检查模型输出节点设置
check_output_nodes(model_path)
# 检查模型输入节点设置
check_input_nodes(model_path)
# 检查模型的数据类型
check_model_data_type(model_path)
请根据上述方法检查并解决问题,如果问题仍然存在,请提供更多的详细信息以便进一步帮助解决。