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.

[参考译文] SK-TDA4VM:问题编译自定义模型

Guru**** 2466550 points
Other Parts Discussed in Thread: SK-TDA4VM

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1102967/sk-tda4vm-issue-compiling-custom-model

器件型号:SK-TDA4VM

您好!

我和我的团队一直在使用 edgeeai-Benchmark 工具来编译自定义对象检测模型、以便与 SK-TDA4VM 电路板上的 EdgeAI 应用程序配合使用。 我们当前尝试使用效率检测点0的自定义模型作为对某些数据进行调整的基础。 我们使用基准工具(例如 efficentdet-lite0_Bifpn_maxpool2x2_Relu_ti-lite)成功编译并运行了从 modelzoo 提取的类似模型、与 modelzoo 上的 efficientdet 模型非常相似、我们在开始修整之前将模型的激活类型更改为 Relu。

将模型导出为丝墨格式并按照 github.com/.../custom_models.md 中的说明进行操作后、我们创建了以下管道配置设置、该设置使用 coco 作为输入和校准数据集:

'od-xxxx': utils.dict_update(common_cfg,
            preprocess=preproc_transforms.get_transform_tflite((320, 320), (320, 320), backend='cv2'),
            session=tflite_session_type(**utils.dict_update(tflite_session_cfg, input_mean=(127.0,  127.0,  127.0), input_scale=(1.0/128.0, 1.0/128.0, 1.0/128.0)),
                runtime_options=utils.dict_update(runtime_options_tflite_np2, {'object_detection:meta_arch_type': 5, 'object_detection:meta_layers_names_list':f'{settings.models_path}/d0-lite_mod.prototxt'}),
                model_path=f'{settings.models_path}/d0-lite_mod.tflite'),
            postprocess=postproc_transforms.get_transform_detection_tflite( normalized_detections=False, ignore_index=0, resize_with_pad=False),
            metric=dict(label_offset_pred=datasets.coco_det_label_offset_90to90(label_offset=0)),
            model_info=dict(metric_reference={'accuracy_ap[.5:.95]%':31.57})

我们使用的 prototext 文件主要是 modelzoo prototex 的副本、唯一的变化是 TOP_k、检测阈值和输入尺寸值。 当尝试使用此配置编译模型时、会出现以下错误:

DIM Error - For Tensor 0, Dim 1 is 0

随后出现分段故障。 我们也会得到相同的尺寸误差、但它不是0、而是显示 Dim 1是一些较大的负数。

为了避免崩溃、我们通过删除元层名称列表选项修改了上述管道配置。 此修改确实允许脚本在不崩溃的情况下完成,但这样做会导致脚本自动生成元管道数据:

TIDL Meta PipeLine (Proto) File  :   

Number of OD backbone nodes = 0 
Size of odBackboneNodeIds = 0 

 Number of subgraphs:2 , 306 nodes delegated out of 363 nodes 

这是不正确的、原因有很多(没有对任何 OD 主干节点进行计数、标识了2个子图、而不是每个节点委派)、而且毫不奇怪、推理计算的结果非常差:

Average Precision  (AP) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.50      | area=   all | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.75      | area=   all | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000
Average Precision  (AP) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=  1 ] = 0.000
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets= 10 ] = 0.000
Average Recall     (AR) @[ IoU=0.50:0.95 | area=   all | maxDets=100 ] = 0.000
Average Recall     (AR) @[ IoU=0.50:0.95 | area= small | maxDets=100 ] = 0.000
Average Recall     (AR) @[ IoU=0.50:0.95 | area=medium | maxDets=100 ] = 0.000
Average Recall     (AR) @[ IoU=0.50:0.95 | area= large | maxDets=100 ] = 0.000

对编译的模型进行封装并在电路板上运行会导致非常不连贯的帧速率、而不会检测到任何物体。 尝试使用效率为 det-lite1的模型作为基体执行相同的过程、但在推理过程中只检测到大量误报。 这些结果不受 SETTINGS 中配置的影响。YAML。

我们的 prototext 或流水线配置是否会导致尺寸误差或不良推理结果的缺失、或者问题是否出在我们的模型中以及 TIDL 工具如何解读?

谢谢、

