作者:Chen Shaoyi,来源:AMD Xilinx开发者社区
Vitis视频分析SDK是在AMD平台上构建AI驱动的智能视频分析解决方案的完整软件栈。它从USB/MIPI摄像头、视频文件或者RTSP流中获取输入,并使用Vitis AI实现各种基于人工智能的应用,如智能城市、行人检测、健康监测、智慧零售、缺陷检测等等。
对于开发者,VVAS以基础插件、软件加速库的形式提供了一个框架,并为用户开发自己的插件以控制定制的硬件加速器提供了简化接口。有了这个框架,用户可以轻松地将他们的定制加速器/内核集成到Vitis Video Analytics SDK中。它建立在XRT、Vitis和Vitis AI之上,并对这些复杂的接口进行了抽象化,使开发人员更容易构建视频分析应用。
用户通过Core API可以完成软硬件的调度。这四个API是xlnx_kernel_init()、xlnx_kernel_deinit()、xlnx_kernel_start()、xlnx_kernel_done()。
我们首先介绍如何将软件应用集合到VVAS框架中。软件应用指的是只在CPU上执行,不使用FPGA部分的自定义插件。我们以smartcam应用中的AI Rendering插件作为例子。相关代码可以从参考链接中找到。
AI Rendering插件的主要功能是绘制检测到的物体。当DPU推理结果(如检测到的人脸的坐标)传递给AI Rendering插件后,该插件负责在原始帧中的物体周围绘制边界框。
xlnx_kernel_init() API只在插件初始化的时候被VVAS调用一次。软件应用可以在这个函数中执行一次性初始化操作。
int32_t xlnx_kernel_init (IVASKernel * handle){
ivas_xoverlaypriv *kpriv = (ivas_xoverlaypriv *) calloc (1, sizeof (ivas_xoverlaypriv));
json_t *jconfig = handle->kernel_config;
json_t *val, *karray = NULL, *classes = NULL;
/* Initialize config params with default values */
......
/* get label color array */
......
/* get classes array */
......
}
xlnx_kernel_start() API在处理输入缓冲区中的每个帧调用这个API,以便进一步处理。软件应用可以执行每帧操作,如更新状态机,读/写IP的寄存器,然后指示kernel处理输入。
uint32_t xlnx_kernel_start (IVASKernel * handle, int start,
IVASFrame * input[MAX_NUM_OBJECT], IVASFrame * output[MAX_NUM_OBJECT])
{
......
frameinfo->lumaImg.create (input[0]->props.height, input[0]->props.stride,
CV_8UC1);
frameinfo->lumaImg.data = (unsigned char *) lumaBuf;
frameinfo->chromaImg.create (input[0]->props.height / 2,
input[0]->props.stride / 2, CV_16UC1);
frameinfo->chromaImg.data = (unsigned char *) chromaBuf;
}
xlnx_kernel_done() VVAS基础插件会调用这个API来确认kernel是否已经完成处理缓冲区中的帧。加速应用可以在这个函数中实现逻辑,以通过这个API了解kernel的状态。
int32_t xlnx_kernel_done (IVASKernel * handle)
{
LOG_MESSAGE (LOG_LEVEL_DEBUG, "enter");
return 0;
}
xlnx_kernel_deinit() 这个API在kernel结束运行时被VVAS基础插件调用。加速应用必须执行任何清理、去初始化任务,如释放私有句柄和内部内存分配。
uint32_t xlnx_kernel_deinit (IVASKernel * handle)
{
LOG_MESSAGE (LOG_LEVEL_DEBUG, "enter");
ivas_xoverlaypriv *kpriv = (ivas_xoverlaypriv *) handle->kernel_priv;
if (kpriv)
free (kpriv);
return 0;
}
以上代码编译后成为vvas插件的一部分,并放置在/opt/xilinx/kv260-smartcam/lib/目录下。
在smartcam的GStreamer应用中,调用drawresult的相关代码为:
gst-launch-1.0 -v filesrc XXXXXX ! queue ! vvas_xfilter kernels-config="/opt/xilinx/kv260-smartcam/share/vvas/facedetect/drawresult.json" ! queue ! XXXXXX
其中drawresult.json中需要指明使用的库文件名为libvvas_airender.so:
{
"xclbin-location":"/usr/lib/dpu.xclbin",
"vvas-library-repo": "/opt/xilinx/kv260-smartcam/lib",
"element-mode":"inplace",
"kernels" :[
{
"library-name":"libvvas_airender.so",
"config": {
"fps_interval" : 10,
"font_size" : 2,
"font" : 3,
"thickness" : 2,
"debug_level" : 0,
"label_color" : { "blue" : 0, "green" : 0, "red" : 255 },
"label_filter" : [ "class", "probability" ],
"classes" : [
]
}
}
]
}
参考文档:
https://github.com/Xilinx/smartcam/blob/2021.1/src/ivas_airender.cpp
https://xilinx.github.io/kria-apps-docs/kv260/2022.1/build/html/docs/sma...