智慧交通day02-车流量检测实现09:SORT/deepSORT

SORT和DeepSORT是多目标跟踪中两个知名度比较高的算法。DeepSORT是原团队对SORT的改进版本。现在来解析一下SORT和DeepSORT的基本思路。

1.SORT

SORT核心是卡尔曼滤波匈牙利匹配两个算法。流程图如下所示,可以看到整体可以拆分为两个部分,分别是匹配过程卡尔曼预测加更新过程,都用灰色框标出来了。

关键步骤:轨迹卡尔曼滤波预测→ 使用匈牙利算法将预测后的tracks和当前帧中的detecions进行匹配(IOU匹配) → 卡尔曼滤波更新

卡尔曼滤波分为两个过程:预测更新。SORT引入了线性速度模型与卡尔曼滤波来进行位置预测,先进行位置预测然后再进行匹配。运动模型的结果可以用来预测物体的位置。

匈牙利算法解决的是一个分配问题,用IOU距离作为权重(也叫cost矩阵),并且当IOU小于一定数值时,不认为是同一个目标,理论基础是视频中两帧之间物体移动不会过多。在代码中选取的阈值是0.3。scipy库的linear_sum_assignment都实现了这一算法,只需要输入cost_matrix即代价矩阵就能得到最优匹配。

2.DeepSort

DeepSORT是SORT的续作,整体框架没有大改,还是延续了卡尔曼滤波加匈牙利算法的思路,在这个基础上增加了鉴别网络Deep Association Metric

下图是deepSORT流程图,和SORT基本一样,就多了级联匹配(Matching Cascade)和新轨迹的确认(confirmed)。

关键步骤:轨迹卡尔曼滤波预测→ 使用匈牙利算法将预测后的tracks和当前帧中的detecions进行匹配(级联匹配IOU匹配) → 卡尔曼滤波更新

级联匹配流程图如下所示:

其中上半部分就是相似度估计,也就是算这个分配问题的代价函数。下半部分依旧使用匈牙利算法进行检测框和跟踪框的匹配。


总结:

1.SORT算法

SORT是利用强大的CNN检测器的检测结果来进行多目标跟踪使用基于卡尔曼滤波(Kalman filter)与匈牙利算法(Hungarian algorithm)的方法来进行跟踪。

2.deepSORT算法

DeepSORT是在SORT基础上进行的修改,增加了级联匹配和目标的确认,还是使用卡尔曼滤波加匈牙利算法进行目标跟踪。


1.SORT核心是卡尔曼滤波和匈牙利算法。流程图如下所示,可以看到整体可以拆分为两个部分,分别是匈牙利匹配过程和卡尔曼预测加更新过程,都用灰色框标出来了。关键步骤:--> 卡尔曼滤波预测出预测框--> 使用匈牙利算法将卡尔曼滤波的预测框和yolo的检测框进行IOU匹配来计算相似度 --> 卡尔曼滤波使用yolo的检测框更新卡尔曼滤波的预测框2.卡尔曼滤波分为两个过程:预测过程和更新过程。SORT引入了线性速度模型与卡尔曼滤波来进行位置预测,先进行位置预测然后再进行匹配。运动模型的结果可以用来预测物体的位置。匈牙利算法解决的是一个分配问题,用IOU距离作为权重(也即cost代价矩阵),并且当IOU小于一定数值(IOU阈值)时,不认为是同一个目标,理论基础是视频中两帧之间物体移动不会过多。在代码中选取的IOU阈值是0.3。scipy库的linear_sum_assignment实现了匈牙利算法,只需要输入cost_matrix代价矩阵(全部预测框和全部检测框两两IOU计算结果)到linear_sum_assignment中就能得到预测框和检测框两两最优匹配的组合。

 

