在计算机视觉的应用中,“识别”只是一个相当入门的技术,相信很多人在执行深度学习推理应用中,经常产生的质疑就是“识别出的类别,有什么用途呢”?
确认每一帧图像中有多少个我们想要识别的种类,以及他们在图像中的位置,只是整个应用的第一步而已,如果缺乏“目标追踪(tracking)”的能力,就很难提供视频分析的基础功能。
在标准 opencv 体系里有 8 种主流的目标追踪算法,有兴趣的可以在网上搜索并自行研究。
算法的基本逻辑就是需要对视频的相邻帧进行“类别”与“位置”的比对,因此这部分的计算还是相当消耗计算资源的,也就是当视频分析软件“开启”目标追踪功能时,其识别性能必定有所下降,大家必须先有这样的认知。
deepstream 的定位就是针对“视频分析”的应用,因此“目标追踪”是其最基本的功能之一。
在前面使用的 mynano.txt 配置文件中,只需要调整一个设定值就能开启或关闭这个追踪功能,非常简单。
deepstream 支持 iou、klt 与 nvdcf 三种目标追踪算法(如下图),其中 iou 的性能最好,在 jetson nano 2gb 上的总体大约能到 200fps;nvdcf 的精确度最高,但目前性能大约只能到 56fps;klt 算法目前在性能与精确度的平衡比较好,总体性也能到 160fps,因此通常都选择 klt 追踪器做演示。
算法的细节不多做解释,请自行寻找相关技术文件学习,这里就直接进入实验的过程。还是以前一篇文章中的 mynano.txt 配置文件为主,如果不知道的话,就用 source8_1080p_dec_infer-resnet_tracker_tiled_display_fp16_nano.txt 复制一份出来就可以,透过修改里面的参数,让大家体验一下 deepstream 目标追踪的功能。
01
目标追踪功能的开关
在 mynano.txt 最下方,可以看到[tracker]的设定组,下面有个“enable=1”的参数,就是目标追踪的功能。
现在先执行一次启动追踪功能,如下图可以看到每个识别出的物件除了类别、标框之外,旁边还有个编号,这个编号会一直跟着该物件,这样就形成“追踪”的功能。
此时的识别性能如下图,总性能(8 个数字相加)大约 160fps。
如果将[trakcer]下面改成“enable=0”,再执行看看结果如何?下图中能识别出物件的类别与标框位置,但是已经没有编号。
关闭追踪功能之后的识别性能如下图,总识别性能可以达到 250fps 左右。
02
切换追踪器
前面说过,目前 deepstream 5.0 支持三种追踪器,那么要如何选择呢?同样在[tracker]参数组下方,有这样的三行参数:
#ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_mot_iou.so
#ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_nvdcf.so
ll-lib-file=/opt/nvidia/deepstream/deepstream-5.0/lib/libnvds_mot_klt.so
前面加上“#”号的就是处于关闭的状况,请先将[tracker]切回“enable=1”的开启状态,接下来请自行加减“#”的位置以切换追踪器的选择,分别测试这三个追踪器的不同之处,包括识别性能与追踪能力。
这部分必须直接在视频中体验,因此就不截屏显示。测试结果可以感受到 iou 追踪器的性能最好,可达到 200fps 左右,但是同一物件的编号并不是太稳定,而 nvdcf 追踪器的编号最为稳定,但性能大概只有 iou 的 1/4,最多只能承受 2 路视频的实时分析。
klt 算法总体性能可达到 160fps,可以支持到8路以内的实时识别,追踪能力也比 iou 好不少,不过这个算法对 cpu 的占用率比较高,是这个算法的主要缺点。该如何选择需要看实际的场景与计算设备的资源而定。
03
获取追踪数据
前面打开目标追踪功能的目的,并不只是为了在显示器上看看而已,而是用这些数据做更有价值的应用,而这些数据要从什么地方得到呢?通常都需要透过 python 或 c++从 deepstream 提供的接口去获取。
这里提供一个无需了解 deepstream 接口就能获取目标追踪数据的方法,只要我们在 mynano.txt 里面的[application]参数组,添加一条“kitti-track-output-dir=《path》”的路径指向就可以,这里假设要将数据存入“/home/nvidia/track”路径下,在 mynano.txt 里添加一行参数即可:
[application]
kitti-track-output-dir=/home/nvidia/track
执行“deepstream -c mynano.txt”之后,就可以看到/home/nvidia/track目录下产生非常多的文件,如下截屏:
每个文件存放“一帧”的目标追踪结果,例如我们测试的 sample_1080p_h264.mp4 视频有 48 秒,每秒有 30 帧图像,就会生成 1440 个文件。
前面 6 位数“00_000”代表视频源的编号,从“0”开始,如果有 4 路视频源就会有“00_000”~“00_003”的编号,后面 6 位则是流水号,例如这个测试视频就会生成“000000.txt”~“001440.txt”,由这两部分组合而成文件名。
这是 kitti 格式的数据,第一栏位是该物件的类别,第二栏是该物件的“追踪编号”,后面数据所代表的意义,请自行参考 kitti 的格式定义。
现在我们就可以依序读入这些追踪文件,或者将这些文件回传给控制中心,进行文件解析与信息提取,这样是不是很方便?相信这些内容对于开发会很有帮助。
idt无线充电芯片及方案介绍
机器人应用各行业发展情况如何?未来应该如何发展预测报告
智慧公安情报分析系统开发指挥调度系统搭建
荣耀xSport Pro运动蓝牙耳机开售采用了渐变设计可以连续听歌18个小时
傅里叶变换的目的和意义 傅里叶变换几何意义
计算机视觉中识别出的类别有什么用途
小米5c和荣耀8青春版,颜值都很高,你喜欢金属还是玻璃?
电子显示屏常见故障及解决方法
影响光纤强度的问题分析
RoHS指令实施在制造工艺中的应用
AI星海中的“中国空间站”:昇腾如何助力鹏城云脑Ⅱ实现全球领航
日本OLED电视出货量同比增长190% OLED电视大热但LGD却左右为难
BLF2425M9LS140功率晶体管
工业和信息化部在京举行媒体通气会
区块链为跨境支付模式可以解决传统制度的弊端
安徽省量子计算工程研究中心:科研团队成功研制出“量子芯片温度计”
嵌入式开发流程与处理器区别
苹果M1内存位宽是A14的两倍
传送带对智慧中药房的提升到底有多大?
亚马逊员工计划对COVID-19感染进行为期两天的罢工