多目标跟踪入门:从SORT到FairMOT

2023-05-16

点击下方卡片,关注“自动驾驶与AI”公众号

ADAS巨卷干货,即可获取

点击进入→自动驾驶之心【目标跟踪】技术交流群

后台回复【目标跟踪综述】获取单目标、多目标、基于学习方法的领域综述!

目标跟踪分为单目标跟踪(SOT)和多目标跟踪(MOT)。SOT一般在首帧给出目标,跟踪器(tracker)需要在后续帧定位出目标位置,可以看成目标重定位问题。MOT一般需要检测器(detector)先检测出目标,跟踪器对属于同一目标的框进行关联,可以看作目标匹配问题。下文重点介绍MOT算法。

MOT算法的通常工作流程:(1)给定视频的原始帧;(2)运行对象检测器以获得对象的边界框;(3)对于每个检测到的物体,计算出不同的特征,通常是视觉和运动特征;(4)之后,相似度计算步骤计算两个对象属于同一目标的概率;(5)最后,关联步骤为每个对象分配数字ID。

多目标跟踪的核心步骤:

aed03984e0eec09cfd3903e0cc86e976.png

由此可见多目标跟踪的核心在于检测,检测不到目标就无法进行跟踪,技术难点在于检测到目标后如何区分不同的目标,也就是目标跟特征提取和相似度计算。

多目标跟踪的评价指标:

  • 对于多目标跟踪,最主要的评价指标就是MOTA。这个指标综合了三点因素:FP、FN、IDsw.。FP即False Postive,为误检测的目标数量;FN即False Negetive,为未检出的真实目标数量;IDsw.即同一目标发生ID切换的次数。

  • 多目标跟踪还有很多的评价指标,比如MOTP、IDF1、MT、ML、Frag等。作为入门,读者最需要关注的就是MOTA,其他指标可以等对MOT有了进一步了解后再关注。

  • IDF1:识别F值(Identification F-Score)是指每个行人框中行人ID识别的F 值。公式为:

一般来说IDF1是用来评价跟踪器好坏的第一默认指标,如果要给跟踪器性能排个序,一般会选择IDF1这个指标作为默认的初始排序指标。这三个指标可以根据任意其中两个推断出第三个的值,因此也可以只展示其中两个,当然最好这两个包含IDF1。

当然还有其余的评价指标,在这儿不再过多描述。

多目标跟踪的数据集:

87944aa9a57603060f011719d80683e4.png

多目标跟踪框架

现有多目标跟踪框架都是基于SORT和DEEP SORT演变而来。

0949ec3c7fc4f0a81e212c5771c3d173.png

从这两个工业界关注度最高的算法说起。

SORT作为一个粗略的框架,核心就是两个算法:卡尔曼滤波和匈牙利匹配。

卡尔曼滤波可以基于目标前一时刻的位置,来预测当前时刻的位置,并且可以比传感器(在目标跟踪中即目标检测器,比如Yolo等)更准确的估计目标的位置。卡尔曼滤波分为两个过程:预测和更新。

卡尔曼滤波:https://zhuanlan.zhihu.com/p/39912633

匈牙利算法解决的是一个分配问题。SK-learn库的linear_assignment_和scipy库的linear_sum_assignment都实现了这一算法,只需要输入cost_matrix即代价矩阵就能得到最优匹配。不过要注意的是这两个库函数虽然算法一样,但给的输出格式不同。具体算法步骤也很简单,是一个复杂度的算法。

匈牙利匹配:https://zhuanlan.zhihu.com/p/62981901

DeepSORT的优化主要就是基于匈牙利算法里的这个代价矩阵。它在IOU Match之前做了一次额外的级联匹配,利用了外观特征和马氏距离。

外观特征就是通过一个Re-ID的网络提取的,类似于人脸识别网络中的特征值。然后是因为欧氏距离忽略空间域分布的计算结果,所以增加里马氏距离作为运动信息的约束。

