Xilinx新技术VVAS GStreamer概念学习和实例入手

本文作者:电巢FPGA专家王伟博士,中国高科技产业化研究会智能信息处理产业化分会理事

VVAS GStreamer概念与两种镜像版本

1.1. GStreamer概念

如果是FPGA背景的,猛一看到GStreamer一头雾水,且慢我们拆解一下就没那么难理解了。

VVAS全称是Vitis Video Analystics SDK,是Xilinx公司基于GStreamer框架研发的基于视频的套件,用GStreamer的pipeline形式来实现,简单的说,就是用“!”连接的一行命令,每一个单独的命令我们叫他element,这一行命令来实现从图像输入、处理到输出的全过程。其element包括queue tee pad sink等,具体定义可以百度。

我们先看GStreamer在开发框架中的位置,如下图:

GStreamer框架是一个支持多线程的框架,线程会根据Pipeline的需要自动创建和销毁,例如,将媒体流与应用线程解耦,应用线程不会被GStreamer的处理阻塞。而且,GStreamer的插件还可以创建自己所需的线程用于媒体的处理,例如:在一个4核的CPU上,视频解码插件可以创建4个线程来最大化利用CPU资源。

在创建Pipeline时,我们还可以指定某个Pipeline的分支在不同的线程中执行(例如,使audio、video同时在不同的线程中进行解码)。这是通过queue Element来实现的,queue的sink pad仅仅将数据放入队列,另外一个线程从队列中取出数据,并传递到下一个Element。queue通常也被用于作为数据缓冲,缓冲区大小可以通过queue的属性进行配置。

在上面的示例Pipeline中,source是audiotestsrc,会产生一个相应的audio信号,然后使用tee Element将数据分为两路,一路被用于播放,通过声卡输出,另一路被用于转换为视频波形,用于输出到屏幕。

示例图中的红色阴影部分表示位于同一个线程中,queue会创建单独的线程,所以上面的Pipeline使用了3个线程完成相应的功能。拥有多个sink的Pipeline通常需要多个线程,因为在多个sync间进行同步的时候,sink会阻塞当前所在线程直到所等待的事件发生。

1.2. Kria SoM petalinux与ubuntu版本之别

新发布的Kria SoM版本有petalinux与ubuntu版本,区别如下:

a、插件数量之别
petalinux 发布较早,只有54 plugins,后者较多,有100多个plugins,其中包括比较常用的qtdemux和audio常用插件。qtdemux是处理mp4文件的插件。

例如下面这个例子可以在ubuntu镜像上实现,用autovideosink非常方便地将开发板的视频界面转到计算机上来,petalinux没有这个功能。

gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! autovideosink

同样,ubuntu镜像可以播放文件,而petalinux镜像则不能。

gst-launch-1.0 playbin uri=file:///home/ubuntu/facedetect/mask.h264

b、操作命令之别
petalinux主要安装命令为rpm和dnf, 而ubuntu自然是apt get install。
petalinux 配置命令为xmutil,如下面更换BOOT.BIN文件使用:

xilinx-k26-starterkit-2021_1:~$ sudo xmutil bootfw_update -i ./BOOT.bin

查状态用sudo xmutil bootfw_update -v
而ubuntu为xlinx-config –xmutil,如下面更换BOOT.BIN文件使用:

ubuntu@kria:~$ sudo xlinx-config -x bootfw_update -i ./BOOT.BIN

sudo xlnx-config -x bootfw-status

c、例程之别
petalinux主要有三个例子, 对应三个硬件流,如下所示:

smartcam镜像有着完整的VCU功能,支持硬件编码和解码,所有这三个应用均有jupyter python源码。

而ubuntu则只有一个例子,偏偏是VCU功能不全的那个硬件流。但是可以从网上下载多个模型来运行。

查阅连接资源

ubuntu@kria:~$ snap connections xlnx-vai-lib-samples

查阅可安装的模型库,这里面显示的模型都可以安装

ubuntu@kria:~$ xlnx-vai-lib-samples.info

d、xclbin文件之别
ubuntu包含bit stream, 2021.2.9生成,较早

petalinux并不包含bit stream, 2021.6.9生成,较晚。

1.3. VVAS应用相关文件

链接库位置

json文件位置:

xilinx-k26-starterkit-2021_1:/opt/xilinx/share$ tree

GStreamer由浅入深入手实例

2.1. h264 gstreamer解码编码例程

先试一条命令,将h264文件先解码,再编码,存入一个新文件,这是用来试开发板上的gstreamer功能完备,比较简单的一个例子。

