SORT:基于检测的目标跟踪的鼻祖

SORT是一种简单、在线和实时的多目标跟踪算法,它结合了FasterR-CNN的目标检测和卡尔曼滤波的数据预测。通过匈牙利算法进行数据关联,解决目标跟踪中的身份匹配问题。尽管简单,但SORT在有限计算资源下能有效跟踪目标,不过它不考虑相机的非线性运动和目标的重识别问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

本文来自公众号“AI大道理”

 ——————

SORT是一种多目标跟踪的经典算法,整个算法是一些常规技术的简单组合,却达到了非常好的效果。

Sort算法的核心是匈牙利匹配算法和卡尔曼滤波算法。

1、SORT简介

SORT(Simple Online and Realtime Tracking)是一种简单、在线和实时的目标跟踪算法,它的设计目标是在计算资源有限的情况下实现高效的目标跟踪。

SORT算法的核心思想是通过联合目标检测和运动预测来进行目标跟踪。

算法首先使用目标检测器(Faster R-CNN)在每一帧中检测出目标物体的位置和边界框。然后,通过卡尔曼滤波器来对目标的运动进行建模和预测。卡尔曼滤波器结合了目标的当前状态和运动模型,可以估计目标在下一帧中的位置和速度。

SORT算法还引入了一种基于匈牙利算法的数据关联方法,用于在当前帧和先前帧之间建立目标的关联关系。该方法通过最小化关联成本来匹配当前帧中的目标和先前帧中的已跟踪目标,从而确定目标的身份和轨迹。

2、SORT的目标检测算法

单目标跟踪的初始框是人为框定进行初始化的。

多目标跟踪中基于检测器的跟踪,检测器检测出来的框就是初始框,从而避免了人工初始化。

基于目标检测的基础,SORT利用了faster-RCNN检测框架。

faster-RCNN 是一个由两个阶段组成的端到端框架。

第一阶段提取特征并提供候选区域区域,第二阶段在提出的区域中对目标进行分类。

该框架的优点是参数在两个阶段之间共享,从而创建了用于检测的有效框架。此外,网络架构本身可以交换到任何能够快速试验不同架构以提高检测性能的设计中。

Faster-RCNN算法流程:

(1)conv layers:即特征提取网络,用于提取特征。通过一组conv+relu+pooling层来提取图像的feature maps,用于后续的RPN层和取proposal。

(2)RPN(Region Proposal Network):即区域候选网络,该网络替代了之前RCNN版本的Selective Search,用于生成候选框。这里任务有两部分,一个是分类:判断所有预设anchor是属于positive还是negative(即anchor内是否有目标,二分类);还有一个bounding box regression:修正anchors得到较为准确的proposals。因此,RPN网络相当于提前做了一部分检测,即判断是否有目标(具体什么类别这里不判),以及修正anchor使框的更准一些。

(3)RoI Pooling即兴趣域池化(SPP net中的空间金字塔池化):用于收集RPN生成的proposals(每个框的坐标),并从(1)中的feature maps中提取出来(从对应位置扣出来),生成proposals feature maps送入后续全连接层继续做分类(具体是哪一类别)和回归。

(4)Classification and Regression:利用proposals feature maps计算出具体类别,同时再做一次bounding box regression获得检测框最终的精确位置。

3、SORT的数据关联

数据关联其实就是一个沿着时间轴,将来自同一个物体的不同时刻的信号串联起来的过程。

数据关联通常在状态估计之前进行,只有获得准确的数据关联处理结果,才能保证后续处理的正确性。

SORT在将检测分配给现有目标时,通过预测每个目标在当前帧中的新位置来估计每个目标的边界框几何形状。然后,分配成本矩阵被计算为每个检测和来自现有目标的所有预测边界框之间的交集-并集(IOU)距离。使用匈牙利算法最优地解决分配问题。此外,至少当探测到的目标重叠小于IOUmin时,施加IOU来拒绝分配。

匈牙利算法:

依次进行数据关联是局部最优解,并不能代表全局最优解。

而匈牙利算法则在追求全局最优,是一种在多项式时间内求解分配问题的组合优化算法。

多目标跟踪数据关联问题可以转化为有权二分图最小权匹配问题,匈牙利算法就是解决数据关联问题的图算法。

匈牙利算法(Hungarian Algorithm),也称为Kuhn-Munkres算法,是一种解决指派问题(Assignment problem)的优化算法。指派问题是在给定的任务和资源之间建立最佳的一对一分配关系的问题。

具体来说,匈牙利算法解决的是一个二维的代价矩阵,其中每个元素表示将一个任务分配给一个资源的成本或代价。算法的目标是找到一种分配方式,使得总成本最小。

匈牙利算法的基本思想是通过不断寻找增广路径来找到最佳的分配方式。

