MOT--ByteTrack

  • 一 背景
  • 二、算法原理
  • 三、代码解析

论文地址:链接
代码地址:链接

一 背景

改算法来源于字节跳动实验室,其核心目的是为了解决 SORT 中的缺陷,其基本思想是:分别处理检测中的高分值目标与低分值目标,进行多层级的匹配,实现更好的分配与追踪效果。

二、算法原理

byte的主要作用是,解决了低检测分值匹配不准及物体短暂性遮挡的问题,其基本算法原理为:

  1. 目标检测,对于视频数据而言,目标检测的算法与方式有 n 种,其输出结构都可以构造成 rect + centroid + score + label 的形式;
  2. 根据 score 对检测结果进行划分,通过阈值判断,将检测结果分成 high scorelow score 两个部分;
  3. 初次匹配,将 high score 中的检测结果与原有轨迹进行匹配追踪(与 SORT 雷同),会有部分轨迹没有被匹配成功;
  4. 再次匹配,将步骤3中剩余的轨迹与 low score 中的数据进行匹配;
  5. 对于没有匹配上跟踪轨迹,得分又足够高的检测框,新建一个跟踪轨迹。对于没有匹配上检测框的跟踪轨迹,保留 m 帧,在其再次出现时再进行匹配;
    算法伪代码如下(来源于论文):

三、代码解析

核心代码如下,其文件名为:byte_tracker.py

def update(self, output_results, img_info, img_size):self.frame_id += 1activated_starcks = []refind_stracks = []lost_stracks = []removed_stracks = []if output_results.shape[1] == 5:scores = output_results[:, 4]bboxes = output_results[:, :4]else:output_results = output_results.cpu().numpy()scores = output_results[:, 4] * output_results[:, 5]bboxes = output_results[:, :4]  # x1y1x2y2img_h, img_w = img_info[0], img_info[1]scale = min(img_size[0] / float(img_h), img_size[1] / float(img_w))bboxes /= scaleremain_inds = scores > self.args.track_threshinds_low = scores > 0.1inds_high = scores < self.args.track_threshinds_second = np.logical_and(inds_low, inds_high)dets_second = bboxes[inds_second]dets = bboxes[remain_inds]scores_keep = scores[remain_inds]scores_second = scores[inds_second]if len(dets) > 0:'''Detections'''detections = [STrack(STrack.tlbr_to_tlwh(tlbr), s) for(tlbr, s) in zip(dets, scores_keep)]else:detections = []''' Add newly detected tracklets to tracked_stracks'''unconfirmed = []tracked_stracks = []  # type: list[STrack]for track in self.tracked_stracks:if not track.is_activated:unconfirmed.append(track)else:tracked_stracks.append(track)''' Step 2: First association, with high score detection boxes'''strack_pool = joint_stracks(tracked_stracks, self.lost_stracks)# Predict the current location with KFSTrack.multi_predict(strack_pool)dists = matching.iou_distance(strack_pool, detections)if not self.args.mot20:dists = matching.fuse_score(dists, detections)matches, u_track, u_detection = matching.linear_assignment(dists, thresh=self.args.match_thresh)for itracked, idet in matches:track = strack_pool[itracked]det = detections[idet]if track.state == TrackState.Tracked:track.update(detections[idet], self.frame_id)activated_starcks.append(track)else:track.re_activate(det, self.frame_id, new_id=False)refind_stracks.append(track)''' Step 3: Second association, with low score detection boxes'''# association the untrack to the low score detectionsif len(dets_second) > 0:'''Detections'''detections_second = [STrack(STrack.tlbr_to_tlwh(tlbr), s) for(tlbr, s) in zip(dets_second, scores_second)]else:detections_second = []r_tracked_stracks = [strack_pool[i] for i in u_track if strack_pool[i].state == TrackState.Tracked]dists = matching.iou_distance(r_tracked_stracks, detections_second)matches, u_track, u_detection_second = matching.linear_assignment(dists, thresh=0.5)for itracked, idet in matches:track = r_tracked_stracks[itracked]det = detections_second[idet]if track.state == TrackState.Tracked:track.update(det, self.frame_id)activated_starcks.append(track)else:track.re_activate(det, self.frame_id, new_id=False)refind_stracks.append(track)for it in u_track:track = r_tracked_stracks[it]if not track.state == TrackState.Lost:track.mark_lost()lost_stracks.append(track)'''Deal with unconfirmed tracks, usually tracks with only one beginning frame'''detections = [detections[i] for i in u_detection]dists = matching.iou_distance(unconfirmed, detections)if not self.args.mot20:dists = matching.fuse_score(dists, detections)matches, u_unconfirmed, u_detection = matching.linear_assignment(dists, thresh=0.7)for itracked, idet in matches:unconfirmed[itracked].update(detections[idet], self.frame_id)activated_starcks.append(unconfirmed[itracked])for it in u_unconfirmed:track = unconfirmed[it]track.mark_removed()removed_stracks.append(track)""" Step 4: Init new stracks"""for inew in u_detection:track = detections[inew]if track.score < self.det_thresh:continuetrack.activate(self.kalman_filter, self.frame_id)activated_starcks.append(track)""" Step 5: Update state"""for track in self.lost_stracks:if self.frame_id - track.end_frame > self.max_time_lost:track.mark_removed()removed_stracks.append(track)# print('Ramained match {} s'.format(t4-t3))self.tracked_stracks = [t for t in self.tracked_stracks if t.state == TrackState.Tracked]self.tracked_stracks = joint_stracks(self.tracked_stracks, activated_starcks)self.tracked_stracks = joint_stracks(self.tracked_stracks, refind_stracks)self.lost_stracks = sub_stracks(self.lost_stracks, self.tracked_stracks)self.lost_stracks.extend(lost_stracks)self.lost_stracks = sub_stracks(self.lost_stracks, self.removed_stracks)self.removed_stracks.extend(removed_stracks)self.tracked_stracks, self.lost_stracks = remove_duplicate_stracks(self.tracked_stracks, self.lost_stracks)# get scores of lost tracksoutput_stracks = [track for track in self.tracked_stracks if track.is_activated]return output_stracks

