This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] AM62A7-Q1:这是尝试加载 edgeyolov5模型时的查询

Guru**** 2455360 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1481981/am62a7-q1-this-is-an-inquiry-when-trying-to-load-the-edgeyolov5-model

器件型号:AM62A7-Q1

工具与软件:

当尝试在 TI 电路板上加载 edgeyolov5模型 yolov5m6_640_ti_lite_44p1_62p9模型时、将会提出查询。
使用"python3 onnxrt_ep.py -c"命令转换 yolov5m6_640_ti_lite_44p1_62p9.onx 模型后、将创建一个 bin 文件。


yolov5m6_640_ti_lite_44p1_62p9.onx"python3 onnxrt_ep.py -c"转换为时、它被转换为 subgraph_0_tidl_net.bin 文件。
当我尝试在 TI 电路板上加载它时、我确认如果 onnx 文件存在、它会加载并工作正常。
但是、当我删除 onnx 文件时、 显示一条消息、指出还需要 yolov5m6_640_ti_lite_44p1_62p9.onnx 模型。

在 TIDLExecutionProvider 模式下加载模型时、我想通过仅加载没有 onnx 文件的 bin 文件来询问是否可以实现推理。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Kim、

    我们的 TIDL 专家今天也会到场。 请预计会有一些响应延迟。

    此致、

    建中

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Kim、

    我理解这个疑问。 您已成功编译模型以生成 TIDL 兼容的二进制文件、但当.ONNX 被删除时、TIDLExecutionProvider 将失败。  

    这是预期行为。 要使用 ONNXRuntime API、必须存在 ONNX 模型。 使用 TIDLExecutionProvider 时、将用于搜索工件目录并查找用于标识将加速哪些层的文件(allowedNode.txt)。 任何未列出的图层都将默认返回到 CPUExecutionProvider。

    要 仅使用.bin 文件、必须使用 TIDL-RT 接口。 edgeai-tidl-tools/examples/tidlrt_cpp 中有一个示例。 此接口仅适用于 C/C++(无 python)。 我们对 AM62A 上此接口的支持有限、但类似 J7/TDA4器件的用户指南/文档适用于 AM62A (相对于 TIDLRT)

    BR、
    Reese

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    非常感谢您的回答。
    
    我检查过、代码用于分类。
    
    您能否提供运行 yolov5m6_640_ti_lite_44p1_62p9模型所需的 cpp 和 h 文件?
    
    该模型是一种物体检测模型。 
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    正确、该示例用于分类网络。 我们的 TIDL-RT 示例有限、因为此 API 比 Onnx 运行时/TFlite 等 OSRT 接口受支持较少。

    对于物体检测网络、edgeai-tidl-tools 中没有 TIDL-RT 参考代码。 您可以修改分类示例以匹配 yolov5网络的输入和输出大小、并且需要添加一些后处理代码以设置输出色度的格式、从而提取边界框信息。  

    我可以向您指出一些用 C 代码处理此输出后处理的实例、但除此之外、您查找的示例不存在。

    我能不能问为什么在您的案例中需要 TIDL-RT? 是否消除对原始 ONNX 模型的需求?

    BR、
    Reese

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如果您能告诉我一些后处理 C 代码、以设置输出亮度格式、提取边界框信息、我会很感激。

    onnx 文件很大、因此我需要在更新模型文件时减小大小。

    请...

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    状态=预处理映像 (s->input_image_name、(uint8_t*) in[j]->ptr、384,640、3、 s->input_mean、s->input_std);

    我需要上面代码的后部分。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    status = preprocImage (s->input_image_name、(uint8_t*) in[j]->ptr、384,640、3、 s->input_mean、s->input_std);

    我需要上面代码的后半部分。

    您是否指的是此函数的源? 它位于 tidlrt_cpp/classification.cpp 文件中:  

    [报价 userid="618810" url="~/support/processors-group/processors/f/processors-forum/1481981/am62a7-q1-this-is-an-inquiry-when-trying-to-load-the-edgeyolov5-model/5705793 #5705793"]

    如果您能告诉我一些后处理 C 代码、以设置输出亮度格式、提取边界框信息、我会很感激。

    [报价]

    当然。 最佳参考可能是后处理 TIOVX 内核的内部参考。 这将接受来自图中上一个节点的一组缓冲器-对于 TIDLRT、您可以从 IO 设置期间提供的输出指针集直接获得此输出

    了解为何必须删除 ONNX 文件。  

    BR、
    Reese

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。


    float input_mean = 0.0;
    float input_std = 1.0;
    状态=预处理映像 (input_image_name、(uint8_t*) in[j]->ptr、640,384、3、 input_mean、input_std);
    日志(info)<<"已调用\n";
    for (int i = 0;i < loop_count;i++)

    TIDLRT_invoke (handle、in、out);
    }
    log(info)<<已调用成功\n";

    常量浮点阈值= 0.5f;//物体检测置信度阈值

    float* output =(Float*)out[j]->ptr;
    int num_detections = 100;//假设检测次数最多为100次

    std::vector<std::array >方框;
    std::vector 得分;
    std::vector 标签;

    对于(int i = 0;i < num_detections;i++){
    float score = output[i * 6 + 4];
    int label =(int) output[i * 6 + 5];

    std::array 框中;

    Box[0]= output[i * 6 + 0];// xmin
    Box[1]= output[i * 6 + 1];// ymin
    Box[2]= output[I * 6 + 2];// Xmax
    Box[3]= output[i * 6 + 3];// ymax


    if (box[0]==-1 && box[1]==-1 && box[2]==-1 && box[2]==-1 && box[3]==-1){
    printf ("end object\n"、i);
    休息;
    }

    boxs.push_back (box);
    scores.push_back (score);
    labels.push_back (label);
    }


    iltered Output:87、41,225,398、0.00881985、 0 (人)
    镀层输出:153、43,294,397、0.00781274、 0 (人)
    iltered Output:154,254,293,585、0.00689718、 0 (人)
    镀层输出:17,212,158,484、0.00689718、 0 (人)
    镀层输出:95,264,216,575、0.00689718、 0 (人)
    滤光输出:23、45,161,402、0.00680563 0 (人)
    镀膜输出:222,245,360,602、0.0061037、 0 (人)
    镀层输出:154、2,293,205、0.00601215、 0 (人)
    镀层输出:226、41,364,398、0.00601215、 0 (人)
    镀层输出:-3192、98,503、0.00589007、 0 (人)
    镀层输出:333,333,383,598、0.00579852、 0 (人)
    镀层输出:90、2,229,205、0.00531022、 0 (人)
    镀层输出:-3、12、98,284、0.00521867、 0 (人)
    镀层输出:1187、52,420、0.004944、 0 (人)
    镀层输出:293、0,379,311、0.00476089、 0 (人)
    镀层输出:281,328,384,639、0.00427259、 0 (人)
    镀层输出:285,178,387,532、0.00415052、 0 (人)
    石墨输出:7,348,168,626、0.00415052、 0 (人)
    滤光输出:-2、7、57,212、0.00402844、 0 (人)
    iltered Output:61,201,154,406、0.00402844、 0 (人)
    陶瓷输出:325、41,384,374、0.00396741、 0 (人)
    陶瓷输出:17、2,158,205、0.00372326、 0 (人)
    镀层输出:225、2,366,205、0.00372326、 0 (人)
    镀层输出:193,217,286,450、0.0036317、 0 (人)
    镀层输出:161,189,254,422、0.0036317、 0 (人)
    陶瓷输出:97,281,187,462、0.0036317、 0 (人)
    陶瓷输出:227,217,316,454、0.0036317、 0 (人)
    陶瓷输出:3372、92,627、0.00357067、 0 (人)



    上面是我创建的物体检测结果的输出代码。 输入是其中有一个人的照片。 但是、坐标结果和坐标结果值的数量很奇怪。 可能是与 onnx 文件推导的 Python 代码正常工作,但仅与 bin 文件推导的 C 代码丢失了 onnx 文件,导致了奇怪的结果? 或者它是因为我的代码错误吗? 如果是后者、您能否查看我的代码的问题?  

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好!

    通常会有许多其他低置信度盒子。 这通常是由模型中的 NMS 抑制的——该参数在模型编译期间使用的 prototxt 范围内。

    如果您将框绘制到图像上、结果是否合理? 下图显示了 NMS 生成过多与目标对象部分重叠的框的典型情况 (从 google):

    这些价值观似乎是现实的,但我同意有太多的,它们都是非常低的信心。 prototxt 通常也具有置信阈值、这样在 TIDL 的模型输出中甚至不会出现低于(例如0.3)的置信阈值。

    [报价 userid="618810" url="~/support/processors-group/processors/f/processors-forum/1481981/am62a7-q1-this-is-an-inquiry-when-trying-to-load-the-edgeyolov5-model/5708940 #5708940"]

    int num_detections = 100;//假设检测次数最多为100次

    [报价]

    请注意、采用 TIDL 的网络的输出大小始终是固定的。 您应该能够在模型的子图 SVG 文件中看到此内容。 默认为200个箱子/次检测