目前主流算法:

6b0acf07981488ea75fe2745669974d0.png

SDE系列算法

这意味着系统至少需要两个计算密集型组件:一个检测器和一个嵌入模型(ReID)。为了方便起见,我们将这些方法称为分离检测和嵌入方法(SDE)。因此,总的推断时间大致是两个部分的总和,并将随着目标数量的增加而增加。SDE方法的特点给实时MOT系统的构建带来了严峻的挑战,这是实践的必然要求。deepsort就是SDE系列算法的代表,很显然这样的操作方式整个系统算法耗时较长,因此,通过“特征共享”降低算法耗时,进行项目落地成为一个比较好的思路。

特征共享的系列算法

  • 两阶段特征共享算法

联合检测器和嵌入学习的一种选择是采用FasterR-CNN框架(Ren et al.2015),这是一种两级检测器:

  • 第一个阶段,区域优先网络(RPN),与FasterR-CNN保持相同,并输出检测到的边界框。

  • 第二阶段,FastR-CNN(Girshick 2015)通过用度量学习监督取代分类监督来转化为嵌入学习模型(Xiao et al.2017;Voigtlaender et al.2019)。

  • 两阶段共享算法Track R-CNN 就是对 Mask R-CNN 进行扩展,使用 roi-pool 从共享的特征图中获取候选框所对应的图像特征,并通过一个轻量的网络针对每一个候选框同时进行:1)检测框回归与分类;2)前景 mask回归;3)Re-ID 特征回归。

  • 一阶段特征共享算法 JDE

e6086874fbc5e1cc465f0ba25a975cc4.png

算法流程图:

fd1a2b50fcb006873d4fc2276ccf1557.png

JDE 算法存在的问题

  • 它效仿 "one-stage" 物体检测器的思路,去掉了 roi-pool 层,但它依然保留了 anchor 的概念,因此也就依然存在多个(不完美匹配的)anchor 对应一个物体的情况。

  • 一个更严重的问题是同一个 anchor(相似的图像区域)可能会对应不同的人,假如一张图像中有两个相邻的人,并且存在一个 anchor 和这两个物体的交集都很大,在前后两个不同的时刻,因为人或相机微小的运动,可能导致该 anchor 需要输出截然不同的身份标识,从而在很大程度上增加了网络学习的难度。

  • 在MOT中ReID特征的维数不宜过高,因为MOT的数据集一般来说都比较小。结合这三点看上去很直接的改进,作者便在各个数据集中取得了很大的效果提升。

FairMOT

论文改进思路:

  • 我们以 CenterNet 为基础,加入 Re-ID 分支,提出了 FairMOT 方法,使其能够同时进行物体检测和跟踪,下图展示了方法的框图。

  • 简单来讲,FairMOT 会对每一个像素进行预测,预测其是否是物体的中心、物体的大小和以其为中心的图像区域的 Re-ID 特征。

  • 检测和跟踪两个任务都是以“当前像素”为中心,所以不存在对齐的问题,也不存在严重的顾此失彼的不公平问题,这也是称这个方法为 FairMOT 的原因。

77c349defb052a7abff0e889fed739f3.png

1.主干网络

采用ResNet-34 作为主干网络,以便在准确性和速度之间取得良好的平衡。为了适应不同规模的对象,如图2所示,将深层聚合(DLA)的一种变体应用于主干网

与原始DLA 不同,它在低层聚合和低层聚合之间具有更多的跳跃连接,类似于特征金字塔网络(FPN)。此外,上采样模块中的所有卷积层都由可变形的卷积层代替,以便它们可以根据对象的尺寸和姿势动态调整感受野。这些修改也有助于减轻对齐问题。

2.物体检测分支

本方法中将目标检测视为高分辨率特征图上基于中心的包围盒回归任务。特别是,将三个并行回归头(regression heads)附加到主干网络以分别估计热图,对象中心偏移和边界框大小。通过对主干网络的输出特征图应用3×3卷积(具有256个通道)来实现每个回归头(head),然后通过1×1卷积层生成最终目标。

