deepsort算法原理以及代码解析

教程 同时被 2 个专栏收录
15 篇文章 0 订阅
1 篇文章 0 订阅

概述

前边我们讲了sort算法的原理,并且指出了它的不足–IDsw过大,为了解决该问题,17年时候sort算法的团队又提出了DeepSort算法。Deepsort在原来Sort算法的基础上,改进了以下内容:

  1. 使用级联匹配算法:针对每一个检测器都会分配一个跟踪器,每个跟踪器会设定一个time_since_update参数。
  2. 添加马氏距离与余弦距离:实际上是针对运动信息与外观信息的计算。
  3. 添加深度学习特征:这一部分也就是ReID的模块,也是deepsort的亮点之一。

代码流程

由于deepsort的流程和算法原理几乎和sort一样,只是说增加了上边三个特色,因此我们直接从代码开始讲起:

整体流程图

算法的整体流程图如下所示:

2020-07-13_161051

源码流程

image-20200715113558645

首先我们从主函数部分开始说起,主函数部分整体逻辑是比较简单的,首先是将命令行参数进行解析,解析的内容包括,MOTChanlleng序列文件所在路径、需要检测文件所在的目录等一系列参数。解析之后传递给run方法,开始运行。

image-20200715113707665

进入run函数之后,首先会收集流信息,包括图片名称,检测结果以及置信度等,后续会将这些流信息传入到检测框生成函数中,生成检测框列表。然后会初始化metric对象,metric对象简单来说就是度量方式,在这个地方我们可以选择两种相似度的度量方式,第一种叫做余弦相似度度量,另一种叫做欧拉相似度度量。通过metric对象我们来初始化追踪器。

image-20200715113756738

接着根据display参数开始生成对应的visuializer,如果选择将检测结果进行可视化展示,那么便会生成Visualization对象,我从这个类中可以看到,它主要是调用opencv image viewer来讲追踪的结果进行展示。如果display是false则会生成一个NoVisualization对象,它一个虚拟可视化对象,它以给定的顺序循环遍历所有帧以更新跟踪器,而无需执行任何可视化。两者主要区别其实就是是否调用opencv将图片展示出来。其实前边我们所做的一系列工作可以说都是准备的工作,实际上核心部分就是在执行这个run方法之后。此处我们可以看到,在run方法中传入了一个frame_callback函数,这个frame_callback函数可以说是整个算法的核心部分,每一帧的图片都会执行该函数。

为什么这样说那?

首先进入run函数之后我们会发现,无论当时选择是可视化操作还是非可视化操作,它的run函数最终都要调用frame_callback函数的,比如说Visualization中的run方法,它首先判断帧序号是否大于最大帧,如果大于最大帧,直接返回。否则回调执行frame_callback函数;同样的如果是NoVisualization对象,它的run方法也是类似的,也是调用frame_callback函数,然后帧序号加1。最后上边追踪结果处理完之后,然后将追踪的结果保存到对应的目录下边。

image-20200715114107385

上边我们说了frame_callback函数实际上是整个函数的核心内容。进入frame_callback函数,我们可以看到,它第一步是根据之前的参数,生成检测框列表,然后将置信度小于最小置信度阈值的检测框剔除掉。

image-20200715114146972

然后执行非极大值抑制。

什么叫做非极大值抑制那?

简单来说就是就是一个寻找局部最大值的过程,我们以下边检测框为例,我们可以看到在检测人脸的过程中可能会产生多个检测框,通过非极大值抑制,可以在局部范围内选择出那个得分最高的检测框,剔除掉其他得分低的检测框。

image-20200715114206754

接着调用predict函数执行预测操作,进入predict函数,我们可以看到,它其实主要就是对轨迹列表中所有的轨迹使用卡尔曼滤波算法进行状态的预测。接着调用update函数执行更新操作。在update函数中,主要如下几件事:

  1. 根据之前预测的结果,进行匹配操作。在该开始匹配的时候都处于不确定态,然后若干次匹配之后,如果匹配成功的次数大于n_init的话,轨迹便会从初始态转换成确定态。如果一直没有匹配到检测框则会直接进入删除态。由于追踪的目标体可能会消失,因此就算进入到了确定态,如果在后续的匹配中多次没有匹配到,大于max_age的时候轨迹便会从确定态转换成删除态。一旦轨迹进入到删除态,则证明这个轨迹失效,后续便会被删除。

  2. 针对不同状态进行不同的操作

    a) 对未匹配的tracker,调用mark_missed标记,后续会删除对应的轨迹

    b) 针对未匹配的detection(检测框)。没有匹配到目标,因此检测框失配,进行初始化操作

    c) 更新轨迹列表,得到最新的tracks

    d) 更新处于确定态的trac_id

    e) 最后对特征集更新。

