1. 如何理解VP
VP,全称Vision Process,指UCP中的视觉处理功能模块。
Backends,指UCP框架中的可分配处理单元。
VP模块主要用于模型的前后处理环节,在地平线统一架构中,多种硬件均已搭载了图像处理的算子,而VP模块将图像处理相关的硬件调用进行了封装, 通过设置backend来选择不同的硬件方案(若不指定backend,UCP会自动适配负载更低的处理单元),从而平衡开发板负载。
VP模块规避了不同硬件调用区别带来的不便,用户可更多地关注软件功能。
VP模块功能架构图如下:

通过VP模块提供的算子的任务构造函数,如hbVPResize、hbVPRotate等,生成对应算子的任务句柄。
创建好任务句柄后,可以通过设置调度参数指定后端、任务优先级,设备ID和自定义ID,从而将任务提交到对应的处理单元。 提交任务后,需要调用API等待任务完成。任务完成后,使用API释放任务句柄和相关资源,以确保系统资源得到有效管理和释放。 在从任务创建到任务提交、释放的过程中,UCP Service层对各个环节均提供接口及功能支持。
2. VP算子支持情况
性能数据:提供的VP算子,相比于OpenCV3.4.5在A78上的速度 会快一些。
支持情况:

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

1.准备输入输出数据:即申请图片的内存空间并构建相关的描述信息。
2.创建算子任务:此步骤为直接调用算子任务接口,同时传入算子执行所需的参数,执行完成后输出UCP任务句柄。
3.提交任务:通过传入调度参数将算子任务提交到不同处理核心,任务提交支持指定backend,如不指定则系统会自动适配backend。
4.指定接口等待任务结束:任务结束时,系统会根据不同的执行状态返回不同的返回值,此时,您可根据返回值来查看任务执行结果。
5.销毁任务:任务成功执行后需要销毁任务,并释放申请的内存。
4. VP算子调用实操
4.1 配置DSP环境
使用VP算子仅在板端推理是不需要专门申请DSP license的,需要X86仿真,则需要找地平线技术支持申请DSP license,关于环境配置不在这儿介绍了。
4.2 单算子示例代码详解
本节通过一个简单的rotate算子调用展示如何使用VP封装的算子实现图片处理的功能。
主要步骤包含:图片载入、任务创建、任务提交、任务完成、销毁任务、保存输出等,可以阅读相应源码和注释进行学习。
示例功能:使用hbVPRotate算子将图片顺时针旋转90度,主要代码解读如下:
读取图片
cv::Mat src_mat = cv::imread(src_img.c_str(), cv::IMREAD_GRAYSCALE);
LOGE_AND_RETURN_IF(src_mat.empty(), HB_UCP_INVALID_ARGUMENT, "Read image {} failed", src_img.c_str());
hbUCPMallocCached(&src_mem, src_width * src_height, 0);
hbUCPMallocCached(&dst_mem, dst_width * dst_height, 0);
memcpy(src_mem.virAddr, src_mat.data, src_width * src_height);
hbUCPMemFlush(&src_mem, HB_SYS_MEM_CACHE_CLEAN);
hbVPImage dst{HB_VP_IMAGE_FORMAT_Y, HB_VP_IMAGE_TYPE_U8C1, dst_width, dst_height, dst_stride, dst_mem.virAddr, dst_mem.phyAddr, 0, 0, 0};
HB_UCP_INITIALIZE_SCHED_PARAM(&sched_param);
sched_param.backend = HB_UCP_DSP_CORE_0;
hbUCPWaitTaskDone(rotate_task, 0);
cv::Mat dst_mat(dst_height, dst_width, CV_8U, dst.dataVirAddr);
cv::imwrite("./rotate.jpg", dst_mat);
hbUCPFree(&src_mem);
hbUCPFree(&dst_mem);
#include "hobot/vp/hb_vp_rotate.h"
#include "rotate.h"
#include "hobot/hb_ucp_sys.h"
#include "hobot/hb_ucp.h"
// Fill the operator parameter
hbVPRotateDegree rotate_code = HB_VP_ROTATE_90_CLOCKWISE;
}