Andrew

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

    尊敬的 Andrew:

    主要问题是:

    >>当尝试使用此配置编译模型时,会出现以下错误:

    >> DIM 错误-对于 Tensor 0,Dim 1为0

    >>随后出现分段故障。

    您能否 像我们在另一个线程中所做的那样添加 input_optimization=False 并查看它是否有用:(https://e2e.ti.com/support/processors-group/processors/f/processors-forum/1099374/sk-tda4vm-efficientdet-lite1_relu-and-efficientdet-lite3_relu-compilation/4083019#4083019)

    请注意、我想通知您我们在此处发布的最新工具: https://github.com/TexasInstruments/edgeai-modelmaker 它有一个端到端模型开发流程、包括模型培训和编译(注释尚未集成、但我们支持外部工具)。  很容易上手。 当前仅支持命令行。  您将是第一个尝试的人、因此会遇到一些问题-但如果您尝试、期待您的反馈。

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

    输入优化=错误时、我们会得到相同的错误。

    感谢您分享 edgeai-modelMaker 工具。  我的团队正在尝试、如果有任何反馈、我们会告诉您。

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

    您好、Manu、

    edgeai-modelzoo 的 TensorFlow 模型最终是否会集成到 edgei-modelMaker 中?

    此致、

    Andrew

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

    我们添加的所有软件包都必须安装在同一 Python 环境中。 因此、很难同时安装基于 Py火炬 和 Tensorflow 的存储库。 它可能起作用、但长期而言很难维持。 因此、我们可能不会尝试将基于 Tensorflow 的培训添加到 edgeeai-modelMaker 中。

    但需要增加对更多任务的支持(例如、 语义分割、键点检测等)。

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

    尊敬的 Andrew:

    只是好奇——到目前为止,它是如何与电子模型制作者合作的?

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

    为了帮助您正确导出 efficientdet-lite 模型、我在我的同事 Debu 中进行了循环。 他也许能够在这里提供帮助,因为他已经做过一次。  

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

    以下是我的团队中一位成员的总结、他与 edgae-modelMaker 合作了更多、讨论了哪些工作有效以及遇到的问题:

    ModelMaker 到目前为止在其工作目标方面都做得很好。 我们成功地使用此工具培训和编译了各种物体检测模型、所有这些模型都执行了可以在 TDA4上顺利运行的高效推理。 我们团队成功完成的数据集和基本模型检查点组合如下:
    
    Coco Dataset:ssd_mobilenetv2_FPn_lite_mmdet
    custom_data:ssd_regnetx_800mf_FPN_BGR_lite_mmdet
    custom_data:yolox_sle_mmregtet
    Iscapes driving:ssd_enetx_tv2_tv2_mmdet_tn
    
    yolox_s_lite_mmdet
    
    培训是在30个环氧树脂、8个批量大小、1e-05初始学习速率和1个 GPU (4GB-12GB)的情况下完成的。 编译是使用8个 tensor 位完成的。 所有成功数据/模型对的最终推理报告了映射[.5-.95]> 10%。
    
    此外、我们团队的一名成员能够向管道添加不同的焊枪检查点(不同于工具上已有的六个检查点)、并从其中编译成功的模型
    
    使用此工具时遇到了一些问题、 但幸运的是、到目前为止、它们都可以修复。 我们遇到的问题以及所做的必要修复如下:
    
    ERROR- ONNXRTSession 没有属性 GET_RUN_DIR。
    这发生在 modelMaker 目录中 edgeai-benchmark.py 的第166行上。 仅发生在一台机器上。 我们认为之所以发生这种情况是因为 modelMaker 安装在已经包含 edgeeai-benchmark 的目录中。 在清理目录中克隆和安装 modelMaker 解决了此错误。
    
    错误-编译的模型在 param.yaml 中创建空白 label_offset_pred 参数。 这种情况发生在每台机器上。 修复方法只是在电路板上运行推理之前手动创建该参数。 由于我们的电路板测试是使用边缘 AI 应用程序完成的、因此在 classnames.py (或 edgeai_classnames.cpp)内创建用于命名字典的标签 ID 也是后处理器正常工作所必需的、但我们认为该部件是预期的行为。 错误-尝试使用 Pascal 数据集训练模型时、总是会抛出 CUDA Out of memory 错误。 4GB 和12GB 计算机都出现了这种情况。 我们认为这是一个错误、因为无论批次大小设置如何、都会引发错误、并且这些相同的机器能够毫无问题地训练和编译大得多的 Coco 数据集。 无论 Pascal 是通过 modelMaker 工具下载还是手动导入,都将出现错误。 错误-克隆 repo 会破坏 data/examples 目录中的每个 zip 文件数据集。 因此、无法加载动物分类、动物检测和 tiscapes2017_driving。 可以通过返回到 repo 并单独重新下载每个 zip 文件来进行整流。 错误-在某些机器上,建模器无法将映像正确地分离到 val 和 train 目录中,这会导致脚本崩溃。 这并不是说脚本完全无法分离数据、而是按预期将 instances.json 分隔为 instances_val.json 和 istances_train.json。 问题是脚本创建了无法打开的 train 和 val 目录-尝试这样做会导致未知的文件系统错误。 我们认为这是操作系统和操作系统库版本之间的冲突造成的。 Fix 只是自己创建 train 和 val 目录(将所有图像复制到每个图像不是空间效率的、但它可以在不需要排序的情况下工作) 总的来说、在使用自定义数据进行培训、导出、编译、 并在 TDA4上运行模型、建模器使我们获得了最大的成功。 虽然我们的目的是使用 efficientdet-lite 版本以及通过代理使用 tensorflow、但我们可以理解此工具的使用是多么简单、以及它在多大程度上加快了模型开发管道。


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

    谢谢 Andrew。 这是一个令人鼓舞的反馈。

    您已经有过有关支持 tensorflow 模型的建议、如果您有任何其他建议和功能请求、请告知我们。

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

    在编译过程 中、可以在 param.yAML 或等效文件中写入标签 ID 到名称字典、SDK 只需读取该文件(而不必手动修改 classnames.py 或 edgeeai_classnames.cpp)-我们正在考虑这一点。

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

    在为我生成的 param.yAML 文件中、我可以看到以下条目:

    指标:
      label_offset_pred:1.

    我想知道为什么你的案例中没有这个领域。

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

    您好、是否有关于此问题的任何更新?

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

    尊敬的 Andrew:

    • 是否可以共享您正在尝试的示例 Tflite 模型?
    • 您使用哪个存储库进行培训和导出?

    此致、Debapriya

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

    尊敬的  Debapriya:

    我们有示例 tflite 文件、但尝试使用"插入"菜单中的"图像/视频/文件"选项将其上传到论坛会导致以下消息:

    "不允许插入文件或 URL。"

    我们使用 Google automl repo 进行培训和导出。

    使用默认的 automl 脚本对模型进行了培训和导出、并且只有对 hparams.config 进行了更改。 激活类型从 relu6更改为 Relu、基础学习率和预热率分别从0.08和0.008降至0.01和0.001。

    此致、

    Andrew

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

    尊敬的 Andrew:

    感谢您提供详细信息。

    您能否尝试创建 zip 文件、然后上传。

    此致、Debapriya

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

    作为 zip 文件上传有效:

    e2e.ti.com/.../efficientdet_2D00_lite1_5F00_finetune.zip

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

    尊敬的 Andrew:

    感谢您分享该模型。 另一个请求:您能否也共享 prototxt 文件。

    此致、Debapriya

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

    尊敬的 Debapriya:

    我们正在使用来自 TI 模型动物园的此 prototxt 文件:

    software-dl.ti.com/jacinto7/esd/modelzoo/latest/models/vision/detection/coco/google-automl/efficientdet_lite1_relu.prototxt

    此致、

    Andrew

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

    尊敬的 Andrew:

    对于您共享的模型、它在模型内部具有输入预处理功能。 同样、它是在 edgeai-Benchmark 脚本内执行的。 因此、在您的设置中、您将执行两次预处理。 这可能是精度数始终为零的原因。

    如果您查看我们在模型动物园中共享的模型、您会发现模型内部没有预处理。 这样做是为了优化推理。   在导出时、我已禁用预处理、并在文件 efficentdet/inence.py 中的提交 ID:39c39e5上附加了更改。

    我随附了一个包含这些更改的片段以及 inference.py 文件/

    请尝试一下、并告知我们您的观察结果。

     e2e.ti.com/.../inference.py

    此致、Debapriya

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

    谢谢、Debapriya。

    我们正在尝试禁用预处理的各种 efficientdet-lite 模型、到目前为止、结果一直很好。

    根据 此处的说明、似乎只需要对自动化代码进行更改、即 hparams_config.py 中的 act_type、h.learning_rate 和 h.lr_warm up_init、这就是我们一直在做的事情。

    您好像在 TI 版本的 automl repo 中禁用了预处理? 这是公开提供的吗? 我们是否应该了解其他任何修改?

    此致、

    Andrew

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

    尊敬的 Andrew:

    • 很高兴知道它在禁用预处理后工作正常。
    • 由于更改非常小、因此我们不会托管任何 automl 存储库。
    • 文档中缺少此部分更改。 我们将根据您提供的反馈更新文档。 感谢您的反馈。
    • 没有其他更改。 如果您在启用 efficientdet-lite 模型时遇到任何其他困难、请告知我们。

    此致、Debapriya