1 前言
DSP是J5上的数字信号处理器,专用于处理视觉、图像等信息。在OE包的ddk/samples/vdsp_rpc_sample路径下,提供了DSP使用示例,包括nn和cv两部分。nn示例涵盖了深度学习模型的相关算子,包括量化、反量化、Softmax和雷达点云预处理。cv示例展示了如何调用地平线基于DSP封装的图像处理算子,目前已支持25个,并且仍在持续扩充当中。-
在正式阅读前,希望您已经对DSP的软硬件特点、编程思路和板端运行方法有基本的了解,关于这方面的内容可以查看社区文章《DSP开发快速上手》。
2 CV算子支持列表
截止J5 OE v1.1.62,DSP已经支持了25个CV算子:-
CV算子相关的数据类型、数据结构、配置参数、图片约束等信息,可以查看J5工具链手册的《DSP运行时API手册》。我们正在持续扩充DSP支持的CV算子数量,同时也在让已有的CV算子能支持更多的输入数据类型。
3 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目录中。我们提供了已经编译好的镜像文件,无需用户重复编译。
4 CV算子使用说明
由于ARM侧和DSP侧所有需要编译的文件都已经包括在了OE包当中,因此用户可以跳过编译这一步,直接将script文件夹复制到J5开发板上的可写路径下,如/userdata目录。-
此时我们可以编写一个deploy.sh脚本并执行,用于在J5开发板上部署DSP镜像:
echo stop > /sys/class/remoteproc/remoteproc1/state
echo stop > /sys/class/remoteproc/remoteproc2/state
echo -n "/userdata/script/image" > /sys/module/firmware_class/parameters/path
echo vdsp0 > /sys/class/remoteproc/remoteproc1/firmware
echo vdsp1 > /sys/class/remoteproc/remoteproc2/firmware
echo start > /sys/class/remoteproc/remoteproc1/state
echo start > /sys/class/remoteproc/remoteproc2/state
之后执行以下命令,给予dsp_relay_server和test_cv文件可执行权限:
chmod 777 /userdata/script/lib/dsp_relay_server
chmod 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》。