写点什么

DSP 的 CV 算子调用

  • 2024-12-05
    广东
  • 本文字数:2979 字

    阅读完需:约 10 分钟

DSP 的 CV 算子调用

01 前言

DSP 是 征程 5 上的数字信号处理器,专用于处理视觉、图像等信息。在 OE 包的 ddk/samples/vdsp_rpc_sample 路径下,提供了 DSP 使用示例,包括 nn 和 CV 两部分。


nn 示例涵盖了深度学习模型的相关算子,包括量化、反量化、Softmax 和雷达点云预处理;CV 示例展示了如何调用地平线基于 DSP 封装的图像处理算子,目前已支持 25 个,并且仍在持续扩充当中。


在正式阅读前,希望您已经对 DSP 的软硬件特点、编程思路和板端运行方法有基本的了解,关于这方面的内容可以阅读原文跳转社区搜索文章《DSP 开发快速上手》。

02 CV 算子支持列表

截止 J5 OE v1.1.62,DSP 已经支持了 25 个 CV 算子:



CV 算子相关的数据类型、数据结构、配置参数、图片约束等信息,可以查看 征程 5 工具链手册的《DSP 运行时 API 手册》。我们正在持续扩充 DSP 支持的 CV 算子数量,同时也在让已有的 CV 算子能支持更多的输入数据类型。

03 CV 示例文件介绍

OE 包的 ddk/samples/vdsp_rpc_sample 目录包含了大量的 CV 示例,文件结构如下:


+---vdsp_rpc_sample│── arm                                          # arm侧│   ├── cv│   │   ├── build_arm.sh                         # arm侧构建脚本│   │   ├── CMakeLists.txt│   │   ├── main.cc                              # main函数│   │   └── src                                  # cv算子示例源文件目录│   └── nn├── dsp│   ├── build_dsp.sh                             # dsp侧构建脚本│   ├── CMakeLists.txt│   ├── src                                      # dsp算子实现目录│   └── main.cc                                  # 编译dsp镜像的源码├── script│   ├── cv│   │   ├── run_cv_test.sh                       # 运行示例脚本│   │   ├── bin                                  # 可执行程序目录│   │   └── data                                 # 图像目录│   ├── nn│   ├── image│   └── lib├── deps└── README.md
复制代码


  • arm:arm 侧示例,封装了常用 api,主要负责发起 RPC 调用,接收 dsp 处理结果。

  • cv:cv 示例,包含了图片处理的 cv 算子示例。

  • nn:nn 示例,包含 quantize 和 dequantize api,自定义算子 softmax 以及 pointpillar 前处理。

  • dsp:dsp 侧示例,实现了 dsp 算子功能,主要负责接收 arm 侧发来的任务,完成 softmax 等算子的计算,将结果发送给 arm。

  • src:包含 quantize 和 dequantize api,以及自定义算子 softmax 以及 pointpillar 前处理的 dsp 侧实现。

  • script:示例的生成文件及脚本目录。

  • cv:包含 cv 示例的可执行文件、输入数据及执行脚本。

  • nn:包含 nn 示例的可执行文件、输入数据、模型及执行脚本。

  • image: DSP 镜像目录。

  • lib: 可执行程序的依赖库目录。

  • deps:所有示例的依赖文件目录。

  • aarch64:arm 侧的依赖目录。

  • vdsp:dsp 侧的依赖目录。


+---arm/cv    ├── CMakeLists.txt    ├── build_arm.sh    ├── main.cc    └── src        ├── common.h        ├── img_util.cc        ├── img_util.h        ├── test_bilateral_filter.cc        ├── test_box_filter.cc        ├── test_canny.cc        ├── test_corner_harris.cc        ├── test_cvt_color.cc        ├── test_dilate.cc        ├── test_equalize_hist.cc        ├── test_erode.cc        ├── test_filter2D.cc        ├── test_flip.cc        ├── test_gaussian_blur.cc        ├── test_integral.cc        ├── test_median_blur.cc        ├── test_pyr_down.cc        ├── test_pyr_up.cc        ├── test_remap.cc        ├── test_resize.cc        ├── test_roi_resize.cc        ├── test_rotate.cc        ├── test_sep_filter2D.cc        ├── test_sobel.cc        ├── test_threshold.cc        ├── test_transpose.cc        ├── test_warp_affine.cc        └── test_warp_perspective.cc
复制代码


