【MOT】多目标跟踪sort的加速思路
此帖记录一下在视觉感知项目中的一些曲折经历。
机子是NVIDIA Jetson AGX,具体型号未知。
单独启用一个ros结点做目标跟踪,因为deepsort多了一个网络,延时可能比较高,遂用了更简单的sort。
第一次在agx上跑了一下,发现延迟非常高,纯sort的耗时在30ms以上,有些帧甚至达到60+ms,这肯定不正常啊。
首先分析各模块耗时:
主机 | agx | |
---|---|---|
kf_predict | 0.46 | 4.04 |
assignment | 0.15 | 1.27 |
kf_update | 0.24 | 30.05 |
pop | 0.11 | 1.89 |
note: 以上结果统计的不够严谨,但是大体能表征一下趋势。
- kf_predict:使用卡尔曼滤波根据上一帧的位置来预测当前帧的位置
- assignment:使用匈牙利匹配分配检测框和轨迹框
- kf_update:对匹配框使用卡尔曼滤波做更新
- pop:删掉未匹配的轨迹框
对新出现的检测框我忘了统计了,就是一个初始化的时间,应该不是sort时间长的主要原因(次要原因应该都称不上)。
通过对比,发现agx的耗时正常来说应该是我用的主机的10倍左右,但是kf_update时间异常,查了一下self.kf这个类,发现都是用的filterpy这个库,遂点进去查看。
from filterpy.kalman import KalmanFilter
发现主机和agx上的kalman类文件竟然不完全一样,推测可能是python版本的问题导致库不同(主机上是py3.8,agx上是py3.6)。
注意观察py3.6上的库多了一部分计算,尝试删去这部分之后kf_update部分节约了十几ms,后来我直接把py3.8的类复制到agx上调用,kf_update部分直接从30.05 -> 11.6ms,这只是第一步。
虽然速度有了大大提升,但是有时仍然会因为cpu性能或者其他原因导致每帧延迟掉到15fps以下(这是/neuvition的发布频率),虽然我设置了接收器消息队列长度为1,但仍然不能及时接收到最新消息,导致图像持续滞后(不知道为啥,希望大佬指教一番),这次的主要原因仍然是kf_update。
我又分析了一下kf_update内部的计算过程,除了一次求逆外都是矩阵乘法,按理说不应该这么慢。重点来了,问题恰恰出在了求逆矩阵上,源码里直接用 np.linalg.inv() 求逆矩阵,在一次KalmanFilter.update 中占了足足三分之一的时间(罪大恶极)。
找到问题就好解决了,想到deepsort中KalmanFilter.update用了cholesky矩阵分解加快求解,
ST KT =(PHT)T ,(式1)
原本需要矩阵两边左乘(ST)-1但求逆过程比较费时。
矩阵分解后令LLT=ST,其中S是对称正定矩阵,L是上三角矩阵。此时(式1)变为
LLTKT =(PHT)T,(式2)
再令
LTKT =Y,(式3),
上式变为
LY=(PHT)T,(式4)
由于L是上三角矩阵,因此很容易计算出L-1,因此容易解线性方程组得到Y,代入(式3),即可求解卡尔曼增益K。
通过cholesky矩阵分解,可以快速计算K,节省大量时间,具体代码如下:
将
self.SI = self.inv(self.S)
self.K = dot(PHT, self.SI)
改为
chol_factor, lower = scipy.linalg.cho_factor(self.S, lower=True, check_finite=False)self.K = scipy.linalg.cho_solve((chol_factor, lower), PHT.T,check_finite=False).T
单个track的kf_update不便于比较,这里我直接放整个sort的结果:
- 20.69ms -> 9.86ms
速度有了质的飞跃,这就是第二步。
后记
该说不说,deepsort相比于sort在KalmanFilter上有了很大改进,自带一个类文件,不用担心因为python自带的filterpy.kalman库版本不一样导致的效率不同,同时逆运算通过trick获得了极大的速度提升。
经过前两步的加速,sort结点已经完全达到了使用要求,于是没有采用其他加速方法,设想中可以再利用numba来加速kalmanfilter的矩阵运算或者是sort中的iou计算。
此外,若sort中需要夹杂其他任务,如车牌检测,则最好用多线程并行处理,以此保证sort的速度,详情可参见我的另一篇博客python threading多线程实例。
【MOT】多目标跟踪sort的加速思路相关推荐
- 【MOT 多目标跟踪 综述 】(更新中)
运动目标跟踪(MOT)子系统(也称为多目标检测与跟踪-DATMO)负责检测和跟踪自动驾驶汽车周围环境中运动障碍物的姿态. 该子系统对于使自主车辆做出决策和避免与潜在移动物体(如其他车辆和行人)碰撞至关 ...
- MOT学习 - SORT算法
paper:https://arxiv.org/abs/1602.00763 code:https://github.com/open-mmlab/mmtracking https://github. ...
- MOT多目标跟踪评价指标
MOT网址: https://motchallenge.net/results/MOT17/ 指标 Avg Rank:这是每个跟踪器在所有当前评估测量中的平均等级 MOTA:Multiple Obje ...
- 妙啊,阻塞到底是个啥?黄袍加身,亦能谈古说今
不羡鸳鸯不羡仙,一行代码调半天. 现在,请记住你的身份!从进入本篇文章开始,你就是皇帝!三宫六院七十二妃,任君品尝. 人有亲疏远近,事有轻重缓急.作为万岁,你的时间非常宝贵.整个王朝都在你手中运算,方 ...
- 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附代码)
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1.跟踪基础知识简介 首先要说明一点,现在多目标跟踪算法的效果,与 ...
- 【项目实践】从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附注释项目代码)...
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|集智书童 1.跟踪基础知识简介 首先要说明一点,现在多目标 ...
- 多目标跟踪MOT入门
摘自:一线算法工程师整理!超实用的3大多目标跟踪算法 一线算法工程师整理!超实用的3大多目标跟踪算法https://mp.weixin.qq.com/s/LkfFY5PXzek-KRblo2gKGA ...
- 【算法】Bubble Sort(泡式排序)的编程实现思路及其复杂度分析==>冒泡排序
冒泡排序 Bubble Sort的复杂度分析 什么是复杂度? 简单的来说当我们需要衡量算法的优异程度的时候就需要用到它... 对一个算法来说,我们一般用时间和空间这两个维度来衡量它.也就是算法的执行时 ...
- 【CV】带你入门多目标跟踪(二)SORTDeepSORT
上一篇文章大概给大家介绍了一下多目标跟踪MOT的一些基础知识.初次了解还是从经典的算法开始,SORT和DeepSORT是多目标跟踪中两个知名度比较高的算法.DeepSORT是原团队对SORT的改进版本 ...
最新文章
- ATS中的ComboHandler合并回源插件调研
- python第三方库是什么意思-Python最强大的第三方库,你有必要了解一下!
- 【机器学习基础】Python实现行转列?!超简单,赶快get起来
- 字节跳动又一款中重度游戏曝光,它要进军“漫改MMO”领域!
- python中可通过()实现代码的复用_( )是可复用的,提供明确接口完成特定功能的程序代码块。...
- ios batchRequest
- vMotion、SvMotion、HA和FT的详细对比说明
- 递归查找特定路径的所有特定文件
- PS 2022,PR 2018,AE 2017【百度网盘链接,没套路】
- 非线性光纤光学——四波混频
- Python周刊518期
- 【3D音效增强神器】Boom 3D for Mac中文版 v1.2.2
- Johnson–Lindenstrauss Lemma
- 还在用PDF做简历?落后了!
- 四川贝利思科技:拼多多开店的优势所在
- COSMOS认证辅导,真正的有机护肤品首先要是天然植物成分,不受转基因和人工化学添加的影响
- Principles of fMRI 1课程笔记7--fMRI数据的时间分辨率和空间分辨率
- 【servlet】登陆验证之验证码模板
- “AI+教育”想做好有多难?网易有道CEO、学霸君CEO等4位大佬“掏心窝”...
- 采油工计算机试题库,采油模拟试题集1
热门文章
- 利用webpack简单搭建 .vue环境
- 黑群晖DSM7.0.1物理机安装教程
- 怎么使用计算机开机关机,笔记本电脑怎么开关机_笔记本电脑正确的开关机步骤-win7之家...
- 四国军棋引擎开发(2)简单的事件驱动模型下棋
- 74ls192/74ls193中文资料介绍-引脚图-真值表-工作原理
- PUW防水泄压阀,提升5G通讯基站天线防水性能
- cobol 文件相关语句
- Linux下搭建及配置禅道服务器详细过程-包含软件资源-Dotest董浩
- 微信H5支付原生支持
- RDMA-QP状态转换