<font color="#FF8000">本文作者:电巢FPGA专家王伟博士,中国高科技产业化研究会智能信息处理产业化分会理事</font>
<strong>VVAS GStreamer概念与两种镜像版本</strong>
<strong>1.1. GStreamer概念</strong>
如果是FPGA背景的,猛一看到GStreamer一头雾水,且慢我们拆解一下就没那么难理解了。
VVAS全称是Vitis Video Analystics SDK,是Xilinx公司基于GStreamer框架研发的基于视频的套件,用GStreamer的pipeline形式来实现,简单的说,就是用“!”连接的一行命令,每一个单独的命令我们叫他element,这一行命令来实现从图像输入、处理到输出的全过程。其element包括queue tee pad sink等,具体定义可以百度。
我们先看GStreamer在开发框架中的位置,如下图:
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240476-1.p…; alt=""></center>
GStreamer框架是一个支持多线程的框架,线程会根据Pipeline的需要自动创建和销毁,例如,将媒体流与应用线程解耦,应用线程不会被GStreamer的处理阻塞。而且,GStreamer的插件还可以创建自己所需的线程用于媒体的处理,例如:在一个4核的CPU上,视频解码插件可以创建4个线程来最大化利用CPU资源。
在创建Pipeline时,我们还可以指定某个Pipeline的分支在不同的线程中执行(例如,使audio、video同时在不同的线程中进行解码)。这是通过queue Element来实现的,queue的sink pad仅仅将数据放入队列,另外一个线程从队列中取出数据,并传递到下一个Element。queue通常也被用于作为数据缓冲,缓冲区大小可以通过queue的属性进行配置。
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240477-2.p…; alt=""></center>
在上面的示例Pipeline中,source是audiotestsrc,会产生一个相应的audio信号,然后使用tee Element将数据分为两路,一路被用于播放,通过声卡输出,另一路被用于转换为视频波形,用于输出到屏幕。
示例图中的红色阴影部分表示位于同一个线程中,queue会创建单独的线程,所以上面的Pipeline使用了3个线程完成相应的功能。拥有多个sink的Pipeline通常需要多个线程,因为在多个sync间进行同步的时候,sink会阻塞当前所在线程直到所等待的事件发生。
<strong>1.2. Kria SoM petalinux与ubuntu版本之别</strong>
新发布的Kria SoM版本有petalinux与ubuntu版本,区别如下:
a、插件数量之别
petalinux 发布较早,只有54 plugins,后者较多,有100多个plugins,其中包括比较常用的qtdemux和audio常用插件。qtdemux是处理mp4文件的插件。
例如下面这个例子可以在ubuntu镜像上实现,用autovideosink非常方便地将开发板的视频界面转到计算机上来,petalinux没有这个功能。
<pre>gst-launch-1.0 videotestsrc ! "video/x-raw,width=1280,height=720" ! autovideosink</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240478-3.p…; alt=""></center>
同样,ubuntu镜像可以播放文件,而petalinux镜像则不能。
<pre>gst-launch-1.0 playbin uri=file:///home/ubuntu/facedetect/mask.h264</pre>
b、操作命令之别
petalinux主要安装命令为rpm和dnf, 而ubuntu自然是apt get install。
petalinux 配置命令为xmutil,如下面更换BOOT.BIN文件使用:
<pre>xilinx-k26-starterkit-2021_1:~$ sudo xmutil bootfw_update -i ./BOOT.bin</pre>
查状态用sudo xmutil bootfw_update -v
而ubuntu为xlinx-config –xmutil,如下面更换BOOT.BIN文件使用:
<pre>ubuntu@kria:~$ sudo xlinx-config -x bootfw_update -i ./BOOT.BIN</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240479-4.p…; alt=""></center>
<pre>sudo xlnx-config -x bootfw-status</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240480-5.p…; alt=""></center>
c、例程之别
petalinux主要有三个例子, 对应三个硬件流,如下所示:
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240481-6.p…; alt=""></center>
smartcam镜像有着完整的VCU功能,支持硬件编码和解码,所有这三个应用均有jupyter python源码。
而ubuntu则只有一个例子,偏偏是VCU功能不全的那个硬件流。但是可以从网上下载多个模型来运行。
查阅连接资源
<pre>ubuntu@kria:~$ snap connections xlnx-vai-lib-samples</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240482-7.p…; alt=""></center>
查阅可安装的模型库,这里面显示的模型都可以安装
<pre>ubuntu@kria:~$ xlnx-vai-lib-samples.info</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240483-8.p…; alt=""></center>
d、xclbin文件之别
ubuntu包含bit stream, 2021.2.9生成,较早
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240484-9.p…; alt=""></center>
petalinux并不包含bit stream, 2021.6.9生成,较晚。
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240485-10…; alt=""></center>
<strong>1.3. VVAS应用相关文件</strong>
链接库位置
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240486-11…; alt=""></center>
json文件位置:
<pre>xilinx-k26-starterkit-2021_1:/opt/xilinx/share$ tree</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240487-12…; alt=""></center>
<strong>GStreamer由浅入深入手实例</strong>
<strong>2.1. h264 gstreamer解码编码例程</strong>
先试一条命令,将h264文件先解码,再编码,存入一个新文件,这是用来试开发板上的gstreamer功能完备,比较简单的一个例子。
<pre>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</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240488-13…; alt=""></center>
上面显示生成的文件大小正常,而选择输出不是输入的尺寸时,即不是width=1920, height=1080时,无法编码,文件大小下面图中为0。
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240489-14…; alt=""></center>
<strong>2.2. facedetect gstreamer例程</strong>
<pre>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</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240490-15…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240491-16…; alt=""></center>
当然你在配json文件时,注意文件的存入路径。
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240492-17…; alt=""></center>
<strong>2.3. yolov2-tiny gstreamer全流程例程</strong>
这是yolov2模型从开始训练、量化到编译的例子,这里我们只取在开发板用gstreamer命令行实现的部分,准备三个json文件和xmodel,在kv260上建立完整的目录结构。
a、开发板目录结构
按以下目录将相应文件准备好
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240493-18…; alt=""></center>
其中前处理文件preprocess如下:
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240494-19…; alt=""></center>
其中scale_r等值0.25计算过程如下,从下面的prototxt文件中取出scale值
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240495-20…; alt=""></center>
将取出的scale值0.00390625与输入张量input_scale值64(后节有说明)乘积得出preprocess文件中的scale_r等值0.25。
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240496-21…; alt=""></center>
b、ffmpeg准备视频
使用ffmpeg工具截取前十秒
<pre>ffmpeg -ss 00:00:00 -t 00:00:10 -accurate_seek -i multi.mp4 -codec copy multi10.mp4</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240497-22…; alt=""></center>
使用ffmpeg工具将mp4转换成h264
<pre>ffmpeg -i multi10.mp4 -c:v libx264 -pix_fmt nv12 -r 30 multi10.h264</pre>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240498-23…; alt=""></center>
c、yolov2-tiny gstreamer命令
<pre>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</pre>
d、gstreamer命令行运行结果
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240499-24…; alt=""></center>
这里采集的视频出自我手机自拍的北京明光桥下
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240500-25…; alt=""></center>
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240501-26…; alt=""></center>
e、Vitis AI 1.4 python程序运行结果
最后我们编写了Vitis AI 1.4的python源程序与之对照,分析参数和进行验证。下面是部分程序截图:
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240502-27…; alt=""></center>
命令行输出参数和结果,可以看到input_scale为64,同时帧率FPS高达56。
<center><img src="http://xilinx.eetrend.com/files/2022-01/wen_zhang_/100557190-240503-28…; alt=""></center>
<strong>注意事项</strong>
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