DeepSort与Sort

先把两者区别写出来:

  1. Sort 算法利用卡尔曼滤波算法预测检测框在下一帧的状态,将该状态与下一帧的检测结果进行匹配,实现车辆的追踪。
  2. DeepSort中采用了一个简单的CNN来提取被检测物体(检测框物体中)的外观特征(低维向量表示),在每帧检测+追踪后,进行一次物体外观特征的提取并保存。

Sort的问题:
匹配的时候用的是匈牙利算法,但是当物体遮挡之后,前后帧的物体失去关联,物体重新出现后,会切换id。

在实时视频流中,不可能保留全局视频帧中的检测框数据,因此想要解决ID频繁切换的问题,需要利用之前保存的外观特征,分配该物体受遮挡前的ID编号,从而解决ID切换的问题。
在实际效果中:低FPS(3-5)的场景下可能会跟丢,但是FPS超过8之后,效果会好很多,两者重叠后也会继续追踪,大家可以用yolov5+deepsort试试,买个萤石(简单场景可以使用,但是要关闭内置的一些算法,会影响推流速度)或者使用ffmpeg循环推送视频流来观察效果。
论文中提到,检测质量对跟踪性能有很大的影响。

如下图是SORT作者使用的追踪器,发现当FrRCNN(VGG16)作为最佳检测器,在ID的切换数量和 Multi-object tracking accuracy(MOTA)多目标追踪精度上都有较好的表现。
我们在实验时使用yolov5-l 结合deep-sort,发现表现很好,正常情况下不会出现丢失的情况。

外观特征的提取器:

这个网络最后输出的是一个128维的向量,值得关注的是,由于DeepSORT主要被用来做行人追踪的,那么输入的大小为128(高)x 64(宽)的矩形框。如果你需要做其他物体追踪,可能要把网络模型的输入进行修改。

卡尔曼滤波

SORT中的卡尔曼滤波算法使用的状态是一个7维的向量

x=[u,v,s,r,u˙,v˙,s˙]Tx = [u,v,s,r,\dot{u},\dot{v},\dot{s}]^Tx=[u,v,s,r,u˙,v˙,s˙]T

其中

  • uuu和vvv代表目标物体框中心的水平和垂直坐标
  • sss和rrr代表了目标物体框的面积和长宽比(注意长宽比应该为一个常量)
  • u˙,v˙,s˙\dot{u} ,\dot{v},\dot{s}u˙,v˙,s˙ 则代表了预测的下一帧情况,rrr默认不变。

当检测框与目标关联上之后,这个检测框会用于更新目标状态。通过卡尔曼滤波,会实时更新速度分量,保证目标的最新状态。
若没有关联上目标(未检测或被遮挡),则使用线性速度模型简单的预测状态,但不会进行校正。

上述是SORT中的应用,但在DeepSORT中,添加了一个新的变量,变成了
(u,v,γ,h,u˙,v˙,γ˙,h˙)(u,v,\gamma,h,\dot{u},\dot{v},\dot{\gamma},\dot{h})(u,v,γ,h,u˙,v˙,γ˙​,h˙)
多了一个长宽比(aspect ratio)的变化率,分别表示bounding box中心的位置纵横比高度以及在图像坐标中对应的速度信息。因为SORT中假设检测框的长宽比是固定的,但是在实际情况下,随着物体和相机的相对运动,距离会发生变化,物体的长宽比也是会发生变化的。
然后使用一个kalman滤波器预测更新轨迹,该卡尔曼滤波器采用匀速模型和线性观测模型。

框与目标的数据关联

SORT:
作者使用匈牙利指派算法进行数据关联,使用的cost矩阵为原有目标在当前帧中的预测位置和当前帧目标检测框之间的IOU。当然小于指定IOU阈值的指派结果是无效的。作者发现使用IOU能够解决目标的短时被遮挡问题。这是因为目标被遮挡时,检测到了遮挡物,没有检测到原有目标,假设把遮挡物和原有目标进行了关联。那么在遮挡结束后,因为在相近大小的目标IOU往往较大,因此很快就可以恢复正确的关联。这是建立在遮挡物面积大于目标的基础上的。

缺点:遮挡结束后,车辆检测可能又将被继续执行,那么SORT只能分配给该物体一个新的ID编号,代表一个新的追踪片段的开始。所以受遮挡等情况影响较大,会有大量的ID切换。

