DeepSort:基于检测的目标跟踪的经典

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


DeepSORT在SORT的基础上引入了深度学习的特征表示和更强大的目标关联方式,有效地减少了身份切换的数量,缓解了重识别问题。

1、DeepSORT简介

DeepSORT的主要思想是将目标检测和目标跟踪两个任务相结合。

首先使用目标检测算法(Faster R-CNN等)在每一帧中检测出目标物体的位置和边界框。然后,通过深度学习模型(如CNN)提取目标的特征表示,将每个目标与先前帧中已跟踪的目标进行匹配。

匹配过程中会考虑目标的特征相似度、运动一致性等因素,以确定目标的身份和轨迹。

DeepSORT的关键贡献之一是使用了一个强大的外观特征描述符,可以准确地区分不同目标之间的相似度。

DeepSORT还通过处理目标的消失和重新出现等复杂情况,实现了对长期跟踪的支持。

主要技术特点:

  • 级联匹配

  • ReID 网络

  • 马氏距离

  • 余弦距离

2、级联匹配

原因:

当一个目标长时间被遮挡之后,kalman滤波预测的不确定性就会大大增加,状态空间内的可观察性就会大大降低。

假如此时两个追踪器竞争同一个检测结果的匹配权,往往遮挡时间较长的那条轨迹的马氏距离更小,使得检测结果更可能和遮挡时间较长的那条轨迹相关联,这种不理想的效果往往会破坏追踪的持续性。

这么理解吧,假设本来协方差矩阵是一个正态分布,那么连续的预测不更新就会导致这个正态分布的方差越来越大,那么离均值欧氏距离远的点可能和之前分布中离得较近的点获得同样的马氏距离值。所以,作者使用了级联匹配来对更加频繁出现的目标赋予优先权。

匹配:

为什么叫级联匹配,主要是它的匹配过程是一个循环。

即从missing age=0的轨迹,每一帧都匹配上,没有丢失过的轨迹到missing age=30的轨迹,丢失轨迹的最大时间30帧的轨迹,挨个的和检测结果进行匹配。

也就是说,对于没有丢失过的轨迹赋予优先匹配的权利,而丢失的最久的轨迹最后匹配。

这里丢失30帧了还给机会匹配,就是对遮挡目标的再跟踪。

级联匹配的距离度量是马氏距离和余弦距离的融合,设置了两个距离的阈值,先过滤一遍。

然后利用这个融合的距离进行匈牙利算法的匹配,匹配是对检测框和预测框的匹配。

而且匹配有优先级的,那些历史上一直有匹配上的轨迹优先匹配,而历史上已经已经很久没有匹配上的轨迹则最后匹配。

也就是说遮挡的可能性比较小,大部分没有匹配上的轨迹可能就是目标消失了。

匹配流程图:

(蓝字只对蓝线有效)

情况1:确定的轨迹,一级匹配成功

流程:

(1)轨迹(上一时刻的检测框)经过kalman滤波预测后,会对当前帧预测出一组检测框。

(2)目标检测算法对当前帧进行目标检测,产生检测框。

(3)对于确定的轨迹来说与目标检测的检测框进行级联匹配,也就是利用马氏距离和图像特征相似度余弦距离进行匈牙利算法的数据关联。

(4)轨迹(上一时刻的检测框)成功与检测框匹配。

(5)进行卡尔曼滤波的融合,是检测框与预测框的融合,融合完后更新到轨迹中。

情况2:确定的轨迹,一级匹配失败,二级匹配成功

匹配失败分为轨迹匹配失败和检测框匹配失败两种。

轨迹匹配失败:

有些轨迹没有检测框与之匹配,原因是检测可能发生了漏检,某时刻,预测的轨迹tracks还在,但是检测器没有检测到与之对应的目标;也可能是这个目标消失不见了,或者被遮挡了,没有检测框了。

检测框匹配失败:

有些检测框匹配不上轨迹,原因可能是某一时刻有一个物体是新进入的镜头,就会发生检测框匹配不到tracks的情况,因为这个物体是新来的,在这之前并没有它的轨迹;也可能是物体长时间被遮挡后的检测,导致检测到的物体没有可以与之匹配的轨迹(长时间遮挡超过阈值轨迹被删除)。

流程:

(1)对于确定的轨迹来说与目标检测的检测框进行级联匹配,也就是利用马氏距离和图像特征相似度余弦距离进行匈牙利算法的数据关联。

