多目标跟踪中检测器和跟踪器如何协同工作的
flyfish
主要是两者 接口间的交互
假设
原始图像尺寸:1920(宽)x 1080(高)
模型输入尺寸:640(宽)x 640(高)
检测器处理流程
-
读取原始图像 :
检测器首先读取一张原始图像,大小是1920x1080。
-
预处理 :
检测器将原始图像调整大小,使其适合模型的输入尺寸640x640。
为了保持图像的比例不变,检测器会根据原始图像的宽高比进行缩放。比如,缩放后的图像可能是640x360。如果图像在某个维度没有达到640,检测器会用灰色或其他颜色填充剩余部分,形成640x640的输入图像。
预处理还包括归一化操作,将图像像素值从0-255缩放到0-1之间,并减去均值、除以标准差等操作。
-
模型推理 :
将预处理后的图像输入到检测模型中,模型会输出检测结果,这些结果包括每个检测到的目标的边界框(bbox)和置信度分数。
-
后处理 :
检测器将模型输出的边界框还原到原始图像的尺寸。比如,如果一个目标在640x640的图像中占据了某个位置,检测器会将这个位置转换回1920x1080的尺寸。
后处理还包括过滤掉置信度较低的检测结果,确保只保留较为准确的检测结果。
检测器输出
-
dets
:包含检测到的目标的边界框和置信度分数。 -
img_info
:包含原始图像的信息,比如高度、宽度和缩放比例。
跟踪器处理流程
- 初始化跟踪器 :
在整个视频或序列的处理过程中,只需要初始化一次跟踪器。初始化包括设置以下内容
track_thresh
:跟踪的阈值。track_buffer
:跟踪缓冲区大小。match_thresh
:匹配阈值。
- 更新跟踪器 :
每处理一帧图像时,跟踪器都会接收检测器的输出结果dets
和img_info
。
检测器的输出结果包括边界框(目标在图像中的位置)和置信度分数。
跟踪器输出
返回的是多目标跟踪表示 online_targets
:包含当前帧中所有跟踪目标的信息,包括:
- 边界框 :目标的当前位置。
- 置信度 :目标的置信度分数。
- 身份标识 :目标的唯一标识符。
- 跟踪状态 :目标是否被激活、丢失或移除。
- 类别标签 :目标的类别标签。
因为返回的是 单目标跟踪表示的list,所以该对象存储了有关单个轨迹的所有信息,并基于卡尔曼滤波执行状态更新和预测。
还会包括其他信息,根据需要再定是否使用
kalman_filter :用于此特定目标跟踪的卡尔曼滤波器实例。
mean :状态估计的均值向量。
covariance : 状态估计的协方差矩阵。
tracklet_len :轨迹的长度。
frame_id : 当前帧ID。
start_frame :对象首次检测到的帧。
多个单目标跟踪表示,就是多目标跟踪表示。
图像缩放
上面的检测器处理流程 预处理其中一部分是letterbox
使用letterbox处理一张原始图像时,目标是将图像缩放到指定的模型输入大小(640x640)并保持原始图像的宽高比,同时在图像的两侧或上下方添加填充(padding)以达到目标尺寸。
给定原始图像的尺寸为1920x1080(宽度*高度),我们需要将其缩放并添加填充以适应640x640的输入尺寸。
- 计算缩放比例 :需要将原始图像的尺寸调整到适合640x640的输入尺寸,保持宽高比。
宽高比为1920 / 1080 ≈ 1.78。
输入尺寸640x640的宽高比为1。
由于1920x1080的宽高比大于1,而640x640的宽高比为1,我们需要考虑缩放的限制。
-
计算缩放后的尺寸 :
由于输入尺寸为640x640,我们可以将宽度缩放到640,这样高度就需要按照相同比例进行缩放:
缩放比例 = 640 / 1920 ≈ 0.333。
缩放后的高度 = 1080 * 0.333 ≈ 360。
因此,缩放后的图像尺寸为640x360。
-
添加填充(padding) :
缩放后的图像尺寸为640x360,目标尺寸为640x640。
需要在图像的顶部和底部添加填充来达到目标尺寸:
填充的总高度 = 640 - 360 = 280。
由于填充需要对称地添加在图像的顶部和底部,每边添加的填充为280 / 2 = 140。
因此,原始图像1920x1080经过letterbox处理后,最终的图像尺寸为640x640,其中有效内容为640x360,顶部和底部各有140像素的填充。