MOT--ByteTrack
MOT--ByteTrack
- 一 背景
- 二、算法原理
- 三、代码解析
论文地址:链接
代码地址:链接
一 背景
改算法来源于字节跳动实验室,其核心目的是为了解决 SORT
中的缺陷,其基本思想是:分别处理检测中的高分值目标与低分值目标,进行多层级的匹配,实现更好的分配与追踪效果。
二、算法原理
byte的主要作用是,解决了低检测分值匹配不准及物体短暂性遮挡的问题,其基本算法原理为:
- 目标检测,对于视频数据而言,目标检测的算法与方式有
n
种,其输出结构都可以构造成rect + centroid + score + label
的形式; - 根据
score
对检测结果进行划分,通过阈值判断,将检测结果分成high score
与low score
两个部分; - 初次匹配,将
high score
中的检测结果与原有轨迹进行匹配追踪(与SORT
雷同),会有部分轨迹没有被匹配成功; - 再次匹配,将步骤3中剩余的轨迹与
low score
中的数据进行匹配; - 对于没有匹配上跟踪轨迹,得分又足够高的检测框,新建一个跟踪轨迹。对于没有匹配上检测框的跟踪轨迹,保留
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相关推荐
- 目标跟踪之 MOT 经典算法:ByteTrack 算法原理以及多类别跟踪
目标跟踪之 MOT 经典算法:ByteTrack 算法原理以及多类别跟踪 作者:Yifu Zhang 等 发表时间:2021 Paper 原文:ByteTrack: Multi-Object Trac ...
- 【MOT】目标追踪DeepSORT与ByteTrack
基础知识 匹配算法: SORT算法: Kalman滤波, 匈牙利算法(匹配算法), 马氏距离(损失指标): Kalman滤波是通过对上一帧每个检测对象进行预测,得到一个BBox_predicted,然 ...
- 屠榜多目标跟踪!华科amp;港大提出ByteTrack:基于数据关联方法BYTE的跟踪器
作者丨孙培泽@知乎(已授权) 来源丨https://zhuanlan.zhihu.com/p/421264325 编辑丨极市平台 导读 基于BYTE本文提出了一个跟踪方法ByteTrack,首次以30 ...
- ByteTrack实时多目标跟踪
去年的1024我写了一篇FairMOT实时多目标跟踪,兜兜转转,一年过去了,最近FairMOT原作者发布了更快更强的ByteTrack,也就有了这篇文章,有种恍如隔世之感. 简介 ByteTrack是 ...
- byteTrack数据集categories不规范带来的问题
将自己的数据集转换为coco类数据集 写一个config文件,可以模仿byteTrack自带的,在exps/example/mot中,主要是修改类别数.以及数据读取路径,其它参数比如normalize ...
- ECCV22 | ByteTrack:简单、高效、实用的多目标跟踪方法
点击下方卡片,关注"自动驾驶之心"公众号 ADAS巨卷干货,即可获取 点击进入→自动驾驶之心技术交流群 后台回复[ECCV2022]获取ECCV2022所有自动驾驶方向论文! 后台 ...
- 【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 ...
- ByteTrack论文解读
ByteTrack 摘要 介绍 BYTE关联方法 ByteTrack 实验结果 代码部署 论文地址: https://arxiv.org/abs/2110.06864 代码地址: https://gi ...
- 多目标追踪小抄:快速了解MOT的基本概念
来源:Deephub Imba 本文共2400字,建议阅读5分钟本文介绍了MOT的基本概念. 多目标跟踪(Multiple Object Tracking) MOT 获取单个连续视频并以特定帧速率 ( ...
- 多目标跟踪MOT技术总结(持续更新)
前言:本人作为MOT领域新人,目前已经阅读一定量和质量的paper,尽可能的将这些MOT算法按照不同的技术路径进行分类(2016 SORT之后),并且只对论文的方法做一个大概的总结,具体细节请参照原文 ...
最新文章
- python编程入门p-读书笔记 - 《Python编程:从入门到实践》
- python图片转字符画
- 教你如何搭建虚拟专用网连接 OPEN***
- nema0183 java解析_NEMA 0183 语句解析
- PHP的mysqli_fetch_all
- scala通过JDBC进行数据库操作
- 百度Apollo开通上海自动驾驶示范路线 落地第5城
- AndroidStudio_使用NanoHTTPD搭建HTTP服务_把android设置当成一个http服务器来使用---Android原生开发工作笔记225
- 技巧:让Eclipse或Flex Builder 支持自动换行。(转)
- 32muduo_net库源码分析(八)
- powershell 模拟IE行为
- 【原理】 进程调度算法
- 23种设计模式-模板方法模式《面试流程》
- Wifi热点工具-青青草原WiFi
- appcan与java_AppCan试用体验
- 美团无人配送部总经理夏华夏演讲:从技术细节看美团架构
- 【人工智能项目】MNIST手写体识别实验及分析
- Svchost.exe是病毒的两种情况
- 已设置过微信号怎么改?新版微信已经支持这个功能!
- android 2.2 sdk 源码,Ubuntu 10.10 编译Android2.2(froyo)源码 sdk adt
热门文章
- web2.0图形设计风格指南
- 内存优化: 纹理压缩技术
- vim的变量、文件比对、打开多个文件、day4,5,6,7,8练习题
- 有哪些平台是和连连支付合作的?连连支付可以跨境支付?不用去银行?
- 学习python基础(五)
- 详细的web开发部署步骤(在新版配置环境下的自我总结)(内附精美五子棋游戏代码)
- ping直连同网段设备的过程
- “十三五”时期北京数字经济比重近四成,比例居全国首位!
- 从“十三五规划”看数据的重要性
- linux的Umask 为022 和027 都是什么意思?