5.2 KiB
5.2 KiB
yolo + stable track 说明
这套逻辑的目标不是直接相信 ByteTrack 的 raw id,而是维护一个更稳定的 stable id。
1. 基本概念
raw idByteTrack 当前帧给出的轨迹号,只表示短时 2D 跟踪结果,可能抖动、复用、换人。stable id本节点自己维护的长期身份号,用于:/target_observation/track_observations- RViz marker
- ReID gallery
primary target当前跟随目标。它只是某一个stable id,不是单独一套编号。
2. 当前关联逻辑
每一帧大致按下面顺序运行:
YOLO poseByteTrackraw-id fast path- 如果某个 row 的
raw id能续上上一帧同一个stable id,先临时绑定 - 注意:这一步现在只是“初始猜测”,不是最终判决
- 如果某个 row 的
ReID- 对还没绑定的 row,和所有已有
stable id的 gallery 做相似度比较 - 若满足
match_threshold且领先第二名至少gap_threshold,直接回绑旧stable id
- 对还没绑定的 row,和所有已有
single-person 3D fallback- 只在单人场景下启用
- 只服务当前
primary target - 用于 ReID crop 不可用时的兜底恢复
new stable id allocate- 如果和所有旧
stable id都无法匹配 - 且同一个 ByteTrack
raw id连续出现满target_reid_confirm_hits_before_allocate - 才会申请一个新的
stable id
- 如果和所有旧
3. stable id 的原则
stable id是长期身份,不是当前画面里的顺位号- 某个目标暂时丢失时,它原来的
stable id会继续保留,直到 timeout age out - 不能因为画面里少了一个人,就把别人的
stable id顶上去
这也是为什么:
raw id可以变- 但
stable id应该尽量不变
4. gallery 更新原则
gallery 现在不会随意更新。
4.1 什么时候能进 gallery
只有在下列情况之一时,当前 feature 才允许写进对应 stable id:
- 该 row 通过 ReID 成功回绑到旧
stable id - 该 row 已经拿到正式
stable id,并且到了定期 refresh 时机 - 该 row 是经过连续确认后刚申请到的新
stable id
4.2 什么时候不允许更新
如果一个 row 是通过 raw-id fast path 临时续上的,但 ReID 明显反对这个绑定,则:
- 该帧不会更新这个
stable id的 gallery - 必要时会直接撤销 fast-path 绑定,让后续 ReID 重新决定该 row 属于哪个旧
stable id
这样做是为了避免:
- ByteTrack 一次短时漂移
- 把错人的 feature 写进旧
stable id - 进而污染整个 gallery
4.3 fallback dist 会不会更新 gallery
不会。
fallback dist 只负责在单人场景下帮 primary target 暂时保住 stable id,不负责更新外观库。
5. 默认关键参数
这些参数都在:
当前常用参数:
target_reid_gallery_size: 8每个stable id最多缓存 8 个 ReID featuretarget_reid_feature_update_interval: 5最多每 5 帧尝试刷新一次 gallerytarget_reid_match_threshold: 0.65target_reid_gap_threshold: 0.10target_reid_lost_timeout_frames: 150target_reid_confirm_hits_before_allocate: 5新人申请新stable id前,要求同一个 ByteTrackraw id连续确认 5 帧target_reid_3d_fallback_enabled: 1单人场景启用 3D fallback
6. debug topic
假设 sync_topic_prefix=/odin/sync,则当前会有这些调试输出:
/odin/sync/detection_img_debug/compressed调试图。未分配stable id的 detection 画白色;已分配stable id的 detection 画对应彩色。/odin/sync/gallery_debug原始sensor_msgs/Image,不是 compressed。 用于看 ReID gallery 当前缓存了哪些人像 crop。 当前布局是:- 最多 8 行,对应 8 个
stable id - 10 列,对应 gallery 槽位
- 最多 8 行,对应 8 个
此外还有:
/odin/sync/target_observation当前 primary target/odin/sync/track_observations当前帧所有 fresh 3D 的 stable tracks/odin/sync/detection_pos_cam/odin/sync/detection_pos_world
7. debug_reid
开启:
debug_reid: 1
后,会打印每一帧的 ReID 相似度矩阵,格式类似:
[ReIDMatrix] prev_sid=1 bytetrack_id=[2,1] stable_id=[1,0] sims=[1->[sid0:0.905,sid1:0.508],2->[sid1:0.938,sid0:0.489]]
解释:
prev_sid上一时刻的 primary stable idbytetrack_id=[...]当前帧 ByteTrack row 的 raw idsstable_id=[...]当前系统最终给每个 row 绑定到的 stable idssims=[...]每个 ByteTrack row 和所有已有stable idgallery 的相似度
这个日志主要用来排查:
- 为什么某个 row 没能回绑到旧
stable id - 是 ByteTrack 漂了,还是 gallery 被污染了
- 当前绑定结果和 ReID 结果是否一致
8. 当前已知设计取向
这版实现明确偏向下面的目标:
stable id尽量稳定- 允许 ByteTrack 暂时失败
- 不允许一次错误 fast-path 直接污染 gallery
- 在多人场景下,优先相信 ReID,不用 3D fallback 去硬改多人 stable id
如果后面还要继续调,最值得重点观察的是:
debug_reid的矩阵输出/odin/sync/gallery_debug- 某个
stable id的 gallery 是否被混入了别人的 crop