Heatmap Head

这个head负责估计对象中心的位置。这里采用基于热图的表示法,热图的尺寸为1×H×W。随着热图中位置和对象中心之间的距离,响应呈指数衰减。

Center Offset Head

该head负责更精确地定位对象。ReID功能与对象中心的对齐精准度对于性能至关重要。

Box Size Head

该部分负责估计每个锚点位置的目标边界框的高度和宽度,与Re-ID功能没有直接关系,但是定位精度将影响对象检测性能的评估。

3.id嵌入分支 Identity Embedding Branch

id嵌入分支的目标是生成可以区分不同对象的特征。理想情况下,不同对象之间的距离应大于同一对象之间的距离。为了实现该目标,本方法在主干特征之上应用了具有128个内核的卷积层,以提取每个位置的身份嵌入特征。

损失函数

cc44ae4d9f15a09cb67ccb8220fe0dc0.png

实验

anchor free 和 anchor based 对于多目标跟踪算法的影响,从下面的实验可以看出在不同大小的采样下anchor free的效果要比anchor based好很多。

2e582dcaa9403f199d08027414246b7f.png

Reid特征的选择:可以看出特征维度为128时效果最佳。

1ce32dd4c3bbcb906aa73476f2574459.png

与JDE多目标跟踪算法对比:

2bdc396362c198b1cefb362c10c1a849.png

与其他两阶段的算法相比:

f8281736719a2cd25b31bb169ad7a4b5.png

视频课程来了!

自动驾驶之心为大家汇集了毫米波雷达视觉融合、高精地图、BEV感知、传感器标定、自动驾驶协同感知、语义分割、自动驾驶仿真、L4感知等多个方向学习视频,欢迎大家自取(扫码进入学习)

cc53b355de2ee259eaeb97c8e8714331.png

(扫码学习最新视频)

国内首个自动驾驶学习社区

近1000人的交流社区,和20+自动驾驶技术栈学习路线,想要了解更多自动驾驶感知(分类、检测、分割、关键点、车道线、3D目标检测、Occpuancy、多传感器融合、目标跟踪、光流估计、轨迹预测)、自动驾驶定位建图(SLAM、高精地图)、自动驾驶规划控制、领域技术方案、AI模型部署落地实战、行业动态、岗位发布,欢迎扫描下方二维码,加入自动驾驶之心知识星球,这是一个真正有干货的地方,与领域大佬交流入门、学习、工作、跳槽上的各类难题,日常分享论文+代码+视频,期待交流!

572bb9a442ea8f01414862fbb5e15190.jpeg

自动驾驶之心】全栈技术交流群

自动驾驶之心是首个自动驾驶开发者社区,聚焦目标检测、语义分割、全景分割、实例分割、关键点检测、车道线、目标跟踪、3D目标检测、BEV感知、多传感器融合、SLAM、光流估计、深度估计、轨迹预测、高精地图、NeRF、规划控制、模型部署落地、自动驾驶仿真测试、产品经理、硬件配置、AI求职交流等方向;

799e0589c63176ef622d2feedf4995f3.jpeg

添加汽车人助理微信邀请入群

备注:学校/公司+方向+昵称

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

