当前位置: 首页 > news >正文

多目标跟踪中检测器和跟踪器如何协同工作的

多目标跟踪中检测器和跟踪器如何协同工作的

flyfish

主要是两者 接口间的交互

假设

原始图像尺寸:1920(宽)x 1080(高)
模型输入尺寸:640(宽)x 640(高)

检测器处理流程

  1. 读取原始图像
    检测器首先读取一张原始图像,大小是1920x1080。

  2. 预处理
    检测器将原始图像调整大小,使其适合模型的输入尺寸640x640。
    为了保持图像的比例不变,检测器会根据原始图像的宽高比进行缩放。比如,缩放后的图像可能是640x360。如果图像在某个维度没有达到640,检测器会用灰色或其他颜色填充剩余部分,形成640x640的输入图像。
    预处理还包括归一化操作,将图像像素值从0-255缩放到0-1之间,并减去均值、除以标准差等操作。

  3. 模型推理
    将预处理后的图像输入到检测模型中,模型会输出检测结果,这些结果包括每个检测到的目标的边界框(bbox)和置信度分数。

  4. 后处理
    检测器将模型输出的边界框还原到原始图像的尺寸。比如,如果一个目标在640x640的图像中占据了某个位置,检测器会将这个位置转换回1920x1080的尺寸。
    后处理还包括过滤掉置信度较低的检测结果,确保只保留较为准确的检测结果。

检测器输出

  • dets:包含检测到的目标的边界框和置信度分数。

  • img_info:包含原始图像的信息,比如高度、宽度和缩放比例。

跟踪器处理流程

  1. 初始化跟踪器
    在整个视频或序列的处理过程中,只需要初始化一次跟踪器。初始化包括设置以下内容
  • track_thresh:跟踪的阈值。
  • track_buffer:跟踪缓冲区大小。
  • match_thresh:匹配阈值。
  1. 更新跟踪器
    每处理一帧图像时,跟踪器都会接收检测器的输出结果detsimg_info
    检测器的输出结果包括边界框(目标在图像中的位置)和置信度分数。

跟踪器输出

返回的是多目标跟踪表示 online_targets:包含当前帧中所有跟踪目标的信息,包括:

  • 边界框 :目标的当前位置。
  • 置信度 :目标的置信度分数。
  • 身份标识 :目标的唯一标识符。
  • 跟踪状态 :目标是否被激活、丢失或移除。
  • 类别标签 :目标的类别标签。

因为返回的是 单目标跟踪表示的list,所以该对象存储了有关单个轨迹的所有信息,并基于卡尔曼滤波执行状态更新和预测。

还会包括其他信息,根据需要再定是否使用
kalman_filter :用于此特定目标跟踪的卡尔曼滤波器实例。
mean :状态估计的均值向量。
covariance : 状态估计的协方差矩阵。
tracklet_len :轨迹的长度。
frame_id : 当前帧ID。
start_frame :对象首次检测到的帧。
多个单目标跟踪表示,就是多目标跟踪表示。

图像缩放

上面的检测器处理流程 预处理其中一部分是letterbox

使用letterbox处理一张原始图像时,目标是将图像缩放到指定的模型输入大小(640x640)并保持原始图像的宽高比,同时在图像的两侧或上下方添加填充(padding)以达到目标尺寸。

给定原始图像的尺寸为1920x1080(宽度*高度),我们需要将其缩放并添加填充以适应640x640的输入尺寸。

  1. 计算缩放比例 :需要将原始图像的尺寸调整到适合640x640的输入尺寸,保持宽高比。
    宽高比为1920 / 1080 ≈ 1.78。
    输入尺寸640x640的宽高比为1。

由于1920x1080的宽高比大于1,而640x640的宽高比为1,我们需要考虑缩放的限制。

  1. 计算缩放后的尺寸
    由于输入尺寸为640x640,我们可以将宽度缩放到640,这样高度就需要按照相同比例进行缩放:
    缩放比例 = 640 / 1920 ≈ 0.333。
    缩放后的高度 = 1080 * 0.333 ≈ 360。
    因此,缩放后的图像尺寸为640x360。

  2. 添加填充(padding)
    缩放后的图像尺寸为640x360,目标尺寸为640x640。
    需要在图像的顶部和底部添加填充来达到目标尺寸:
    填充的总高度 = 640 - 360 = 280。
    由于填充需要对称地添加在图像的顶部和底部,每边添加的填充为280 / 2 = 140。

因此,原始图像1920x1080经过letterbox处理后,最终的图像尺寸为640x640,其中有效内容为640x360,顶部和底部各有140像素的填充。

相关文章:

  • JavaScript------const
  • kali系统几个开机启动项的区别
  • 【网络编程】多进程服务器端
  • mybatis使用注解形式实现一对多、多对多查询(转载)
  • Unity 6预览版即将增加对visionOS 2的支持
  • 【向量检索】之向量数据库Milvus,Faiss详解及应用案例
  • 0-1 构建用户画像数仓
  • 《操作系统真象还原》第七章——改进中断
  • 保障信息安全!等保2.0的二级和三级到底有何不同?详细解析
  • 【深度解析】如何有效恢复手机数据?5个简单步骤
  • Java学习笔记之基本数据类型转换
  • 解决Linux下Java应用因内存不足而崩溃的问题
  • 电脑丢失dll文件一键修复的方法有哪些?分析dll文件修复的多种策略
  • Unity:Text-TextMeshPro 不显示中文
  • python反序列化知识点学习
  • CSS进阶篇--用CSS开启硬件加速来提高网站性能
  • JAVA多线程机制解析-volatilesynchronized
  • JS函数式编程 数组部分风格 ES6版
  • LeetCode541. Reverse String II -- 按步长反转字符串
  • Netty源码解析1-Buffer
  • ng6--错误信息小结(持续更新)
  • NSTimer学习笔记
  • spring security oauth2 password授权模式
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • Webpack入门之遇到的那些坑,系列示例Demo
  • 力扣(LeetCode)21
  • 力扣(LeetCode)56
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 前端js -- this指向总结。
  • 前端面试之闭包
  • 三栏布局总结
  • 收藏好这篇,别再只说“数据劫持”了
  • 我的zsh配置, 2019最新方案
  • 移动互联网+智能运营体系搭建=你家有金矿啊!
  • 《天龙八部3D》Unity技术方案揭秘
  • MPAndroidChart 教程:Y轴 YAxis
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • #java学习笔记(面向对象)----(未完结)
  • #我与Java虚拟机的故事#连载14:挑战高薪面试必看
  • $var=htmlencode(“‘);alert(‘2“); 的个人理解
  • (C)一些题4
  • (动手学习深度学习)第13章 计算机视觉---图像增广与微调
  • (附源码)spring boot校园拼车微信小程序 毕业设计 091617
  • (附源码)ssm学生管理系统 毕业设计 141543
  • (亲测)设​置​m​y​e​c​l​i​p​s​e​打​开​默​认​工​作​空​间...
  • (三)centos7案例实战—vmware虚拟机硬盘挂载与卸载
  • (学习总结16)C++模版2
  • .env.development、.env.production、.env.staging
  • .NET C# 使用GDAL读取FileGDB要素类
  • .net core 外观者设计模式 实现,多种支付选择
  • .Net Core/.Net6/.Net8 ,启动配置/Program.cs 配置
  • .NET 服务 ServiceController
  • .net中的Queue和Stack
  • /usr/bin/env: node: No such file or directory
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解