1.跟踪器链(列表):实际就是多个的卡尔曼滤波KalmanBoxTracker自定义类的实例对象组成的列表。每个目标框都有对应的一个卡尔曼滤波器(KalmanBoxTracker实例对象),KalmanBoxTracker类中的实例属性专门负责记录其对应的一个目标框中各种统计参数,并且使用类属性负责记录卡尔曼滤波器的创建个数,增加一个目标框就增加一个卡尔曼滤波器(KalmanBoxTracker实例对象)。把每个卡尔曼滤波器(KalmanBoxTracker实例对象)都存储到跟踪器链(列表)中。2.unmatched_detections(列表):检测框中出现新目标,但此时预测框(跟踪框)中仍不不存在该目标,那么就需要在创建新目标对应的预测框/跟踪框(KalmanBoxTracker类的实例对象),然后把新目标对应的KalmanBoxTracker类的实例对象放到跟踪器链(列表)中。3.unmatched_trackers(列表):当跟踪目标失败或目标离开了画面时,也即目标从检测框中消失了,就应把目标对应的跟踪框(预测框)从跟踪器链中删除。unmatched_trackers列表中保存的正是跟踪失败即离开画面的目标,但该目标对应的预测框/跟踪框(KalmanBoxTracker类的实例对象)此时仍然存在于跟踪器链(列表)中,因此就需要把该目标对应的预测框/跟踪框(KalmanBoxTracker类的实例对象)从跟踪器链(列表)中删除出去。

DeepSORT是SORT的续作,整体框架没有大改,还是延续了卡尔曼滤波加匈牙利算法的思路,并且在这个基础上增加了鉴别网络Deep Association Metric。
下图是deepSORT流程图,和SORT基本一样,就多了级联匹配(Matching Cascade)和新轨迹的确认(confirmed)。

关键步骤:--> 卡尔曼滤波预测出预测框--> 使用匈牙利算法将卡尔曼滤波的预测框和yolo的检测框进行级联匹配加IOU匹配两者分别来计算相似度 --> 卡尔曼滤波使用yolo的检测框更新卡尔曼滤波的预测框级联匹配计算相似度的流程图如下所示:上半部分为相似度估计,也就是计算这个分配问题的代价矩阵。下半部分依旧是使用匈牙利算法进行检测框和预测框的匹配。

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

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

相关文章

素数环 与 算法 全排列

在说起全排列前,先说一下昨天碰到的一个题目(答案不是我做出来的,但是我感觉有好多个亮点,贴出来方便日后的学习): 素数环 时间限制:1000 ms | 内存限制:65535 KB难度:…

简单线性回归(Simple Linear Regression)和多元线性回归(Multiple Regression)学习笔记

简单线性回归(Simple Linear Regression) 0.前提介绍: 为什么需要统计量? 统计量:描述数据特征 0.1集中趋势衡量 0.1.1均值(平均数,平均值) (mean):(求和除以个数,Ex也可以表示x求均值) 0.1.2中位数(median) : 将数…

智慧交通day02-车流量检测实现10:多目标追踪实现

在这里我们主要实现了一个多目标跟踪器,管理多个卡尔曼滤波器对象,主要包括以下内容: 初始化:最大检测数,目标未被检测的最大帧数 目标跟踪结果的更新,即跟踪成功和失败的目标的更新 初始化 def __init_…

智慧交通day02-车流量检测实现11:yoloV3模型