(2)轨迹没有与检测框匹配,则对这些轨迹进行与检测框的IOU匹配,匹配成功。

(IOU匹配可以有效匹配静态场景几何体的部分遮挡的情况,提高匹配成功率。这里相当于进行多次匹配,第一次匹配成功那就成功,匹配不上再给一次机会,进行IOU匹配,这次匹配上也算匹配上。)

(3)检测框没有与轨迹匹配上,则对这些检测框进行与轨迹的IOU匹配,匹配成功。

(4)进行卡尔曼滤波的融合,是检测框与预测框的融合,融合完后更新到轨迹中。

情况3:确定的轨迹,一级匹配失败,二级匹配也失败。

流程:

(1)对于二级匹配失败的检测框,建立一个新的不确定的轨迹。因为匹配失败可能是视野中出现新目标了,也可能就是检测器的误检测,对这个检测框要不要建立真实轨迹是不一定的,也就是unconfirmed轨迹。

(2)这个新不确定的轨迹要经过一个考验才能成为真实轨迹,那就是要连续三帧都要有检测框对其进行成功匹配,那就确定是一个真实轨迹了。

(3)对于考核期的轨迹(3帧考核,unconfirmed轨迹),直接进行IOU匹配,匹配成功,计数加1,连续三次匹配成功,则变更为确定的轨迹。确认的轨迹接下来就会保存外观特征100帧。考察期间的轨迹在3帧内匹配失败,则直接删除,判定为偶然的误报。

(4)对于再次匹配失败的轨迹来说,如果这个轨迹是待确定的轨迹,则删除,如果是确定的轨迹,则判断接下来几帧(max age帧,30帧)是否还能匹配上,超过30帧了还不能匹配上,放弃了,这个轨迹终止了。可能是真的终止了,也可能是长时间遮挡,这个就是这个阈值max age的容忍程度了,遮挡太久就没办法了,只能认为是新目标了,也就是跟丢了。

如果在30帧内,那继续给你机会进行IOU匹配,这时候即使匹配成功了,也要进行三帧考察。

3、ReID 网络

DeepSORT中采用了一个简单的CNN来提取被检测物体的外观特征,在每次检测追踪后,进行一次物体外观特征的提取并保存,最多保存100帧。

后面每执行一步时,都要执行一次当前帧被检测物体外观特征与之前存储的外观特征的相似度计算,这个相似度将作为一个重要的判别依据。

Deep Sort 采用了经过大规模人员重新识别数据集训练的 Cosine 深度特征网络,该数据集包含 1,261 位行人的 1,100,000 多张图像,使其非常适合在人员跟踪环境中进行深度度量学习。

Cosine 深度特征网络使用了宽残差网络,该网络具有 2 个卷积层和 6 个残差块,L2 归一化层能够计算不同行人间的相似性,以与余弦外观度量兼容。通过计算行人间的余弦距离,余弦距离越小,两行人图像越相似。Cosine 深度特征网络结构如下图所示。

使用 Cosine 深度特征网络参数,将每个检测框内图片压缩为最能表征图片特异信息的128维向量,并归一化后得到外观描述向量。

4、马氏距离

DeepSort使用马氏距离表示检测框到轨迹的距离,马氏距离就是“加强版的欧氏距离”。

马氏距离规避了欧氏距离中对于数据特征方差不同的风险,在计算中添加了协方差矩阵,其目的就是进行方差归一化,从而使所谓的“距离”更加符合数据特征以及实际意义。

马氏距离是旋转变换缩放后的欧氏距离,它将样本的协方差矩阵纳入距离度量计算,相当于对欧式距离的修正。

马氏距离完成正交,解决了特征间相关性的问题,内含标准化,解决了特征间尺度不一致的问题。

马氏距离可用于判断点到某个分布的距离。

马氏距离是表示数据的协方差距离,计算两个未知样本集的相似度的方法。

公式:

马氏距离是旋转变换缩放后的欧氏距离,所以马氏距离的计算公式可以由欧式距离推导而来。

如果协方差矩阵为单位矩阵,马氏距离就简化为欧式距离。

欧式距离两个分量的权值都是1,而马氏距离可以是其他值。

等距线:  

旋转椭圆

马氏距离,将变量按照主成分进行旋转,让维度间相互独立,然后进行标准化,让维度同分布。

5、余弦距离

