专栏算法工具链【J6】VP简介与单算子实操

【J6】VP简介与单算子实操

Jade-self2024-12-31
207
0

1. 如何理解VP

  • VP,全称Vision Process,指UCP中的视觉处理功能模块。

  • Backends,指UCP框架中的可分配处理单元。

VP模块主要用于模型的前后处理环节,在地平线统一架构中,多种硬件均已搭载了图像处理的算子,而VP模块将图像处理相关的硬件调用进行了封装, 通过设置backend来选择不同的硬件方案(若不指定backend,UCP会自动适配负载更低的处理单元),从而平衡开发板负载。

VP模块规避了不同硬件调用区别带来的不便,用户可更多地关注软件功能。

VP模块功能架构图如下:

Description

通过VP模块提供的算子的任务构造函数,如hbVPResize、hbVPRotate等,生成对应算子的任务句柄。

创建好任务句柄后,可以通过设置调度参数指定后端、任务优先级,设备ID和自定义ID,从而将任务提交到对应的处理单元。 提交任务后,需要调用API等待任务完成。任务完成后,使用API释放任务句柄和相关资源,以确保系统资源得到有效管理和释放。 在从任务创建到任务提交、释放的过程中,UCP Service层对各个环节均提供接口及功能支持。

2. VP算子支持情况

性能数据:提供的VP算子,相比于OpenCV3.4.5在A78上的速度 会快一些。

支持情况:

Description

3. VP算子执行流程

以Rotate算子异步执行为例,展示算子实际的调用流程,其他算子的使用方法基本与其流程一致。

Description

1.准备输入输出数据:即申请图片的内存空间并构建相关的描述信息。

2.创建算子任务:此步骤为直接调用算子任务接口,同时传入算子执行所需的参数,执行完成后输出UCP任务句柄。

3.提交任务:通过传入调度参数将算子任务提交到不同处理核心,任务提交支持指定backend,如不指定则系统会自动适配backend。

4.指定接口等待任务结束:任务结束时,系统会根据不同的执行状态返回不同的返回值,此时,您可根据返回值来查看任务执行结果。

5.销毁任务:任务成功执行后需要销毁任务,并释放申请的内存。

x86和板端的一致性:x86和板端的精度是能对齐的,且算子约束条件相同:比如说板端运行时,设置了超限的参数会导致运行结果异常,那么在x86设置同样的参数也会有同样的异常

4. VP算子调用实操

4.1 配置DSP环境

使用VP算子仅在板端推理是不需要专门申请DSP license的,需要X86仿真,则需要找地平线技术支持申请DSP license,关于环境配置不在这儿介绍了。

4.2 单算子示例代码详解

本节通过一个简单的rotate算子调用展示如何使用VP封装的算子实现图片处理的功能。

主要步骤包含:图片载入、任务创建、任务提交、任务完成、销毁任务、保存输出等,可以阅读相应源码和注释进行学习。

示例功能:使用hbVPRotate算子将图片顺时针旋转90度,主要代码解读如下:

  1. 读取图片

图片路径:src_img 是源图片的路径。

读取图片:通过 OpenCV 的 cv::imread 函数以灰度模式 (IMREAD_GRAYSCALE) 读取图片。

错误处理:如果图片读取失败,输出错误日志并返回错误状态码。

  1. 内存初始化和数据填充

内存分配:

  • 使用 hbUCPMallocCached 分配源图片和目标图片的缓存内存。

  • src_mem:存储源图片的数据。

  • dst_mem:存储旋转后图片的数据。

数据填充:

  • 通过 memcpy 将源图片数据复制到 src_mem 的虚拟地址空间。

  • 使用 hbUCPMemFlush 清空缓存,将数据刷新到物理内存。

  1. 输入和输出图片信息的封装

hbVPImage 用于描述图片的基本信息。

格式为 HB_VP_IMAGE_FORMAT_Y,表示灰度图片。

类型为 HB_VP_IMAGE_TYPE_U8C1,表示单通道 8 位无符号整型数据。

其他字段包括图片的宽、高、步幅(stride),以及内存的虚拟地址和物理地址。

  1. 提交任务并等待执行

调度参数:

  • 使用 hbUCPSchedParam 配置任务的调度参数,例如执行设备 (DSP_CORE_0)。

提交任务:调用 hbUCPSubmitTask 提交旋转任务到指定设备。

等待完成:hbUCPWaitTaskDone 阻塞等待任务完成,超时时间为 0 表示无限等待。

  1. 结果保存

刷新内存:将目标图片数据从物理内存同步到缓存,确保数据可用。

结果保存:

  • 将目标图片数据封装为 OpenCV 的 cv::Mat 对象。

  • 使用 cv::imwrite 将旋转后的图片保存为文件 rotate.jpg。

  1. 资源释放

任务释放:释放任务句柄,避免资源泄漏。

内存释放:释放分配的源图片和目标图片内存。

全部代码如下:

旋转前后图片如下:

Description
算法工具链
社区征文征程6杂谈技术深度解析
评论0
0/1000