执行到此处当前帧的处理就完成了,直接帧序号加1,继续进行下一帧的操作。

结论

最后我们将代码整体原理整理成树图如下:

了便于大家阅读源码,我将源码的具体逻辑也整理成了一个树图:

deep_sort_app

  • 5
    点赞
  • 9
    评论
  • 38
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

评论9
请先登录 后发表评论~
<p style="margin: 0cm; background: white;"><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">本课程使用<span lang="EN-US">YOLOv5</span>和<span lang="EN-US">DeepSORT</span>对视频中的行人、车辆做多目标跟踪和计数,开展<span lang="EN-US">YOLOv5</span>目标检测和<span lang="EN-US">DeepSORT</span>多目标跟踪强强联手的应用。</span></p> <p style="margin: 0cm; background: white;"><span lang="EN-US" style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;"> </span><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">课程分别在</span><span lang="EN-US"><span style="box-sizing: border-box;">Windows</span>和</span><span lang="EN-US" style="font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-color-alt: windowtext;">Ubuntu</span><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">系统上做项目演示,并对<span lang="EN-US">DeepSORT</span>原理代码做详细解读(使用<span lang="EN-US">PyCharm</span>单步调试讲解)。</span></p> <p style="margin: 0cm; background: white;"><span lang="EN-US" style="font-size: 10.5pt; font-family: 'Arial',sans-serif; color: black; mso-themecolor: text1;"> </span></p> <p style="margin: 0cm; background: white; box-sizing: border-box; font-variant-ligatures: normal; font-variant-caps: normal; orphans: 2; widows: 2; -webkit-text-stroke-width: 0px; text-decoration-style: initial; text-decoration-color: initial; word-spacing: 0px;"><span style="box-sizing: border-box;"><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">课程包括:<span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">基础篇、实践篇、原理篇和代码解析篇。</span></span></span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;"><span style="mso-list: Ignore;">Ÿ<span style="font: 7.0pt 'Times New Roman';">  </span></span></span><!--[endif]--><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">基础篇包括多目标跟踪任务介绍、数据集和评估指标;</span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;"><span style="mso-list: Ignore;">Ÿ<span style="font: 7.0pt 'Times New Roman';">  </span></span></span><!--[endif]--><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-ascii-font-family: Arial; mso-hansi-font-family: Arial; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">实践篇包括</span><span lang="EN-US" style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">Win10</span><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">和<span lang="EN-US">Ubuntu</span>系统上的<span lang="EN-US">YOLOv5+DeepSORT</span>的多目标跟踪和计数具体的实践操作步骤演示,特别是对行人、车辆的<span lang="EN-US">ReID</span>数据集讲解了训练方法;</span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-size: 14.0pt; mso-bidi-font-size: 10.5pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;"><span style="mso-list: Ignore;">Ÿ<span style="font: 7.0pt 'Times New Roman';">  </span></span></span><!--[endif]--><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">原理篇中讲解了马氏距离、匈牙利算法、卡尔曼滤波器的原理,并解读了<span lang="EN-US">SORT</span>和<span lang="EN-US">DeepSORT</span>论文;</span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><!-- [if !supportLists]--><span lang="EN-US" style="font-size: 14.0pt; mso-bidi-font-size: 12.0pt; font-family: Wingdings; mso-fareast-font-family: Wingdings; mso-bidi-font-family: Wingdings; color: black; mso-themecolor: text1;"><span style="mso-list: Ignore;">Ÿ<span style="font: 7.0pt 'Times New Roman';">  </span></span></span><!--[endif]--><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;">代码解析篇中使用<span lang="EN-US">PyCharm</span>单步调试对<span lang="EN-US">DeepSORT</span>的代码逐个文件进行讲解。课程提供注释后的代码。</span></p> <p style="text-indent: -21.0pt; mso-list: l0 level1 lfo1; background: white; margin: 0cm 0cm 0cm 21.0pt;"><span style="font-size: 10.5pt; font-family: '微软雅黑',sans-serif; mso-bidi-font-family: Arial; color: black; mso-themecolor: text1;"><img src="https://img-bss.csdnimg.cn/202105101512471836.jpg" alt="课程内容" /></span></p> <p><img src="https://img-bss.csdnimg.cn/202105101513384587.jpg" alt="行人多目标跟踪" /></p> <p><img src="https://img-bss.csdnimg.cn/202105101514053124.jpg" alt="车辆计数" /></p>
©️2021 CSDN 皮肤主题: 书香水墨 设计师:CSDN官方博客 返回首页

打赏作者

vcjmhg

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值