由于马氏距离在遮挡后的度量有些问题,因此DeepSort加入了图像特征相似度度来进行综合判断。

余弦距离则是一种相似度度量方式。

马氏距离是针对于位置进行区分,而余弦距离则是针对于方向和特征。

余弦相似度是一种常用的衡量向量之间相似度的方法,它可以用于计算两个向量之间的夹角的余弦值。

在图像相似度计算中,可以将图像转换为特征向量,在DeepSort中就是使用了ReID网络,然后使用余弦相似度来比较这些特征向量的相似程度。

余弦相似度的计算公式如下:

其中,A和B分别表示两个向量,·表示向量的点积,||A||和||B||表示向量的范数(即向量的长度)。

余弦相似度的取值范围在 -1 到 1 之间,值越接近 1 表示两个向量越相似,越接近 -1 表示两个向量越不相似,接近 0 表示两个向量之间没有明显的相似性或差异。

在图像相似度计算中,可以将图像转换为特征向量(如使用卷积神经网络提取的特征向量),然后计算这些特征向量之间的余弦相似度来衡量图像的相似性。

6、总结

DeepSort着重要解决的一个问题就是遮挡后的ID切换的问题,在遮挡一段时间后不管是IOU距离还是马氏距离,其实效果都不是很理想。

因此要想建立这种远程联系就要进行特征比对。

这个很像孪生网络的思想,建立一个历史目标库,检测框与目标库一一比对,相似度高的就是同一个目标,进行轨迹关联。

因此这里的ReID网络自然也可以用孪生网络来做。

孪生网络的应用有两种思路,一种就是当做ReID网络来用,下一帧使用检测器检测出来,然后对框内的目标进行相似度比对,这是判别式的思想。

另一种是当做生成式来用,对上一帧的检测框里面的目标进行特征提取,然后下一帧就不用检测器了,而是直接去所搜区域,逐一进行相似度比对找到目标。

 ——————

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

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

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

 

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

投稿吧   | 留言吧

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/43395.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

硬件产品经理:从入门到精通(新书发布)

目录 简介 新书 框架内容 相关课程 简介 在完成多款硬件产品从设计到推向市场的过程后。 笔者于2020年开始在产品领域平台输出硬件相关的内容。 在这个过程中经常会收到很多读者的留言,希望能推荐一些硬件相关的书籍或资料。 其实,笔者刚开始做硬…

10. 实现业务功能--退出登录

目录 1. 实现 Controller 2. 单体测试 3. 实现前端界面 退出的具体实现逻辑如下: 1. 用户访问退出接口 2. 服务器注销 Session( 在 Controller 中可以直接进行处理 ) 3. 返回成功或失败 4. 如果返回成功浏览器跳转到相应页面 5. 结束 一般来说&#…

使用VS2015打开.pro文件后,编译报错

编译报错内容: MSB8036 找不到 Windows SDK 版本10.0.18362.0。请安装所需的版本的 Windows SDK 或者在项目属性页中或通过右键单击解决方案并选择“重定解决方案目标”来更改 SD 方法: 1.右键点击 Solution上,在弹出的框中点击“Retarget…

调整数组使奇数全部都位于偶数前面

题目内容: 输入一个整数数组,实现一个函数, 来调整该数组中数字的顺序使得数组中所有的奇数位于数组的前半部分, 所有偶数位于数组的后半部分。 题目思路: 将奇数部分放在前半部分,偶数部分放在后半部分&am…

学习笔记230804---restful风格的接口,delete的传参方式问题

如果后端提供的删除接口是restful风格,那么使用地址栏拼接的方式发送请求,数据放在主体中,后端接受不到,当然也还有一种可能,后端在这个接口的接参设置上是req.query接参。 问题描述 今天遇到的问题是,de…

新榜 | CityWalk本地生活商业价值洞察报告

如果说现在有人问,最新的网络热词是什么? “CityWalk”,这可能是大多数人的答案。 近段时间,“CityWalk”刷屏了各种社交媒体,给网友们带来了一场“城市漫步”之旅。 脱离群体狂欢,这个在社交媒体引发热议的词汇背后又…

首发 | FOSS分布式全闪对象存储系统白皮书

一、 产品概述 1. 当前存储的挑战 随着云计算、物联网、5G、大数据、人工智能等新技术的飞速发展,数据呈现爆发式增长,预计到2025年中国数据量将增长到48.6ZB,超过80%为非结构化数据。 同时,数字经济正在成为我国经济发展的新…

