1. 背景
NVIDIA Deepstream SDK是基于开源GStreamer多媒体框架的流分析工具包,它加快了视觉AI应用程序的开发速度,使开发人员更容易构建核心深度学习网络,而不必从头开始设计端到端应用程序。一个典型的deepstream pipeline包括视频解码,预处理,批处理帧,推理,目标跟踪,可视化等。
2. 方案
基于DeepStream的视频分析框架如下:任务调度管理模块接收云端下发的视频分析任务;算法调度管理将对应的视频分析任务转化成对应的pipeline分析任务,并根据相应的调度算法下发至合适的分析节点;DeepStream视频分析模块支持对多路流同时分析,结果聚合模块将DeepStream分析结果聚合,达到一定去重的效果;算法监控监控算法任务是否执行异常,对于视频流中段的情况,可以等待视频流正常后将pipeline重新拉起。
3. 生成应用程序构件图
通过生成应用程序Pipeline构建图,有助于定位Pipeline异常情况。
3.1 安装dot:
sudo apt-get install graphviz
3.2 设置.dot生成的文件存放位置:
export GST_DEBUG_DUMP_DOT_DIR=/tmp
3.3 生成dot
在创建并链接完pipeline element的位置添加宏调用
gst_debug_bin_to_dot_file (GstBin * bin,
GstDebugGraphDetails details,
const gchar * file_name)
如
GST_DEBUG_BIN_TO_DOT_FILE(GST_BIN (appCtx->pipeline.pipeline),GST_DEBUG_GRAPH_SHOW_ALL,"ds-app-playing");
3.4 将dot转化成pdf或者png
dot -Tpdf abc.dot > abc.pdf
dot -Tpdf abc.dot > abc.png
4. 优化
要达到低延迟的目标,常见的办法是降低处理数据量,可以只对关键帧做处理,丢弃B帧,P帧。DeepStream提供了只处理关键帧的方法,在Gst-nvnideo4linux2插件里设置参数skip-frames=2可以只解码关键帧。
DeepStream Pipeline里任何一个element同步计算耗时过长超过源端视频帧的发送间隔的话,会导致整个pipeline里的视频数据流动速度下降从而产生帧累积,如果没有主动丢弃的话,使得延时越来越长。针对该情况,可以在解码decode模块主动丢帧或者使用videorate限制帧率,推荐后一种方案,将framerate设置到较低的值,让帧间隔大于inference等下游插件的同步计算所耗费的最大时间,从而实现视频稳定的无累积延时播放。