DSP 的 CV 算子調(diào)用
nn 示例涵蓋了深度學(xué)習(xí)模型的相關(guān)算子,包括量化、反量化、Softmax 和雷達(dá)點(diǎn)云預(yù)處理;CV 示例展示了如何調(diào)用地平線基于 DSP 封裝的圖像處理算子,目前已支持 25 個(gè),并且仍在持續(xù)擴(kuò)充當(dāng)中。
在正式閱讀前,希望您已經(jīng)對(duì) DSP 的軟硬件特點(diǎn)、編程思路和板端運(yùn)行方法有基本的了解,關(guān)于這方面的內(nèi)容可以閱讀原文跳轉(zhuǎn)社區(qū)搜索文章《DSP 開發(fā)快速上手》。
截止 J5 OE v1.1.62,DSP 已經(jīng)支持了 25 個(gè) CV 算子:
CV 算子相關(guān)的數(shù)據(jù)類型、數(shù)據(jù)結(jié)構(gòu)、配置參數(shù)、圖片約束等信息,可以查看 征程 5 工具鏈?zhǔn)謨?cè)的《DSP 運(yùn)行時(shí) API 手冊(cè)》。我們正在持續(xù)擴(kuò)充 DSP 支持的 CV 算子數(shù)量,同時(shí)也在讓已有的 CV 算子能支持更多的輸入數(shù)據(jù)類型。
OE 包的 ddk/samples/vdsp_rpc_sample 目錄包含了大量的 CV 示例,文件結(jié)構(gòu)如下:
+---vdsp_rpc_sample
│── arm # arm側(cè)
│ ├── cv
│ │ ├── build_arm.sh # arm側(cè)構(gòu)建腳本
│ │ ├── CMakeLists.txt
│ │ ├── main.cc # main函數(shù)
│ │ └── src # cv算子示例源文件目錄
│ └── nn
├── dsp
│ ├── build_dsp.sh # dsp側(cè)構(gòu)建腳本
│ ├── CMakeLists.txt
│ ├── src # dsp算子實(shí)現(xiàn)目錄
│ └── main.cc # 編譯dsp鏡像的源碼
├── script
│ ├── cv
│ │ ├── run_cv_test.sh # 運(yùn)行示例腳本
│ │ ├── bin # 可執(zhí)行程序目錄
│ │ └── data # 圖像目錄
│ ├── nn
│ ├── image
│ └── lib
├── deps
└── README.md
arm:arm 側(cè)示例,封裝了常用 api,主要負(fù)責(zé)發(fā)起 RPC 調(diào)用,接收 dsp 處理結(jié)果。
cv:cv 示例,包含了圖片處理的 cv 算子示例。
nn:nn 示例,包含 quantize 和 dequantize api,自定義算子 softmax 以及 pointpillar 前處理。
dsp:dsp 側(cè)示例,實(shí)現(xiàn)了 dsp 算子功能,主要負(fù)責(zé)接收 arm 側(cè)發(fā)來的任務(wù),完成 softmax 等算子的計(jì)算,將結(jié)果發(fā)送給 arm。
src:包含 quantize 和 dequantize api,以及自定義算子 softmax 以及 pointpillar 前處理的 dsp 側(cè)實(shí)現(xiàn)。
script:示例的生成文件及腳本目錄。
cv:包含 cv 示例的可執(zhí)行文件、輸入數(shù)據(jù)及執(zhí)行腳本。
nn:包含 nn 示例的可執(zhí)行文件、輸入數(shù)據(jù)、模型及執(zhí)行腳本。
image: DSP 鏡像目錄。
lib: 可執(zhí)行程序的依賴庫目錄。
deps:所有示例的依賴文件目錄。
aarch64:arm 側(cè)的依賴目錄。
vdsp:dsp 側(cè)的依賴目錄。
+---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 文件夾內(nèi),包含了當(dāng)前的 25 個(gè) CV 算子在 ARM 側(cè)調(diào)用的示例,這些示例以 test_開頭,其余的 common.h、img_util.cc、img_util.h 是示例運(yùn)行的必備組件。
CV 文件夾的 main.cc 集成了調(diào)用 25 個(gè) CV 算子的完整功能,CMakeLists.txt 是編譯必備的配置文件,執(zhí)行 build_arm.sh 后,即可編譯出可上板運(yùn)行的可執(zhí)行文件即相關(guān)依賴,這些生成的文件會(huì)自動(dòng)存放進(jìn) script 目錄中。我們已提供了編譯好的上述文件,無需用戶重復(fù)編譯。
├── deps
| ├── aarch64
| └── vdsp
└── dsp
├── CMakeLists.txt
├── build_dsp.sh
├── main.cc
└── src
CV 算子的 DSP 實(shí)現(xiàn)源碼是非開源的,地平線封裝成了 .a 文件以庫的形式提供,存放在 deps/vdsp 相關(guān)目錄下。dsp 目錄下的 src 文件夾只包含 NN 算子的實(shí)現(xiàn)源碼。main.cc 主要用于注冊(cè)編寫的 DSP 算子,CMakeLists.txt 是編譯必備的配置文件,執(zhí)行 build_dsp.sh 后,即可編譯出可以在板端配置的 vdsp0 和 vdsp1 鏡像,這兩個(gè)鏡像文件還會(huì)自動(dòng)存放進(jìn) script/image 目錄中。我們提供了已經(jīng)編譯好的鏡像文件,無需用戶重復(fù)編譯。
由于 ARM 側(cè)和 DSP 側(cè)所有需要編譯的文件都已經(jīng)包括在了 OE 包當(dāng)中,因此用戶可以跳過編譯這一步,直接將 script 文件夾復(fù)制到 征程 5 開發(fā)板上的可寫路徑下,如/userdata 目錄。
此時(shí)我們可以編寫一個(gè) deploy.sh 腳本并執(zhí)行,用于在 征程 5 開發(fā)板上部署 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
之后執(zhí)行以下命令,給予 dsp_relay_server 和 test_cv 文件可執(zhí)行權(quán)限:
chmod 777 /userdata/script/lib/dsp_relay_server
chmod 777 /userdata/script/cv/bin/test_cv
最后進(jìn)入 script/cv 文件夾,執(zhí)行以下命令即可運(yùn)行全部 25 個(gè) CV 算子示例:
sh run_cv_test.sh
用戶也可以通過追加參數(shù)的形式指定需要執(zhí)行的算子,如:
sh run_cv_test.sh roiResize
可以通過在腳本中追加參數(shù) help 來顯示所有可執(zhí)行算子。
以 roiResize 為例,該算子的執(zhí)行結(jié)果如下圖所示:
此時(shí),在/userdata/script/cv/目錄下會(huì)生成一個(gè) output 文件夾,保存了圖像處理結(jié)果,roiResize 算子的輸出文件名為 roi_resize_output.480x380.yuv,原始輸入圖像為/userdata/script/cv/data/500x480.lena.yuv。
我們可以使用 YUV 可視化工具 YUView 查看圖片的處理效果,該工具的下載地址為:https://github.com/IENT/YUView/releases
原始數(shù)據(jù)和處理結(jié)果的可視化效果圖如下所示:
*博客內(nèi)容為網(wǎng)友個(gè)人發(fā)布,僅代表博主個(gè)人觀點(diǎn),如有侵權(quán)請(qǐng)聯(lián)系工作人員刪除。