锐捷无线产品运维(Web登录、 命令行登录)

目录 登录AP产品 Console登录(只可以现场登录) Web/Telnet/SSH登录(可以现场、远程登录) 配置AP的管理地址 通过Web界面远程登录 通过Telnet、SSH等命令行的方式登录 登录AC产品 Console登录(只可以现场登录&a…

[bug] 记录version `GLIBCXX_3.4.29‘ not found 解决方法

在使用mediapipe 这个库的时候,首次使用出现 GLIBCXX_3.4.29’ not found 错误, 看起来是安装mediapipe 的时候自动升级了 matplotlib 这个库,导致依赖的 libstd.so 版本不满足了,GLIBCXX_3.4.29 is an object from libstdc.so.…

【c语言】字符函数与字符串函数(上)

大家好呀,今天给大家分享一下字符函数和字符串函数,说起字符函数和字符串函数大家会想到哪些呢??我想到的只有求字符串长度的strlen,拷贝字符串的strcpy,字符串比较相同的strcmp,今天,我要分享给大家的是我们一些其他的…

Photoshop制作漂亮光泽感3D按钮

原文链接(https://img-blog.csdnimg.cn/45472c07f29944458570b59fe1f9a0e0.png)

性能测试技术之基础篇(精华)

目录 一、什么是性能? 二、什么是性能测试? 三、性能测试结果需要记录哪些参数? 四、如何做性能测试(性能测试流程)? 1、指标建模 2、诊断调优 五、常见性能测试工具 一、什么是性能? …

【C语言】字符函数和字符串函数

目录 1.求字符串长度strlen 2.长度不受限制的字符串函数 字符串拷贝strcpy 字符串追加strcat 字符串比较strcmp 3.长度受限制的字符串函数介绍strncpy strncat ​编辑strncmp 4.字符串查找strstr 5.字符串分割strtok 6.错误信息报告 strerror perror 7.字符分类函…

【算法挨揍日记】day03——双指针算法_有效三角形的个数、和为s的两个数字

611. 有效三角形的个数 611. 有效三角形的个数https://leetcode.cn/problems/valid-triangle-number/ 题目描述: 给定一个包含非负整数的数组 nums ,返回其中可以组成三角形三条边的三元组个数。 解题思路: 本题是一个关于三角形是否能成立…

概述、搭建Redis服务器、部署LNP+Redis、创建Redis集群、连接集群、集群工作原理

Top NSD DBA DAY09 案例1:搭建redis服务器案例2:常用命令限案例3:部署LNPRedis案例4:创建redis集群 1 案例1:搭建redis服务器 1.1 具体要求如下 在主机redis64运行redis服务修改服务运行参数 ip 地址192.168.88.6…

Elasticsearch:如何在 Ubuntu 上安装多个节点的 Elasticsearch 集群 - 8.x

Elasticsearch 是一个强大且可扩展的搜索和分析引擎,可用于索引和搜索大量数据。 Elasticsearch 通常用于集群环境中,以提高性能、提供高可用性并实现数据冗余。 在本文中,我们将讨论如何在 Ubuntu 20.04 上安装和配置具有多节点集群的 Elast…

关于Linux Docker springboot jar 日志时间不正确 问题解决

使用Springboot项目的jar,制作了一个Docker镜像,启动该镜像后发现容器和容器中的Springboot 项目的日志时间不正确。 解决 查看容器时间命令为: docker exec 容器id date 1. 容器与宿主机同步时间 在启动镜像时候把操作系统的时间通过&q…

SpringBoot创建和使用

spring core的方式来写代码还是比较繁琐的,而spring boot就是帮助程序员使用spring开发的一个脚手架(boot),它是一个用于构建Java应用程序的开源框架,旨在简化开发流程并提高生产效率。它的主要优点有: 快速…

CSS简介

目录 CSS CSS概念 核心概念 为什么需要CSS 语法 CSS的引入方式 内联样式(行内样式) 内部样式 外部样式(推荐) CSS CSS概念 CSS(Cascading Style Sheets)层叠样式表,又叫级联样式表&am…

【Vue-Router】导航守卫

前置守卫 main.ts import { createApp } from vue import App from ./App.vue import {router} from ./router // import 引入 import ElementPlus from element-plus import element-plus/dist/index.css const app createApp(App) app.use(router) // use 注入 ElementPlu…