多目标跟踪入门:从SORT到FairMOT 的相关文章

  • 基于STM32F4实现串口通信(usart)

    文章目录 前言一 串口的基本介绍1 简介2 串口协议 二 1 配置步骤2 完整代码 前言 串口通信是一种设备间常用的串行通信方式 xff0c 因为它简单便捷 xff0c 大部分设备支持该通信方式 今天使用一个ttl转usb模块连接usart
  • KEIL添加新的.C文件

    KEIL添加新的 C文件 问题描述 之前在网上看了很多方法添加 C文件 xff0c 结果经常报重复定义的错误 xff0c 记录一下自己的方法吧 解决方案 xff1a 右键 add exiting 点击魔法棒 34 C C 43 43 inc
  • 汇总:使用keil5所遇见的一些常见问题以及解决方法

    一 新建keil5工程时出现这个警告 解决方法 xff1a 右键单击Keil STM32F1xx DFP pdsc xff0c 然后点开属性界面 xff0c 由于Keil STM32F1xx DFP pdsc文件是只读文件 xff0c 将只
  • 自定义串口协议

    文章目录 前言一 有限状态机有限状态机代码接收数据缓冲缓冲要求循环队列 一 循环队列代码实现循环队列头文件 xff1a 源文件 xff1a 二 有限状态机与解码有限状态机核心实现代码有限状态机与解码头文件源文件 三 使用小例子总结 前言 此
  • stm32f1串口发送与接收

    目录 串口配置 串口发送 1使用SendString函数发送 2使用printf函数发送 串口接收 串口配置 首先对串口进行初始化 包括使能串口时钟 xff0c 这里我使用的是usart2 xff0c 使能GPIO时钟 xff0c 这里我用
  • 串口通讯详解

    这篇文章包含了串口通讯里面的大部分概念问题 目录 串口通讯线 同步串行 xff08 ISP xff09 异步串行 xff08 UART xff09 波特率 数据帧 串口通讯线 串口通信线最少需要2根 xff08 GND和信号线 xff09
  • 包罗万象!V3Det:1.3W类全新目标检测数据集(港中文&上海AI Lab)

    作者 CV君 编辑 我爱计算机视觉 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 目标检测 技术交流群 后台回复 2D检测综述 获取鱼眼检测 实时检测 通用2D检测等近
  • stm32f4串口接收与发送

    之前有写一篇stm32f1串口接收与发送的文章 xff0c stm32f4与f1只有配置上的一点不同 xff0c 今天把f4的串口接收与发送代码分享一下 详细解释推荐大家看f1那篇 xff0c 都是一样的 xff0c stm32f1串口发送
  • -> 在c语言中是什么意思?

    gt 是一个整体 xff0c 它是用于指向结构体子数据的指针 xff0c 用来取子数据 换种说法 xff0c 如果我们在C语言中定义了一个结构体 xff0c 然后申明一个指针指向这个结构体 xff0c 那么我们要用指针取出结构体中的数据 x
  • C++中 i<<=1是什么意思

    左移赋值运算 变量i 左移1位 xff0c 结果仍然保存到变量i 举个栗子 xff1a i 61 101001 执行 xff1a i span class token operator lt lt 61 span span class to
  • 详解KITTI数据集

    详解KITTI数据集 一 KITTI数据集发布方 2011年 xff0c Andreas Geiger xff08 KIT xff09 Philip Lenz xff08 KIT xff09 Raquel Urtasun xff08 TTI
  • OpenCV各版本差异

    Opencv2标志着opencv革命性的改变 xff0c Opencv2带来了全新的C 43 43 接口 xff0c 将Opencv的能力无限放大 在2 0时代 xff0c opencv增加了新的平台支持 xff0c 包括iOS和Andro
  • realsense D435 D435i D415深度相机在ros下获得RGB图、左右红外摄像图、深度图、IMU数据

    首先你要你确保你的相机驱动已经安装好 xff0c 环境配置可以看我的另一篇文章 xff1a https blog csdn net weixin 46195203 article details 119205851 第一步 xff1a 新建
  • LaTex学习之算法如何写以及常用语句IF、FOR、WHILE

    首先是在头文件中加上 usepackage span class token punctuation span algorithm span class token punctuation span algorithmic span cla
  • latex报错:Missing delimiter (. inserted). ... {\xi \left( {p,{p_q}} \right)} \right|}}

    理想中的公式 xff0c begin span class token punctuation span equation span class token punctuation span span class token punctua
  • sort函数第三个参数cmp必须声明为static

    span class token keyword bool span span class token keyword static span span class token function comp span span class t
  • linux下Tinyhttpd安装运行

    tinyhttpd 超轻量型 Http Server tinyhttpd 全部代码在500 行左右 xff0c 是一个超轻量型 Http Server xff0c 这是是学习C C 43 43 入门非常棒的一个开源项目 xff0c 可以帮助
  • CVPR 2023|DropKey:两行代码高效缓解ViT过拟合(美图&国科大)

    编辑 CV技术指南 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 全栈算法 技术交流群 前言 美图影像研究院 xff08 MT Lab xff09 与中国科学院大学突破
  • C++并发与多线程学习笔记--线程启动、结束,创建线程多法

    一 范例演示线程运行的开始 程序运行起来 xff0c 生成一个进程 xff0c 该进程所属的主线程开始自动运行 xff1b 当主线程从main xff08 xff09 函数返回 xff0c 则整个进程执行完毕 主线程从main xff08
  • 顶层const和底层const

    概念解释 表示声明常量的const都是顶层const 用于声明引用的const都是底层const 顶层const是 xff1a 指针本身是常量 底层const是 xff1a 指针所指的对象是常量 即是顶层const又是底层const xff