匈牙利算法步骤:

步骤1:代价矩阵德每一行减去改行的最小值。

步骤2:代价矩阵德每一列减去该列的最小值。

步骤3:用尽量少的线覆盖矩阵中所有的0,判断线的数量是否小于n(矩阵行数列数)

步骤4:线的数量小于n,则需要继续减,未被线覆盖的行或者列继续减掉未被覆盖的最小值,被线覆盖一次的不参与减,被线覆盖两次的反而要加这个最小值。

步骤5:重复上面步骤4,直到找到线的个数等于n,则得到最终的匹配方案。

最后需要划 4 条线才能覆盖住矩阵中所有的 0 元素,迭代终止,根据矩阵中 0 元素的位置很容易得到最终的匹配关系:目标1→目标D,目标2→目标B,目标3→目标A,目标4→目标C。

这个匹配满足构成的二分图上的匹配边总权重最小,即总的匹配距离最小,代价最低。

若目标和下一帧目标个数不一致,则需要补0进行匈牙利算法。

4、SORT的运动模型

SORT描述一个对象模型,用于将目标的身份传播到下一帧的表示和运动模型。SORT用独立于其他物体和摄像机运动的线性恒速模型来近似每个物体的帧间位移。

每个目标的状态被建模为:

其中 u 和 v 代表目标中心的水平和垂直像素位置,而比例 s 和 r 分别代表目标边界框的比例(面积)和纵横比。纵横比被认为是常数。当检测与目标相关联时,检测到的边界框用于更新目标状态,其中速度分量经由卡尔曼滤波器框架最优地求解。如果没有检测与目标相关联,则简单地预测其状态,而不使用线速度模型进行校正。

SORT中将卡尔曼滤波器用于检测框运动的预测,描述一个检测框需要以下四个状态,即:

  • 检测框中心的横坐标。

  • 检测框中心的纵坐标。

  • 检测框的大小(论文中叫做scale或者area)。

  • 长宽比。

以上四个状态可以描述一个检测框的基本信息,但是不能完全描述一个状态的运动状态信息,所以需要引入上述的状态的变化量信息(可以看作变化速度)来进行运动状态信息的描述。

由于SORT假设一个物体在不同帧中检测框的长宽比不变,是个常数,所以变化量只考虑上面的前三点,即

  • 检测框中心的横坐标的变化速度。

  • 检测框中心的纵坐标的变化速度。

  • 检测框的大小的变化速度。

所以SORT中共使用了7个参数,用来描述检测框的状态。

5、SORT的卡尔曼滤波

目标跟踪中,在数据关联后往往要进行卡尔曼滤波。

数据关联算法得到了每个目标的观测数据。

卡尔曼滤波使用关联的观测数据来估计目标的状态,并预测目标的未来位置和速度等信息。

卡尔曼滤波主要包括两个步骤:预测步骤和更新步骤。

  • 预测步骤(Prediction):根据系统的动态模型,使用上一时刻的状态估计和控制输入,预测系统的下一时刻状态和状态协方差。

  • 更新步骤(Update):通过比较系统的观测值和预测值,结合观测噪声和系统模型的不确定性,更新系统的状态估计和协方差。

卡尔曼滤波通过递归的方式进行状态估计,每个时刻的状态估计都会考虑前一时刻的估计结果和当前的观测值。

卡尔曼滤波适用于线性高斯系统。

卡尔曼滤波使用上一次的最优结果预测当前值,使用观测结果修正当前预测值,得到当前最优结果。

测量十次的时候卡尔曼滤波效果还不是很明显,当测量50次100次效果就出来了,在一定次数后的值明显不会偏离真实值很远。

这就是卡尔曼滤波达到的效果。

6、SORT的航迹标识

当对象进入和离开图像时,需要相应地创建或销毁唯一的身份。

为了创建跟踪器,SORT认为任何重叠小于IOUmin 的检测都表示存在未被跟踪的对象。

跟踪器使用速度设置为零的边界框的几何图形进行初始化。

由于在这一点上没有观察到速度,速度分量的协方差用大值初始化,反映了这种不确定性。

另外,新的跟踪器然后经历一个试用期,在此期间目标需要与检测相关联,以积累足够的证据,从而防止跟踪的误报。

如果对于 TLost 帧没有检测到轨道,则轨道被终止。

这防止了在没有来自检测器的校正的情况下由长时间的预测引起的跟踪器数量和定位误差的无限增长。

在所有实验中,TLost 设置为 1 有两个原因。首先,恒定速度模型是真实动态的不良预测器,其次,SORT主要关心帧到帧的跟踪,其中对象的重新识别超出了本工作的范围,如果一个物体再次出现,跟踪将隐含地以新的身份恢复。

