本文作者:电巢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