yoloV3以V1,V2为基础进行的改进,主要有:利用多尺度特征进行目标检测;先验框更丰富;调整了网络结构;对象分类使用logistic代替了softmax,更适用于多标签分类任务。 1.算法简介 YOLOv3是YOLO (You Only Loo…

bzoj1992鬼谷子的钱袋(二分乱搞 二进制)

1192: [HNOI2006]鬼谷子的钱袋 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 3223 Solved: 2333Descriptio 鬼谷子非常聪明,正因为这样,他非常繁忙,经常有各诸侯车的特派员前来向他咨询时政。有一天,他在咸阳游历的时候&…

聚类(Clustering): K-means算法

聚类(Clustering): K-means算法 1.归类: 聚类(clustering)属于非监督学习(unsupervised learning) 无类别标记( class label) 3. K-means 算法: 3.1 Clustering 中的经典算法,数据挖掘十大经典算法之一 3.2 算法接受参数 k ;然后将事先输入…

智慧交通day02-车流量检测实现12:基于yoloV3的目标检测

在本章节代码编写中,发现之前的代码所处的环境是python3,因此导致了cv2.dnn.readNetFromDarknet()在代码运行中导致了i[0]的获值失败,故总结如下: cv2.dnn.readNetFromDarknet()在python3上遇到的问题_李大狗的读研日记-CSDN博客…

cv2.dnn.readNetFromDarknet()在python3上遇到的问题

问题描述: 代码如下 net cv2.dnn.readNetFromDarknet(configPath,weightsPath) #获取YOLO每一层的名称 #getLayerNames():获取网络所有层的名称。 ln net.getLayerNames() # 获取输出层的名称: [yolo-82,yolo-94,yolo-106] # …

智慧交通day02-车流量检测实现13:基于虚拟线圈法的车辆统计+视频中的车流量统计原理解析

1.基于虚拟线圈法的车辆统计 基于虚拟线圈的车流量统计算法原理与交通道路上的常见的传统的物理线圈类似,由于物理线圈需要埋设在路面之下,因此会有安装、维护费用高,造成路面破坏等问题,而采用基于视频的虚拟线圈的车辆计数方法…

ubuntu 12.04 eclipse 安装

方法二:(优点是安装内容清爽,缺点是配置麻烦) 1、安装JDK,参考 Ubuntu 12.04 下安装 JDK 7 2、下载 Eclipse 从 http://www.eclipse.org/downloads/index-developer.php下载合适版本,如:Eclipse IDE for C/C Develope…

智慧交通day02-车流量检测实现14:代码汇总+问题修正

代码权重文件资源https://download.csdn.net/download/qq_39237205/43072746https://download.csdn.net/download/qq_39237205/43072746 环境要求:python2.7 环境配置:见文末requirements.txt 1.YOLO.py # encoding:utf-8 import imutils import tim…

从资源池和管理的角度理解物理内存

早就想搞一下内存问题了!这次正趁着搞bigmemory内核,可以写一篇文章了。本文旨在记录,不包含细节,细节的话,google,百度均可,很多人已经写了不少了。我只是按照自己的理解记录一下内存的点点滴滴…

从头开始学一个android activity

一、类层次结构: 二、什么是Activity,如何理解Activity 1、 用户与应用程序的交互的接口 2、 控件的容器,我们要把控件摆放在这个容器中 三、如何创建一个Activity 新建一个类: 1、 继承Activity类 [java] view plaincopyprint…

python3 numpy中矩阵np.dot(a,b)乘法运算

python np.dot(a,b)乘法运算 首先我们知道矩阵运算是不满足交换律的,np.dot(a, b)与np.dot(b, a)是不一样的 另外np.dot(a,b)和a.dot(b)果是一样的 1.numpy中数组(矩阵)相乘np.dot(a,b)运算: 对于两数组a和b : 示例…

ML Backpropagation算法的计算过程举例

Backpropagation计算过程举例 初始权重(initialize weights)是随机产生的(如-1~1之间) 初始化可以选择均值为0,方差为1/n_in的正态分布,n_in为输入的实例个数,Python中可使用np.random.normal函数来初始化权重: np.random.normal…

Python基础知识__字符串

字符串介绍 一. 认识字符串 字符串是 Python 中最常用的数据类型。我们一般使用引号来创建字符串。创建字符串很简单&#xff0c;只要为变量分配一个值即可。 a hello world b "abcdefg" print(type(a)) print(type(b)) 注意&#xff1a;控制台显示结果为<cl…

智慧交通day03-车道线检测实现01:车道线检测概述

项目简介 汽车的日益普及在给人们带来极大便利的同时&#xff0c;也导致了拥堵的交通路况&#xff0c;以及更为频发的交通事故。而自动驾驶技术的出现可以有效的缓解了此类问题&#xff0c;减少交通事故&#xff0c;提升出行效率。 国内外检测车道线的方法主要有两类&#xf…

vsphere平台windows虚拟机克隆的小插曲(无法登陆系统)

问题&#xff1a; 1、克隆完windows虚拟化后输入法乱码。 2、开启远程的情况下远程登录输入正确的密码也无法登录。 解决&#xff1a; 1、更改管理员用户密码&#xff08;不输入原win7密码更改win7密码&#xff09;。 2、重新启用管理员。 3、重启系统 不输入当前密码改win密码…

智慧交通day03-车道线检测实现02-1:相机校正

1. 相机标定的意义 我们所处的世界是三维的&#xff0c;而照片是二维的&#xff0c;我们可以把相机认为是一个函数&#xff0c;输入量是一个场景&#xff0c;输出量是一幅灰度图。这个从三维到二维的过程的函数是不可逆的。 相机标定的一个目的是要找一个合适的数学模型&#…

把输入字符的小写转换成大写并输出

#include <stdio.h> #include <stdlib.h> #include <string.h> /******************************* *把小写字母转成大写字母 ********************************/ int main(void) { char *srcNULL;unsigned char i0;char *new_1NULL;char *new_2NULL;char *dN…