DeepSort:
由于SORT忽略了被检测物体的表面特征,因此只有在物体状态估计不确定性较低是才会准确,在Deep SORT中,我们使用更加可靠的度量来代替关联度量,并使用CNN网络在大规模行人数据集进行训练,并提取特征,已增加网络对遗失和障碍的鲁棒性。

DeepSORT中采用了一个简单(运算量不大)的CNN来提取被检测物体(检测框物体中)的外观特征(低维向量表示),在每次(每帧)检测+追踪后,进行一次物体外观特征的提取并保存。

后面每进行一次updata,都要计算当前帧被检测物体外观特征和之前存储的外观特征的相似度,这是作为一个重要的判别依据。(由两部分组成,运动特征+外观特征,运动特征是卡尔曼滤波提供的)

过程:

  • 初始化:一个检测没有和之前的trach相关联,就会初始化一个新的目标
  • 新生:一个目标被初始化之后,前三帧被正常捕捉和关联成功之后,物体会产生一个新的track,否则会被删除。
  • 消失:如果超过了设定的最大保存时间(原文中叫做predefined maximum age)没有被关联到的话,那么说明这个物体离开了视频画面,该物体的信息(记录的外观特征和行为特征)将会被删除。

PS:如果实时视频处理后FPS过低的话,可能目标框未捕捉到3帧就消失,不会在屏幕上显示。

运动特征

DeepSort中使用了马氏距离来计算卡尔曼滤波状态和新获得的测量值(检测框)之间的距离。
公式如下:

(yi,Si)(y_i,S_i)(yi​,Si​)表示第i个追踪分布在测量空间上的投影,yiy_iyi​为均值,SiS_iSi​为协方差。

i代表追踪的序号,j表示检测框的序号。

马氏距离通过测量卡尔曼滤波器的追踪位置均值(mean track location)之间的标准差与检测框来计算状态估计间的不确定性,即d1(i,j)d^1(i,j)d1(i,j)为第i个追踪分布和第j个检测框之间的马氏距离(不确定度)。

论文中使用t=9.4877t = 9.4877t=9.4877来作为马氏距离的阈值上限,超过则直接忽略。t是由倒卡方分布计算出来的95%置信区间作为阈值。

 def gating_distance(self, mean, covariance, measurements,only_position=False):"""Compute gating distance between state distribution and measurements.A suitable distance threshold can be obtained from `chi2inv95`. If`only_position` is False, the chi-square distribution has 4 degrees offreedom, otherwise 2.Parameters----------mean : ndarrayMean vector over the state distribution (8 dimensional).covariance : ndarrayCovariance of the state distribution (8x8 dimensional).measurements : ndarrayAn Nx4 dimensional matrix of N measurements, each informat (x, y, a, h) where (x, y) is the bounding box centerposition, a the aspect ratio, and h the height.only_position : Optional[bool]If True, distance computation is done with respect to the boundingbox center position only.Returns-------ndarrayReturns an array of length N, where the i-th element contains thesquared Mahalanobis distance between (mean, covariance) and`measurements[i]`."""mean, covariance = self.project(mean, covariance)if only_position:mean, covariance = mean[:2], covariance[:2, :2]measurements = measurements[:, :2]cholesky_factor = np.linalg.cholesky(covariance)d = measurements - meanz = scipy.linalg.solve_triangular(cholesky_factor, d.T, lower=True, check_finite=False,overwrite_b=True)squared_maha = np.sum(z * z, axis=0)return squared_maha

外观特征

通过CNN(其实是一个小型的残差网络,两个卷积层和六个残差网络)将人体检测框reshape成128*64的物体输入,输出一个128维的向量。通过归一化之后,向量模长为1。

该CNN已经在大规模的人员重新识别数据集上进行了训练,该数据集包含超过1100000张1261名行人的图像,非常适合在人体跟踪环境中进行深度学习。在1050 GPU上向前传递32个边界框大约需要30毫秒。

会为每一个目标K创建一个gallery,用于存储该目标中不同帧的外观特征。代码中的NN_BUDGET就代表了gallery最大存储的大小,默认为100,即最多只能存储目标K当前时刻前100帧的目标外观特征。
第二个距离计算公式:

通过其求解所有已知的gallery中的外观特征与获得的检测框(编号为j)的外观特征的最小余弦距离。然后设置一个t2t^2t2来判断关联是否合理

