作为目标跟踪管道的一部分,我有一个具有各种检测概率的矩阵。我现在需要跟踪概率最高的点数。最明显的选择是阈值化和运行非最大抑制.
问题是:矩阵每秒更新约200万次,并且运行非最大抑制,这通常是不可能的。这个想法是,每次更新时,矩阵的变化非常小(可能每400个元素中就有20个在一次变化),所以现在我正在寻找类似于迭代非最大抑制的方法。不要每次都重做,而是更新上一个时间步骤的结果。
是否存在有效的算法?我自己想出了几个解决方案,但非效率特别高。
我在每个时间步骤获得的信息:
整体矩阵 哪些矩阵元变了 它们如何改变(+1或-1) 我正在用C++编写本征库的程序
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
面对您描述的场景,确实需要一种高效的方法来处理这种高频率更新且变化相对较小的数据。一个可能的解决方案是采用“增量非最大抑制”(Incremental Non-Maximum Suppression, INMS)策略,该策略基于前一帧的结果进行局部更新,而不是每次都从头开始计算。以下是一个简化的算法思路:
初始化: 首先,使用标准的非最大抑制算法对初始矩阵进行处理,得到第一帧的目标位置。
记录上一帧结果: 保存上一帧经过NMS处理后的有效目标位置及其对应的检测概率。
更新变化点: 对于每秒更新的矩阵,仅关注那些发生变化的元素。根据哪些元素改变了以及它们如何改变的信息,直接在上一帧的有效目标列表中进行更新。这包括:
局部NMS: 对于新加入或状态改变的目标,执行局部的非最大抑制,只考虑其周围的点,避免全局遍历。这样可以减少计算量,因为大部分区域保持不变。
优化数据结构: 使用合适的数据结构(如KD树、优先队列等)来存储和快速查询目标位置,以加速查找和比较过程。
循环上述步骤: 每次矩阵更新时重复这个过程,确保跟踪的是概率最高的点数,并且尽量减少不必要的重计算。
实现这一算法的关键在于如何高效地管理目标状态的变化和局部NMS的执行。C语言提供了足够的底层控制能力来实现这样的优化,但需要注意内存管理和算法细节上的优化,以确保高性能。
此外,考虑到您的应用场景,也可以探索是否有现成的库或框架能够提供部分支持,比如OpenCV虽然主要面向计算机视觉任务,但其中的一些数据结构和算法思想或许能为您提供灵感或直接的代码片段。不过,由于您的需求较为特定,定制开发可能是最直接有效的途径。