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.

[参考译文] TDA2EVM5777:需要有关开发 Canny 边缘检测算法的帮助

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

https://e2e.ti.com/support/processors-group/processors/f/processors-forum/631947/tda2evm5777-need-a-help-to-develop-the-canny-edge-detection-algorithm

器件型号:TDA2EVM5777

大家好、

我们正在进行一个项目。在该项目中、我们使用 TDA2xx EVM 开发算法。我们是此 TDA2x ADAS 系列的新成员。
我们希望开发 Canny 边缘检测算法。因此、我们使用了 TI 的 vxlib 库 API。

要开发此算法、我们必须遵循以下列出的步骤、
使用抗噪运算符(Sobel)计算梯度幅度和方向。
2.使用渐变方向信息对梯度幅度进行非最大抑制。
应用双阈值以确定潜在边沿。
使用迟滞阈值跟踪修改后的梯度图像中的边沿以生成二进制结果。

VxLIB 提供了所有步骤 的 API 来开发 Canny 边缘检测,当我们使用索贝尔滤波器图像 API (第一步)时,输出帧的宽度将减半,此 API 会消耗90%的已用 DSP。因此,我们在下面列出了对此的查询

为什么该 API 需要90%的 CPU 使用率?
2.如何在 Sobel API 中实现全帧宽度?

我们已附上了 sobre el API 的 c 文件供您参考。

如果您需要我们方面的更多信息、请告知我们。