数据融合+级联匹配

通过上面的d1d_1d1​ 和 d2d_2d2​,将这两个尺度融合为:
cost matrix CCC
gate matrix BBB

ci,j=λd1(i,j)+(1−λ)d2(i,j)c_{i,j} =\lambda d^1(i,j)+(1-\lambda)d^2(i,j)ci,j​=λd1(i,j)+(1−λ)d2(i,j)

级联匹配:

本文还提出了一种级联匹配的策略来提高匹配精度,主要由于当一个目标被遮挡很长时间,Kalman滤波的不确定性就会大大增加,并会导致连续预测的概率弥散,假设本来协方差矩阵是一个正态分布,那么连续的预测不更新就会导致这个正态分布的方差越来越大,那么离均值欧氏距离远的点可能和之前分布中离得较近的点获得同样的马氏距离值。

简单描述下:

  1. 输入追踪T和检测D,最大保留时长AmaxA_{max}Amax​
  2. 第一行和第二行计算了联合代价矩阵C和gate矩阵B,如上述公式
  3. 第三第四行,初始化匹配列表MMM和非匹配列表UUU,将DDD赋予
  4. 1到AmaxA_{max}Amax​的for循环:
    4.1 按照给定的age选择track
    4.2 使用匈牙利算法计算min_cost_matching的i和j
    4.3 将满足合适条件的i,j赋值给匹配列表MMM,保存
    4.4 重新更新非匹配列表UUU
  5. 返回匹配列表MMM和非匹配列表UUU
    代码模块:
def min_cost_matching(distance_metric, max_distance, tracks, detections, track_indices=None,detection_indices=None):"""Solve linear assignment problem.Parameters----------distance_metric : Callable[List[Track], List[Detection], List[int], List[int]) -> ndarrayThe distance metric is given a list of tracks and detections as well asa list of N track indices and M detection indices. The metric shouldreturn the NxM dimensional cost matrix, where element (i, j) is theassociation cost between the i-th track in the given track indices andthe j-th detection in the given detection_indices.max_distance : floatGating threshold. Associations with cost larger than this value aredisregarded.tracks : List[track.Track]A list of predicted tracks at the current time step.detections : List[detection.Detection]A list of detections at the current time step.track_indices : List[int]List of track indices that maps rows in `cost_matrix` to tracks in`tracks` (see description above).detection_indices : List[int]List of detection indices that maps columns in `cost_matrix` todetections in `detections` (see description above).Returns-------(List[(int, int)], List[int], List[int])Returns a tuple with the following three entries:* A list of matched track and detection indices.* A list of unmatched track indices.* A list of unmatched detection indices."""if track_indices is None:track_indices = np.arange(len(tracks))if detection_indices is None:detection_indices = np.arange(len(detections))if len(detection_indices) == 0 or len(track_indices) == 0:return [], track_indices, detection_indices  # Nothing to match.cost_matrix = distance_metric(tracks, detections, track_indices, detection_indices)cost_matrix[cost_matrix > max_distance] = max_distance + 1e-5row_indices, col_indices = linear_assignment(cost_matrix)matches, unmatched_tracks, unmatched_detections = [], [], []for col, detection_idx in enumerate(detection_indices):if col not in col_indices:unmatched_detections.append(detection_idx)for row, track_idx in enumerate(track_indices):if row not in row_indices:unmatched_tracks.append(track_idx)for row, col in zip(row_indices, col_indices):track_idx = track_indices[row]detection_idx = detection_indices[col]if cost_matrix[row, col] > max_distance:unmatched_tracks.append(track_idx)unmatched_detections.append(detection_idx)else:matches.append((track_idx, detection_idx))return matches, unmatched_tracks, unmatched_detections

在最后阶段,作者使用之前SORT算法中的IOU关联去匹配n=1的unconfirmed和unmatched的轨迹。这可以缓解因为表观突变或者部分遮挡导致的较大变化。当然有好处就有坏处,这样做也有可能导致一些新产生的追踪被连接到了一些旧的追踪上(重叠的时候容易发生)。

总结

使用CNN提取的特征进行匹配,大大减少了SORT中的ID switches, 经作者实验证明减少了大约45%, 在高速率视频流中也达到了很好的水准!