MOT--ByteTrack相关推荐

  1. 目标跟踪之 MOT 经典算法:ByteTrack 算法原理以及多类别跟踪

    目标跟踪之 MOT 经典算法:ByteTrack 算法原理以及多类别跟踪 作者:Yifu Zhang 等 发表时间:2021 Paper 原文:ByteTrack: Multi-Object Trac ...

  2. 【MOT】目标追踪DeepSORT与ByteTrack

    基础知识 匹配算法: SORT算法: Kalman滤波, 匈牙利算法(匹配算法), 马氏距离(损失指标): Kalman滤波是通过对上一帧每个检测对象进行预测,得到一个BBox_predicted,然 ...

  3. 屠榜多目标跟踪!华科amp;港大提出ByteTrack:基于数据关联方法BYTE的跟踪器

    作者丨孙培泽@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/421264325 编辑丨极市平台 导读 基于BYTE本文提出了一个跟踪方法ByteTrack,首次以30 ...

  4. ByteTrack实时多目标跟踪

    去年的1024我写了一篇FairMOT实时多目标跟踪,兜兜转转,一年过去了,最近FairMOT原作者发布了更快更强的ByteTrack,也就有了这篇文章,有种恍如隔世之感. 简介 ByteTrack是 ...

  5. byteTrack数据集categories不规范带来的问题

    将自己的数据集转换为coco类数据集 写一个config文件,可以模仿byteTrack自带的,在exps/example/mot中,主要是修改类别数.以及数据读取路径,其它参数比如normalize ...

  6. ECCV22 | ByteTrack:简单、高效、实用的多目标跟踪方法

    点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[ECCV2022]获取ECCV2022所有自动驾驶方向论文! 后台 ...

  7. 【MOT】C-BIoU:Hard to Track Objects with Irregular Motions and Similar Appearances?

    Hard to Track Objects with Irregular Motions and Similar Appearances? Make It Easier by Buffering th ...

  8. ByteTrack论文解读

    ByteTrack 摘要 介绍 BYTE关联方法 ByteTrack 实验结果 代码部署 论文地址: https://arxiv.org/abs/2110.06864 代码地址: https://gi ...

  9. 多目标追踪小抄:快速了解MOT的基本概念

    来源:Deephub Imba 本文共2400字,建议阅读5分钟本文介绍了MOT的基本概念. 多目标跟踪(Multiple Object Tracking) MOT 获取单个连续视频并以特定帧速率 ( ...

  10. 多目标跟踪MOT技术总结(持续更新)

    前言:本人作为MOT领域新人,目前已经阅读一定量和质量的paper,尽可能的将这些MOT算法按照不同的技术路径进行分类(2016 SORT之后),并且只对论文的方法做一个大概的总结,具体细节请参照原文 ...

最新文章

  1. python编程入门p-读书笔记 - 《Python编程:从入门到实践》
  2. python图片转字符画
  3. 教你如何搭建虚拟专用网连接 OPEN***
  4. nema0183 java解析_NEMA 0183 语句解析
  5. PHP的mysqli_fetch_all
  6. scala通过JDBC进行数据库操作
  7. 百度Apollo开通上海自动驾驶示范路线 落地第5城
  8. AndroidStudio_使用NanoHTTPD搭建HTTP服务_把android设置当成一个http服务器来使用---Android原生开发工作笔记225
  9. 技巧:让Eclipse或Flex Builder 支持自动换行。(转)
  10. 32muduo_net库源码分析(八)
  11. powershell 模拟IE行为
  12. 【原理】 进程调度算法
  13. 23种设计模式-模板方法模式《面试流程》
  14. Wifi热点工具-青青草原WiFi
  15. appcan与java_AppCan试用体验
  16. 美团无人配送部总经理夏华夏演讲:从技术细节看美团架构
  17. 【人工智能项目】MNIST手写体识别实验及分析
  18. Svchost.exe是病毒的两种情况
  19. 已设置过微信号怎么改?新版微信已经支持这个功能!
  20. android 2.2 sdk 源码,Ubuntu 10.10 编译Android2.2(froyo)源码 sdk adt

热门文章

  1. web2.0图形设计风格指南
  2. 内存优化: 纹理压缩技术
  3. vim的变量、文件比对、打开多个文件、day4,5,6,7,8练习题
  4. 有哪些平台是和连连支付合作的?连连支付可以跨境支付?不用去银行?
  5. 学习python基础(五)
  6. 详细的web开发部署步骤(在新版配置环境下的自我总结)(内附精美五子棋游戏代码)
  7. ping直连同网段设备的过程
  8. “十三五”时期北京数字经济比重近四成,比例居全国首位!
  9. 从“十三五规划”看数据的重要性
  10. linux的Umask 为022 和027 都是什么意思?