gst-launch-1.0 filesrc location=./city.h264 ! h264parse ! omxh264dec ! video/x-raw, width=1920, height=1080, format=NV12 ! omxh264enc ! video/x-h264, alignment=au ! filesink location=./city_vcu.h264 -v

上面显示生成的文件大小正常,而选择输出不是输入的尺寸时,即不是width=1920, height=1080时,无法编码,文件大小下面图中为0。

2.2. facedetect gstreamer例程

gst-launch-1.0 filesrc location=./mask.h264 ! h264parse ! video/x-h264, alignment=au ! omxh264dec low-latency=0 internal-entropy-buffers=2 ! video/x-raw, width=1920, height=1080, format=NV12, framerate=30/1  ! tee name=t  ! queue ! ivas_xmultisrc kconfig="/opt/xilinx/share/ivas/smartcam/facedetect/preprocess.json"  ! queue ! ivas_xfilter kernels-config="/opt/xilinx/share/ivas/smartcam/facedetect/aiinference.json" ! ima.sink_master ivas_xmetaaffixer name=ima ima.src_master ! fakesink  t. ! queue !  ima.sink_slave_0 ima.src_slave_0  ! queue ! ivas_xfilter kernels-config="/opt/xilinx/share/ivas/smartcam/facedetect/drawresult.json" ! omxh264enc target-bitrate=3000 ! video/x-h264, alignment=au ! filesink location=./mask_result.h264


当然你在配json文件时,注意文件的存入路径。

2.3. yolov2-tiny gstreamer全流程例程

这是yolov2模型从开始训练、量化到编译的例子,这里我们只取在开发板用gstreamer命令行实现的部分,准备三个json文件和xmodel,在kv260上建立完整的目录结构。

a、开发板目录结构
按以下目录将相应文件准备好

其中前处理文件preprocess如下:

其中scale_r等值0.25计算过程如下,从下面的prototxt文件中取出scale值

将取出的scale值0.00390625与输入张量input_scale值64(后节有说明)乘积得出preprocess文件中的scale_r等值0.25。

b、ffmpeg准备视频
使用ffmpeg工具截取前十秒

ffmpeg -ss 00:00:00 -t 00:00:10 -accurate_seek -i multi.mp4 -codec copy multi10.mp4

使用ffmpeg工具将mp4转换成h264

ffmpeg -i multi10.mp4 -c:v libx264 -pix_fmt nv12 -r 30 multi10.h264

c、yolov2-tiny gstreamer命令

gst-launch-1.0 filesrc location=./multi10.h264 ! h264parse ! video/x-h264, alignment=au ! omxh264dec low-latency=0 internal-entropy-buffers=2 ! video/x-raw, width=1920, height=1080, format=NV12, framerate=30/1  ! tee name=t  ! queue ! ivas_xmultisrc kconfig="/home/petalinux/notebooks/yolov2tiny/preprocess.json"  ! queue ! ivas_xfilter kernels-config="/home/petalinux/notebooks/yolov2tiny/aiinference.json" ! ima.sink_master ivas_xmetaaffixer name=ima ima.src_master ! fakesink  t. ! queue !  ima.sink_slave_0 ima.src_slave_0  ! queue ! ivas_xfilter kernels-config="/home/petalinux/notebooks/yolov2tiny/drawresult.json" ! omxh264enc target-bitrate=3000 ! video/x-h264, alignment=au ! filesink location=./multi10_result.h264

d、gstreamer命令行运行结果

这里采集的视频出自我手机自拍的北京明光桥下


e、Vitis AI 1.4 python程序运行结果
最后我们编写了Vitis AI 1.4的python源程序与之对照,分析参数和进行验证。下面是部分程序截图:

命令行输出参数和结果,可以看到input_scale为64,同时帧率FPS高达56。

注意事项

1. KV260 v1.3.1现有的三个例程支持的DPU Fingerprint是0x1000020f6014406 (B3136),而在Vitis AI可下载的xmodel的DPU Fingerprint基本是 0x1000020f6014407 (B4096),不能直接使用,需要自己从量化模型中转化。

2. Gstreamer命令流中omxh264enc target-bitrate=3000必须加上target-bitrate=3000,否则默认为64,文件过小可能有问题。

3. nlp-smartvision例程中可以正常硬件解码omxh264dec,不能使用omxh264enc。这也意味着只使用官方例程ubuntu镜像不能使用rtsp传输和保存编码文件,这限制了ubuntu所拥有的较多的gstreamer插件的使用。

关于Xilinx VVAS的更多介绍请点击:https://china.xilinx.com/products/design-tools/vitis/vvas.html

最新文章

最新文章