谢谢、
Parthe2e.ti.com/.../API_5F00_referance_5F00_file.c

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

    我已将您的问题转交给 VLIB 专家。

    此致、
    Yordan
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    > 2. 如何在 Sobel API 中实现全帧宽度?

    我建议、对于集成调试、您尝试调用 VXLIB_ _checkParams()版本的 API。 这些 API 将报告参数列表中的任何错误。 例如、在附加的文件中、我看到源和目标跨度都有"inPit[0]"。 跨度值以字节为单位、因此这可能是一个错误。 输出跨度可能是输入间距的两倍、因为它是每个像素2个字节而不是每个像素1个字节。

    > 1. 为什么此 API 需要90%的 CPU 使用率?

    当您说90%的 CPU 时、我假设您有一些帧速率要求、而此 API 占用了该窗口的90%? 这就是您的意思吗? 这更多地取决于帧速率要求和图像分辨率。 内核版本中列出的性能是假定所有数据和代码都在 L1中(单周期访问)。 因此、这实际上是最佳情况、实际性能将取决于您使用的存储器层次结构配置和数据获取方案。 由于许多 VXLIB API 都是 I/O 绑定的... 这意味着计算部分已经过优化、因此性能瓶颈可能是从 DDR 访问数据。 因此、如果 DSP 没有打开高速缓存或将其映射到适当的 DDR 地址范围、则这将是一个问题。 如果缓存配置正确、则可以进一步优化使用 DMA 将数据块移入/移出 L2SRAM、并每次在一个块上运行此 API。 对于 sobre el_3x3、我们在比较 DMA 与仅缓存使用情况时观察到性能提高了4倍。 您可以从以下封装路径中参考如何使用 VXLIB 将 VXLIB 内核集成到 OpenVX 中:TI_components/open_compute /TIOVX_01_00_00_00/kernels/openvx-core/c66x/vx_canny_target.c 该文件仅显示了使用缓存的 Canny 的 VXLIB 内核集成。 如果您想查看使用 BAM 进行 DMA 处理的版本、请查看以下文件:TI_components /open_compute /TIOVx_01_00_00_00/kernels/openvx-core/c66x/bam/vx_Bam_canny_target.c 如果您不使用 OpenVX、您可能仍希望将此代码作为调用这些 VXLIB 函数的参考。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好!

    感谢您的快速响应。

    根据您的建议、我们体验了不同的跨度值、并接收"VXLIB_sobre X_3x3_i8u_o16s"和"VXLIB_sobre X_3x3_i8u_o16s_checkParams"的返回值。我们得到的返回值为0 (即成功、传递参数中没有错误)。我们在下面提到的参数。

    src_addr.dim_x =宽度;
    SRC_addr.DIM_y =高度;
    SRC_addr.STRING_y =间距[0];
    src_addr.data_type = VXLIB_UINT8;

    dst_x_addr.dim_x =宽度;
    dst_x_addr.dim_y =高度-2;
    dst_x_addr.stae_y =(outPit[0]*2);
    dst_x_addr.data_type = VXLIB_Int16;

    尽管成功、API 仍会返回0值、但我们仍然无法在显示屏上获得正确的输出。 输出严重失真。

    注意:我们在 YUV420视频帧的清晰平面上应用了清晰的操作员。 色度平面已被屏蔽。

    谢谢、

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

    您发布的参数设置看起来是正确的、API 返回成功证明了这一点。 如果没有更多信息、我很难为您提供帮助。 如果您有 JTAG、我建议单步执行代码并检查输入/输出缓冲器是否正在按照您的预期进行更新。 显示损坏可能是稍后覆盖输出的过程、也可能是传递给函数的错误指针。 尝试缩小问题范围是一个好主意。

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

    您好 Jesse、

    感谢您的支持。

    我们获得了用于 Canny 边缘检测的正确输出。但现在我们面临 DSP 处理器过冲问题。

     根据您在2017年10月13日的回复中的建议

    "如果 DSP 没有打开高速缓存或将其映射到适当的 DDR 地址范围、则这将是一个问题。 如果缓存配置正确、则可以进一步优化使用 DMA 将数据块移入/移出 L2SRAM、并一次在一个块上运行此 API "

    请回答我的以下问题、以获取您的上述回复、

    1)正确配置高速缓存意味着什么(您可以建议更好的方法来配置高速缓存,以便我们可以优化算法处理性能)?
    2) 2)您是否还可以共享用于配置 DSP1 L2SRAM 缓存以及代码优化的文档?

    如果您需要我们方面的更多信息、请告诉我。

    谢谢、
    Parth Modi

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

    1)正确配置高速缓存意味着什么(您可以建议更好的方法来配置高速缓存,以便我们可以优化算法处理性能)?

    L2SRAM 为256KB + 32KB。  32KB 部分始终仅用作存储器映射 SRAM。  剩余的256KB 可配置为高速缓存或存储器映射 SRAM、或两者的混合(请参阅 TRM)。  如果将此 RAM 的一部分配置为缓存、则有一系列寄存器可配置 L3存储器映射中的哪些存储器页面、以配置为"可缓存"页面、而不是不可缓存页面。

    如果您在 TI EVM 上使用来自 TI VSDK 的 VLIB 函数、则缓存应已"正确"配置、即 L2SRAM 至少部分配置了缓存、用于共享图像缓冲区的存储器缓冲区配置为可缓存。  有些区域是不可高速缓冲的、这些区域通常是较小的数据结构、用于内核之间的同步和锁定。

    如果您在没有运行 VSDK BIOS 和应用程序的情况下以独立方式(裸机)使用 VLIB 测试台、 VLIB 测试台有一个在 main 开始时调用的函数、用于配置这些高速缓存寄存器、以便从其中分配图像缓冲区的堆位于可缓存地址范围内。

    您可能需要担心的情况是、如果您已更改 VSDK 中的存储器映射、例如使用定制电路板设计时。  或者、您尝试访问 VLIB 中图像缓冲区的存储器可能会分配到不可连接的存储器区域中。

    在任何这些情况下、我建议您参考以下文档以及 TRM 中的相关存储器映射、 如果高速缓存寄存器的配置方式使您能够确认访问代码或数据的存储器地址范围是否位于这些高速缓存寄存器中配置的"可缓存"存储器区域内、则使用 JTAG 进行调试。

    2) 2)您是否还可以共享用于配置 DSP1 L2SRAM 缓存以及代码优化的文档?

    您可以参阅:

x 出现错误。请重试或与管理员联系。