随机推荐

  • c++中从出年月日的字符串提取整形int

    在C 43 43 中字符串有两种 xff0c 不过提取方式类似 xff0c 具体如下 xff1a 一 以 0 结束的字符数组 对于以 0 结束的字符数组 xff0c 可以有如下两种方式 xff1a 1 通过自定义函数提取 由于格式固定 xf
  • STM32与4脚光敏电阻的简单使用——初学

    这是我第一次写CSDN xff0c 排版可能有许多问题 xff0c 描述的可能也有不清楚的地方 xff0c 有问题的小伙伴可以私聊我 xff0c 一起学习共同进步 今天发现了一个很有意思的传感器 光敏传感器 xff0c 它可以判断光线的亮暗
  • STM32与人体红外感应模块的简单使用——入门级

    工作原理 人体有恒定的温度 xff0c 可以发出10UM的红外波 xff0c 而人体红外感应模块就可以探测出这些红外波 xff0c 从而产生电平转换 由此人们可以使用人体红外检测模块来检测是否有人 模块工作环境 工作电压 xff1a 5V至
  • 光敏,红外,人体红外检测模块的模拟输出(ADC)实验——入门

    前面给大家介绍了传感器的开关输出的使用 xff0c 今天给大家介绍一下常见传感器的模拟输出的用法 xff0c 用到了STM32的ADC xff08 模数转换 xff09 模块和USART串口通信模块 代码就是正点原子的ADC实验的代码 今天
  • 直流电机+L298N电机驱动模块

    本次来写一下关于驱动直流电机的知识 xff0c 今天目的是驱动它 xff0c 下次写使用PWM精准的对直流电机进行控速 下面是我使用的直流电机图 xff1a 由于STM32单片机不能直接的输出较大电压和电流 xff0c 所以得借助驱动模块来
  • 操作系统的内存管理——页式、段式管理、段页式管理

    操作系统的内存管理中段式管理与页式管理并不是对立的 xff0c 他们结合起来内存的使用效率会更高 他们都属于离散分配内存的管理方式 xff0c 当然还有连续型内存分配的管理方式 xff0c 连续分配是指为一个用户程序分配连续的内存空间 连续
  • linux内存机制原理---分页、分段底层原理

    自我总结 xff1a 分段 43 分页 43 虚拟内存 61 现代操作系统的内存管理机制 一 linux的内存分布 内核与高速缓冲区占用了前1MB内存 xff0c 后面15MB属于主存 xff0c 可以由用户自由分配 四种地址 xff1a
  • linux进程的内存与ELF文件

    一 linux为每个进程分配的虚拟内存 提到进程的内存就是虚拟内存 1G的内核区域 3G的用户区域 xff0c 提到进程的内存就是下面这个图 xff0c 都可以用它进行分析 虚拟内存是为了实现多任务 xff0c 所以操作系统才引入了它 二
  • YOLO终结者?RT-DETR一探究竟!

    作者 迪迦奥特曼 编辑 极市平台 点击下方卡片 xff0c 关注 自动驾驶之心 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 目标检测 技术交流群 导读 实时目标检测中击败YOLO家族 xff1f 来看看百度飞桨的
  • C语言中的位段操作—嵌入式学习(实习篇)

    记录实习期间学到的新的知识 malloc申请内存 xff1a 当申请小内存的时 xff0c malloc使用sbrk分配内存 xff1b 当申请大内存时 xff0c 使用mmap函数申请内存 xff1b 但是这只是分配了虚拟内存 xff0c
  • 运行excel时报错“由于找不到vcruntime140_1.dll,无法继续执行代码”--已解决

    问题描述 xff1a 清除文件时误删microsoft visual c 43 43 2015 microsoft visual c 43 43 2018等文件 xff0c 导致运行excel时报错 由于找不到vcruntime140 1
  • Jetson TX2新手上路全记录(2)

    xff08 2 xff09 查看ubuntub版本 cat proc version 判断ubuntu网络是否连通 xff1a ping www baidu com 数据刷新无异常即连通 破防了 xff0c 前天刷机看来没成功 原因 xff
  • TX2查看cudnn版本 `cat /usr/include/cudnn.h | grep CUDNN_MAJOR -A 2无反应

    之前cat usr include cudnn h grep CUDNN MAJOR A 2命令可以查看cudnn版本 xff0c 但是之后新版本的版本信息放在了cudnn version h xff0c 我的环境为ubuntu18 04
  • yolo实现交通信号灯视频流识别代码搬运及调试

    yolo实现交通信号灯视频流识别调试过程 所用代码 xff1a 基于YOLOv3的红绿灯检测识别 xff08 Python源码可直接运行 xff09 原作者是tensorflow1 xff0c 我的环境是tensorflow2 xff0c
  • TX2通过yolov4实现交通信号灯视频检测

    所用代码以后上传 环境部署 Jetson TX2刷机及安装的软件包版本如下 xff1a 整个过程中遇到最多的就是不同tf keras版本之间导致的问题 xff0c 所以部署环境的时候千万注意各种包的依赖关系 xff0c 我因为兼容性问题走了
  • TX2 查看内存使用情况

    TX2 查看内存使用情况 不知道为什么无法使用sudo xff5e tegrastats xff0c 报错 command not found 参考NVIDIA TX2 目标检测 查看显卡使用状况 jtop jtop使用指南 NVIDIA
  • Modelsim解决中文注释乱码

    Modelsim中文注释出现乱码 xff0c 解决过程如下 1 菜单栏 Tools Preferences xff0c 点击By name 2 找到source选项 xff0c 下拉选项中双击encoding 3 弹出的对话框中将encod
  • 【资料分享】IMAX-B6AC充电器使用方法

    因为说明书都是英文的嘛 xff0c 所以 xff0c 还是写个充电方法吧 刚打开的时候 xff0c 界面应该是这个样子的 如果很不幸 xff0c 你的不是 xff0c 那么 xff0c 多按几次Stop键 xff0c 直到它是这个界面 菜单
  • GPIO简介

    1 什么是GPIO xff1f GPIO是General Purpose Input Output xff0c 即通用输入输出端口 xff0c 简称GPIO 作用 xff1a 负责采集外部器件的信息或者控制外部器件工作 xff0c 即输入输
  • 多目标跟踪入门:从SORT到FairMOT

    点击下方卡片 xff0c 关注 自动驾驶与AI 公众号 ADAS巨卷干货 xff0c 即可获取 点击进入 自动驾驶之心 目标跟踪 技术交流群 后台回复 目标跟踪综述 获取单目标 多目标 基于学习方法的领域综述 xff01 目标跟踪分为单目标