关于#YOLO#模型导入STM32CUBE的问题,如何解决?

我在做一个病虫害识别的的小玩意,用的是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在前。所以你需要检查一下你这里的升维是否正确

不知道你这个问题是否已经解决, 如果还没有解决的话:
  • 以下回答来自chatgpt:

    回答

    问题1: 命令行可以输出预测时间,但没有返回预测图片

    这个问题可能由于以下几个原因造成:

    1. 模型的输出节点没有正确设置,导致没有返回预测图片。
    2. 输入的测试图片路径不正确。

    解决方法如下:

    检查模型输出节点的设置

    在导出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)
    

    确保输出的结果中包含了预测图片的信息。

    检查测试图片路径

    检查命令行中传入的测试图片路径是否正确。确保图片存在并且路径正确。

    问题2: INTERNAL ERROR: Shape with 0 value [0, 24, 44, 44]问题

    这个问题可能由于以下几个原因造成:

    1. 模型的输入节点的形状设置有误,导致出现了0值的形状。
    2. 输入的测试图片的尺寸与模型的输入形状不匹配。

    解决方法如下:

    检查模型输入节点的形状设置

    在导出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)
    

    确保输入的结果与模型的输入形状一致。

    检查测试图片的尺寸

    检查输入的测试图片的尺寸是否与模型的输入形状匹配。确保测试图片的尺寸与模型的输入形状一致。

    如果测试图片的尺寸与模型的输入形状不匹配,可以尝试调整测试图片的尺寸使其与模型的输入形状一致。

    问题3: 不确定模型的格式

    如果不确定模型的格式是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)
    

    请根据上述方法检查并解决问题,如果问题仍然存在,请提供更多的详细信息以便进一步帮助解决。


如果你已经解决了该问题, 非常希望你能够分享一下解决方案, 写成博客, 将相关链接放在评论区, 以帮助更多的人 ^-^