在 arm/cv/src 文件夹内,包含了当前的 25 个 CV 算子在 ARM 侧调用的示例,这些示例以 test_开头,其余的 common.h、img_util.cc、img_util.h 是示例运行的必备组件。


CV 文件夹的 main.cc 集成了调用 25 个 CV 算子的完整功能,CMakeLists.txt 是编译必备的配置文件,执行 build_arm.sh 后,即可编译出可上板运行的可执行文件即相关依赖,这些生成的文件会自动存放进 script 目录中。我们已提供了编译好的上述文件,无需用户重复编译。


├── deps|   ├── aarch64|   └── vdsp   └── dsp    ├── CMakeLists.txt    ├── build_dsp.sh    ├── main.cc    └── src
复制代码


CV 算子的 DSP 实现源码是非开源的,地平线封装成了 .a 文件以库的形式提供,存放在 deps/vdsp 相关目录下。dsp 目录下的 src 文件夹只包含 NN 算子的实现源码。main.cc 主要用于注册编写的 DSP 算子,CMakeLists.txt 是编译必备的配置文件,执行 build_dsp.sh 后,即可编译出可以在板端配置的 vdsp0 和 vdsp1 镜像,这两个镜像文件还会自动存放进 script/image 目录中。我们提供了已经编译好的镜像文件,无需用户重复编译。

04 CV 算子使用说明

由于 ARM 侧和 DSP 侧所有需要编译的文件都已经包括在了 OE 包当中,因此用户可以跳过编译这一步,直接将 script 文件夹复制到 征程 5 开发板上的可写路径下,如/userdata 目录。


此时我们可以编写一个 deploy.sh 脚本并执行,用于在 征程 5 开发板上部署 DSP 镜像:


echo stop > /sys/class/remoteproc/remoteproc1/stateecho stop > /sys/class/remoteproc/remoteproc2/stateecho -n "/userdata/script/image" > /sys/module/firmware_class/parameters/pathecho vdsp0 > /sys/class/remoteproc/remoteproc1/firmwareecho vdsp1 > /sys/class/remoteproc/remoteproc2/firmwareecho start > /sys/class/remoteproc/remoteproc1/stateecho start > /sys/class/remoteproc/remoteproc2/state
复制代码


之后执行以下命令,给予 dsp_relay_server 和 test_cv 文件可执行权限:


chmod 777 /userdata/script/lib/dsp_relay_serverchmod 777 /userdata/script/cv/bin/test_cv
复制代码


最后进入 script/cv 文件夹,执行以下命令即可运行全部 25 个 CV 算子示例:


sh run_cv_test.sh
复制代码


用户也可以通过追加参数的形式指定需要执行的算子,如:


sh run_cv_test.sh roiResize
复制代码


可以通过在脚本中追加参数 help 来显示所有可执行算子。


以 roiResize 为例,该算子的执行结果如下图所示:



此时,在/userdata/script/cv/目录下会生成一个 output 文件夹,保存了图像处理结果,roiResize 算子的输出文件名为 roi_resize_output.480x380.yuv,原始输入图像为/userdata/script/cv/data/500x480.lena.yuv。


我们可以使用 YUV 可视化工具 YUView 查看图片的处理效果,该工具的下载地址为:https://github.com/IENT/YUView/releases


原始数据和处理结果的可视化效果图如下所示:




关于 RoiResize 算子的执行过程分析,以及详细的 ARM 侧调用代码解读,可以参考社区文章《在 J5 上使用 DSP 进行 RoiResize》。


用户头像

还未添加个人签名 2021-03-11 加入

还未添加个人简介

评论

发布
暂无评论
DSP 的 CV 算子调用_算法_地平线开发者_InfoQ写作社区