DeepSort 总结相关推荐

  1. AI视频行为分析系统项目复盘——技术篇4:deepsort原理图

    0 背景 见<AI视频行为分析系统项目复盘--技术篇1> 1 目标 尽力绘制详尽的原理图,弄懂deepsort的全局和细节,希望具备以下能力: 精通--能够魔改算法. 一叶知秋--深入了解 ...

  2. deepsort原理快速弄懂——时效比最高的

    主要转载自:https://www.cnblogs.com/liuboblog/p/12105473.html 分模块的代码参考:https://zhuanlan.zhihu.com/p/908352 ...

  3. 应用YOLOV4 - DeepSort 实现目标跟踪

    转载自 https://cloud.tencent.com/developer/article/1706259 本文分享利用yolov4+deepsort实现目标跟踪,主要是讲解如何使用,具体原理可以 ...

  4. Deepsort + Yolo 实现行人检测和轨迹追踪

    作者 | 李秋键 出品 | AI科技大本营(ID:rgznai100) 引言 行人检测是近年来计算机视觉领域的研究热点,同时也是目标检测领域中的难点.其目的是识别和定位图像中存在的行人,在许多领域中都 ...

  5. 简单粗暴的多对象目标跟踪神器 – DeepSort

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 DeepSort 对象跟踪问题一直是计算机视觉的热点任务之一,简单 ...

  6. 目标跟踪初探(DeepSORT)

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|AI算法与图像处理 简述 本文首先将介绍在目标跟踪任务中常 ...

  7. reid笔记 yolov5 deepsort

    方案1: YoloV5 + deepsort + Fast-ReID 完整行人重识别系统(三)_zengwb的博客-CSDN博客 改进点:将deepsor的表征提取模型替换成了fastreid训练的r ...

  8. 【深度学习】用 YOLO v5+DeepSORT,打造实时多目标跟踪模型

    内容概要:目标跟踪作为一个非常有前景的研究方向,常常因为场景复杂导致目标跟丢的情况发生.本文按照跟踪目标数量的差异,分别介绍了单目标跟踪及多目标跟踪. 关键词:目标跟踪   计算机视觉    教程 目 ...

  9. DeepSORT多目标跟踪算法

    DeepSORT 多目标跟踪算法 整体思路 SORT 算法的思路是将目标检测算法得到的检测框与预测的跟踪框的 iou(交并比)输入到匈牙利算法中进行线性分配来关联帧间 Id.而 DeepSORT 算法 ...

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

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

最新文章

  1. 十、Redis五大数据类型之二List
  2. 理解IDS的主动响应机制
  3. CSS:页脚紧贴底部
  4. 第3章 Kotlin语言基础 《Kotlin 极简教程》
  5. ROS 与 Matlab/Simulink联合仿真测试(1)
  6. PostgreSQL体系结构和基本操作
  7. OpenShift 4 - DevSecOps Workshop (7) - 为Pipeline增加向Nexus制品库推送任务
  8. JavaSE 学习参考:枚举类型
  9. 自动写诗APP项目、基于python+Android实现(技术:LSTM+Fasttext分类+word2vec+Flask+mysql)第一节
  10. 在Chrome、Firefox等高版本浏览器中实现在线编辑、审阅Office文档新方案
  11. linux 虚拟启动失败,kvm虚拟机启动失败
  12. raid控制器2大厂商阵营并购史
  13. 3dmax 毛发、毛头麻绳
  14. Win10调整各窗口的任务栏位置
  15. 区块链之一 起源思想和本质
  16. python的itchat模块_Python itchat模块在微信上的各种小应用
  17. 阿里hr为什么那么拽?转载知乎热榜万赞回答
  18. 上海亨隆科教设备有限公司——人体针灸模型
  19. 姜汁洗头加啃南瓜子,想让白发变黑也不难
  20. 2019年东南大学计算机553C++复试编程题

热门文章

  1. html 视差效果,使用6种不同视觉差特效的HTML5页面设计效果
  2. fancybox 的使用
  3. RPG游戏引擎的设计原理
  4. excel删除单元格内空格或空白字符?
  5. android 自定义 theme,Android 系统添加自定义主题属性
  6. C++管道的例子——服务端与客户端通信
  7. XShell学习XShell的使用方法
  8. ACM基础算法入门及题目列表
  9. java父原型,对象及原型丶Java教程网-IT开发者们的技术天堂
  10. kof97 逆向分析_指令输入系统