7、总结

SORT是一个比较简单的算法,用FrRCNN做探测,卡尔曼滤波和匈牙利算法做跟踪。

缺点:

  • 线性恒速运动模型可能并不精确,未考虑相机的非线性运动。

  • 未考虑同一目标再次出现的重识别(Re-ID)问题。

 ——————

浅谈则止,细致入微AI大道理

扫描下方“AI大道理”,选择“关注”公众号

—————————————————————

 

—————————————————————

投稿吧   | 留言吧

<think>好的,我需要解决用户提到的ESP32出现rst:0x7 (TG0WDT_SYS_RESET)错误的问题。首先,我得理解这个错误代码的含义。根据用户提供的引用[1]和[4],TG0WDT_SYS_RESET可能和看门狗定时器有关。看门狗定时器的作用是在系统出现故障时重启设备,所以如果这个定时器被触发,说明系统可能遇到了死锁或长时间未响应的情况。 接下来,我需要分析可能的原因。用户提到他们使用Arduino进行编程,可能涉及到代码中的循环或延迟问题。比如,如果代码中有长时间的循环而没有喂狗操作,看门狗就会超时导致重启。另外,硬件问题比如电源不稳定或焊接不良也可能导致此错误,引用[3]提到IC没焊接好会导致类似问题,所以这可能是一个潜在原因。 然后,解决方案方面,首先应该检查代码,尤其是是否有阻塞操作或未及时喂狗的地方。用户可能需要添加vTaskDelay或调整看门狗设置。其次,检查电源是否稳定,使用示波器或万用表测量电压。再者,检查硬件连接,特别是芯片焊接是否良好,必要时重新焊接。此外,固件问题也可能导致错误,更新或重新烧录固件可能有效,引用[4]提到需要烧录工具和固件,所以提供相关链接或步骤会有帮助。最后,如果问题依旧,可能需要更换模块或联系技术支持。 需要确保回答结构清晰,分点列出原因和解决方案,并引用用户提供的资料来支持建议。同时,生成的相关问题应围绕常见的ESP32错误、看门狗定时器的处理、硬件检查方法等,帮助用户进一步排查问题。</think>### ESP32 TG0WDT_SYS_RESET rst:0x7 错误解析与解决方案 #### 错误原因分析 1. **看门狗定时器超时** `TG0WDT_SYS_RESET`表示系统因 **Timer Group 0 看门狗定时器超时** 触发复位。看门狗定时器(WDT)用于监控程序运行状态,若未及时"喂狗"(重置定时器),系统会强制重启以防止死锁[^4]。 2. **代码问题** - 存在长时间阻塞操作(如`delay()`过长、未释放CPU的循环) - 未正确处理多任务(FreeRTOS任务优先级冲突或堆栈溢出) - 未禁用或配置看门狗定时器[^1] 3. **硬件问题** - 电源不稳定(电压波动或电流不足) - 芯片虚焊或接触不良(需检查ESP32模块焊接质量)[^3] 4. **固件/配置异常** - 固件损坏或Flash读写错误 - 分区表配置错误 --- #### 分步解决方案 1. **代码检查与优化** ```cpp // 示例:在循环中添加喂狗操作 void loop() { esp_task_wdt_reset(); // 重置看门狗定时器 // 业务逻辑 delay(10); // 避免过长延迟 } ``` - 禁用看门狗(仅调试时用): `disableLoopWDT();`(需包含`esp_task_wdt.h`) - 检查所有`while`循环是否包含退出条件 2. **电源稳定性验证** - 使用示波器检查3.3V电源纹波(应<100mV) - 确保供电电流≥500mA(ESP32峰值电流可达300mA) 3. **硬件排查** - 重新焊接模块(参考引用[3]中IC虚焊案例) - 检查BOOT/EN按钮电路(下拉电阻10kΩ) - 测量Flash芯片的CLK/CS/MOSI引脚波形 4. **固件处理** ```bash # 使用esptool擦除Flash esptool.py --port COMX erase_flash # 重新烧录固件(参考引用[4]提供的固件) esptool.py --chip esp32 write_flash 0x1000 firmware.bin ``` 5. **高级调试** - 通过JTAG接口进行实时调试 - 查看`panic_handler`输出: `make monitor`(ESP-IDF环境) --- #### 关键参数配置建议 | 配置项 | 推荐值 | 作用 | |-----------------|-------------------------|--------------------------| | Task Watchdog | Timeout=5s | 防止任务阻塞 | | FreeRTOS堆栈 | ≥2048字节(复杂任务) | 避免堆栈溢出 | | CPU频率 | 240MHz | 提升处理速度 | | Flash模式 | QIO 80MHz | 优化Flash读写性能[^1] | ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值