此帖记录一下在视觉感知项目中的一些曲折经历。

机子是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的加速思路相关推荐

  1. 【MOT 多目标跟踪 综述 】(更新中)

    运动目标跟踪(MOT)子系统(也称为多目标检测与跟踪-DATMO)负责检测和跟踪自动驾驶汽车周围环境中运动障碍物的姿态. 该子系统对于使自主车辆做出决策和避免与潜在移动物体(如其他车辆和行人)碰撞至关 ...

  2. MOT学习 - SORT算法

    paper:https://arxiv.org/abs/1602.00763 code:https://github.com/open-mmlab/mmtracking https://github. ...

  3. MOT多目标跟踪评价指标

    MOT网址: https://motchallenge.net/results/MOT17/ 指标 Avg Rank:这是每个跟踪器在所有当前评估测量中的平均等级 MOTA:Multiple Obje ...

  4. 妙啊,阻塞到底是个啥?黄袍加身,亦能谈古说今

    不羡鸳鸯不羡仙,一行代码调半天. 现在,请记住你的身份!从进入本篇文章开始,你就是皇帝!三宫六院七十二妃,任君品尝. 人有亲疏远近,事有轻重缓急.作为万岁,你的时间非常宝贵.整个王朝都在你手中运算,方 ...

  5. 从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附代码)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 1.跟踪基础知识简介 首先要说明一点,现在多目标跟踪算法的效果,与 ...

  6. 【项目实践】从零开始学习Deep SORT+YOLO V3进行多目标跟踪(附注释项目代码)...

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|集智书童 1.跟踪基础知识简介 首先要说明一点,现在多目标 ...

  7. 多目标跟踪MOT入门

    摘自:一线算法工程师整理!超实用的3大多目标跟踪算法 一线算法工程师整理!超实用的3大多目标跟踪算法https://mp.weixin.qq.com/s/LkfFY5PXzek-KRblo2gKGA ...

  8. 【算法】Bubble Sort(泡式排序)的编程实现思路及其复杂度分析==>冒泡排序

    冒泡排序 Bubble Sort的复杂度分析 什么是复杂度? 简单的来说当我们需要衡量算法的优异程度的时候就需要用到它... 对一个算法来说,我们一般用时间和空间这两个维度来衡量它.也就是算法的执行时 ...

  9. 【CV】带你入门多目标跟踪(二)SORTDeepSORT

    上一篇文章大概给大家介绍了一下多目标跟踪MOT的一些基础知识.初次了解还是从经典的算法开始,SORT和DeepSORT是多目标跟踪中两个知名度比较高的算法.DeepSORT是原团队对SORT的改进版本 ...

最新文章

  1. ATS中的ComboHandler合并回源插件调研
  2. python第三方库是什么意思-Python最强大的第三方库,你有必要了解一下!
  3. 【机器学习基础】Python实现行转列?!超简单,赶快get起来
  4. 字节跳动又一款中重度游戏曝光,它要进军“漫改MMO”领域!
  5. python中可通过()实现代码的复用_(  )是可复用的,提供明确接口完成特定功能的程序代码块。...
  6. ios batchRequest
  7. vMotion、SvMotion、HA和FT的详细对比说明
  8. 递归查找特定路径的所有特定文件
  9. PS 2022,PR 2018,AE 2017【百度网盘链接,没套路】
  10. 非线性光纤光学——四波混频
  11. Python周刊518期
  12. 【3D音效增强神器】Boom 3D for Mac中文版 v1.2.2
  13. Johnson–Lindenstrauss Lemma
  14. 还在用PDF做简历?落后了!
  15. 四川贝利思科技:拼多多开店的优势所在
  16. COSMOS认证辅导,真正的有机护肤品首先要是天然植物成分,不受转基因和人工化学添加的影响
  17. Principles of fMRI 1课程笔记7--fMRI数据的时间分辨率和空间分辨率
  18. 【servlet】登陆验证之验证码模板
  19. “AI+教育”想做好有多难?网易有道CEO、学霸君CEO等4位大佬“掏心窝”...
  20. 采油工计算机试题库,采油模拟试题集1

热门文章

  1. 利用webpack简单搭建 .vue环境
  2. 黑群晖DSM7.0.1物理机安装教程
  3. 怎么使用计算机开机关机,笔记本电脑怎么开关机_笔记本电脑正确的开关机步骤-win7之家...
  4. 四国军棋引擎开发(2)简单的事件驱动模型下棋
  5. 74ls192/74ls193中文资料介绍-引脚图-真值表-工作原理
  6. PUW防水泄压阀,提升5G通讯基站天线防水性能
  7. cobol 文件相关语句
  8. Linux下搭建及配置禅道服务器详细过程-包含软件资源-Dotest董浩
  9. 微信H5支付原生支持
  10. RDMA-QP状态转换