ByteTrack实时多目标跟踪
去年的1024我写了一篇FairMOT实时多目标跟踪,兜兜转转,一年过去了,最近FairMOT原作者发布了更快更强的ByteTrack,也就有了这篇文章,有种恍如隔世之感。
简介
ByteTrack是近期公开的一个新的多目标跟踪SOTA方法,第一次在MOT17数据集上到达80以上的MOTA并在多个榜单上排名第一,堪称屠榜多目标跟踪。本文主要介绍如何使用ByteTrack的源码进行实时跟踪(包括视频和摄像头)。本文均采用Ubuntu18.04进行环境配置,采用其他操作系统的在安装一些库时可能有所问题,需要自行解决。
ByteTrack的性能比较如下图,横轴表示推理速度、纵轴表示MOTA精度,圈的大小表示IDF1的数值。可以看到,ByteTrack超越了此前所有的跟踪方法。
这里简单介绍一下这个算法的一些内容。Tracking-by-detection是MOT中的一个经典高效的流派,通过相似度(位置、外观、运动等信息)来关联帧间的检测框得到跟踪轨迹。不过,由于实际场景的复杂性,检测器往往无法得到完美的检测结果。为了权衡真假正例,目前大部分MOT方法会选择一个阈值(threshold),只保留高于这个阈值的检测结果来做关联得到跟踪结果,低于这个阈值的检测框就直接丢弃。作者认为这种策略是不合理的,就如黑格尔所说:“存在即合理。” 低分检测框往往预示着物体的存在(例如遮挡严重的物体)。简单地把这些物体丢弃会给MOT带来不可逆转的错误,包括大量的漏检和轨迹中断,降低整体跟踪性能。因此,作者提出了一种新的数据关联方法BYTE,将高分框和低分框分开处理,利用低分检测框和跟踪轨迹之间的相似性,从低分框中挖掘出真正的物体,过滤掉背景。简单来说,是一个二次匹配的过程,具体算法流程可以查看原论文。
这种策略行之有效的原因其实和此前一些针对遮挡的方法有很类似的地方,那就是当物体被遮挡的时候,这个过程肯定不是瞬时发生的,它必然伴随着检测框由明确到不明确的过程,也就是框的得分降低的过程,因此挖掘低分的检测框有助于修补那些被破坏的轨迹并保持一个较高的运行速度。
本文主要介绍ByteTrack的源码使用方式,关于理论的解读可以参考这篇文章。
环境配置
下面介绍该项目环境配置的过程,需要保证用户已经安装了Git和Conda,且安装了支持CUDA10.2以上的显卡驱动。
逐行执行下面的命令即可,需要注意,这里通过conda安装了Pytorch和Cuda,因此requirements.txt
文件中的torch和torchvision两行需要先行删去。
git clone git@github.com:ifzhang/ByteTrack.git
cd ByteTrack/
conda create -n bytetrack python=3.8 -y
conda activate bytetrack
conda install pytorch=1.7.1 torchvision cudatoolkit -y
pip install -r requirements.txt
python setup.py develop
pip install cython
pip install 'git+https://github.com/cocodataset/cocoapi.git#subdirectory=PythonAPI'
pip install cython_bbox
这时候关于模型推理的环境就安装完成了,当然,官方也给了docker环境配置的教程,这里就不介绍了,感兴趣的可以参考作者的README。
模型下载
使用在 CrowdHuman、MOT17、Cityperson 和 ETHZ 上训练的模型, 下载地址如下表,表中指标在MOT17训练集上测试得到。
Model | MOTA | IDF1 | IDs | FPS |
---|---|---|---|---|
bytetrack_x_mot17 [google], [baidu(code:ic0i)] | 90.0 | 83.3 | 422 | 29.6 |
bytetrack_l_mot17 [google], [baidu(code:1cml)] | 88.7 | 80.7 | 460 | 43.7 |
bytetrack_m_mot17 [google], [baidu(code:u3m4)] | 87.0 | 80.1 | 477 | 54.1 |
bytetrack_s_mot17 [google], [baidu(code:qflm)] | 79.2 | 74.3 | 533 | 64.5 |
本文以最轻量的s
版本为例,下载bytetrack_s_mot17.pth.tar
文件,下载后在项目的根目录下新建models
文件夹并将该文件放入其中。
实时跟踪
经过上面的环境配置和模型下载,此时你可以通过下面的命令来推理作者提供的demo视频文件。
视频文件
python tools/demo_track.py video -f exps/example/mot/yolox_s_mix_det.py -c ./models/bytetrack_s_mot17.pth.tar --path ./videos/palace.mp4 --fp16 --fuse --save_result
推理过程中会出现如下的日志,并在当前目录下生成YOLOX_outputs
目录,推理生成的跟踪结果就在其中。
其中部分选项符的含义如下。
demo
:任务类型,必选项,可选image、video和webcam-f
:模型配置文件-c
:模型文件--path
:需要进行推理的文件路径--save_result
:是否保存推理结果
我们在VisDrone数据集中的一个场景下测试了这个s
版本模型的效果,结果如下,由于我们采用的最轻量的s
版本模型,因此精度不是很高,很多小目标没有检测出来,不过速度是非常快的。想要看到更准确的效果,可以尝试更复杂的模型,即m
、l
、x
版本的模型。
ByteTrack实时多目标跟踪
摄像头
接着就是使用摄像头进行实时跟踪了,我这里使用的是比较方便的USB摄像头。由于作者已经提供了摄像头数据流的接口,并会在推理完成后保存推理的结果视频,但是我们使用摄像头进行跟踪的时候往往想要实时看到跟踪效果,因此,需要将作者的tools/demo_track.py
中的imageflow_demo
函数修改如下。
def imageflow_demo(predictor, vis_folder, current_time, args):cap = cv2.VideoCapture(args.path if args.demo == "video" else args.camid)width = cap.get(cv2.CAP_PROP_FRAME_WIDTH) # floatheight = cap.get(cv2.CAP_PROP_FRAME_HEIGHT) # floatfps = cap.get(cv2.CAP_PROP_FPS)save_folder = os.path.join(vis_folder, time.strftime("%Y_%m_%d_%H_%M_%S", current_time))os.makedirs(save_folder, exist_ok=True)if args.demo == "video":save_path = os.path.join(save_folder, args.path.split("/")[-1])else:save_path = os.path.join(save_folder, "camera.mp4")logger.info(f"video save_path is{save_path}")vid_writer = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc(*"mp4v"), fps, (int(width), int(height)))tracker = BYTETracker(args, frame_rate=30)timer = Timer()frame_id = 0results = []while True:if frame_id % 20 == 0:logger.info('Processing frame {} ({:.2f} fps)'.format(frame_id, 1. / max(1e-5, timer.average_time)))ret_val, frame = cap.read()if ret_val:outputs, img_info = predictor.inference(frame, timer)online_targets = tracker.update(outputs[0], [img_info['height'], img_info['width']], exp.test_size)online_tlwhs = []online_ids = []online_scores = []for t in online_targets:tlwh = t.tlwhtid = t.track_idvertical = tlwh[2] / tlwh[3] > 1.6if tlwh[2] * tlwh[3] > args.min_box_area and not vertical:online_tlwhs.append(tlwh)online_ids.append(tid)online_scores.append(t.score)timer.toc()results.append((frame_id + 1, online_tlwhs, online_ids, online_scores))online_im = plot_tracking(img_info['raw_img'], online_tlwhs, online_ids, frame_id=frame_id + 1,fps=1. / timer.average_time)if args.save_result:vid_writer.write(online_im)cv2.imshow("demo", online_im)ch = cv2.waitKey(1)if ch == 27 or ch == ord("q") or ch == ord("Q"):breakelse:breakframe_id += 1
此时通过下面的命令就可以实时看到摄像头内拍摄到的内容的跟踪效果(命令中的--camid
表示摄像头编号),我已经测试了代码并成功运行,不过因为隐私问题我这里就不放跟踪效果视频了。
python tools/demo_track.py webcam -f exps/example/mot/yolox_s_mix_det.py -c ./models/bytetrack_s_mot17.pth.tar --fp16 --fuse --save_result --camid 0
补充说明
本文对应用ByteTrack实现了基于视频流的多目标实时跟踪,是研究ByteTrack代码闲暇之余的小demo,本文涉及的视频仅作示例之用,如有侵权请联系我删除。
ByteTrack实时多目标跟踪相关推荐
- 【深度学习】用 YOLO v5+DeepSORT,打造实时多目标跟踪模型
内容概要:目标跟踪作为一个非常有前景的研究方向,常常因为场景复杂导致目标跟丢的情况发生.本文按照跟踪目标数量的差异,分别介绍了单目标跟踪及多目标跟踪. 关键词:目标跟踪 计算机视觉 教程 目 ...
- 用 YOLO v5+DeepSORT,打造实时多目标跟踪模型
内容概要:目标跟踪作为一个非常有前景的研究方向,常常因为场景复杂导致目标跟丢的情况发生.本文按照跟踪目标数量的差异,分别介绍了单目标跟踪及多目标跟踪. 目标跟踪 (Object Tracking) 是 ...
- 业界首个实时多目标跟踪系统开源
(图片由AI科技大本营付费下载自视觉中国) 作者 | CV君 来源 | 我爱计算机视觉(ID:aicvml) 相对业界研究比较多的单目标跟踪,多目标跟踪(Multi-Object Tracking,M ...
- FairMOT实时多目标跟踪
简介 FairMOT是今年很火的一个多目标跟踪算法,前不久也开放了最新版本的论文,并于最近重构了开源代码,我也在实际工程视频上进行了测试,效果是很不错的.不过,官方源码没有提高实时摄像头跟踪的编程接口 ...
- 【论文阅读 - YolTrack】YolTrack:基于MTL的自动车辆实时多目标跟踪和分割
本文2021.12发表于IEEE TRANSACTIONS ON NEURAL NETWORKS AND LEARNING SYSTEMS,作者来自哈工大.本文的主要贡献在于提出了一种新的神经网络模型 ...
- 【深度学习】Yolov5_DeepSort_Pytorch:基于 Yolov5 + Deep Sort 的实时多目标跟踪器
简介 该存储库包含一个两阶段跟踪器.YOLOv5(一系列在 COCO 数据集上预训练的对象检测架构和模型)生成的检测被传递到跟踪对象的 Deep Sort 算法.它可以跟踪Yolov5 模型经过训练可 ...
- 基于 PaddleDetection 的 SoccerNet 多目标跟踪基线
1. 介绍 一个基于 PaddleDetection 套件和 SoccerNet Tracking 数据集开发的足球和足球运动员多目标跟踪(MOT)的基线 包含 DeepSort.ByteTrack. ...
- 计算机视觉-论文阅读笔记-基于高性能检测器与表观特征的多目标跟踪
这篇笔记主要是对今年ECCV2016上的论文:POI:Multiple Object Tracking with High Performance Detection and Appearance F ...
- SORT 多目标跟踪算法笔记
SORT 是一种简单的在线实时多目标跟踪算法.文章要点为: 以 IoU 作为前后帧间目标关系度量指标: 利用卡尔曼滤波器预测当前位置: 通过匈牙利算法关联检测框到目标: 应用试探期甄别虚检: 使用 F ...
最新文章
- 使用 LSTM 进行多变量时间序列预测的保姆级教程
- 【技术干货】如何进行低功耗设计和开发
- 解决git clone慢问题
- Access restriction: The method createJPEGEncoder(OutputStream) from the type JPEGCodec is not access
- tikhonov正则化 matlab_4 L1和l2正则化详解(花书7.1 参数范数惩罚)
- 【项目】uniapp前端接收后端springboot数据并渲染到界面+使用swiper和uView
- VTK:Qt之RenderWindowNoUiFile
- python操作文件和目录_python文件和目录操作方法
- BZOJ1014: [JSOI2008]火星人prefix
- 优秀!303篇论文获2020年度“优秀博士学位论文”!
- LCA--最近公共祖先
- Quartz.net 任务调度
- Oracle10G各版本下载
- gibboncode导入.stl格式模型,进行网格划分
- unity的C#学习——标识符号、关键字与数据类型及其转换方式
- 原生javascript实现星级评价功能
- 通过使用阿里云的OCR图文识别 实现识别功能
- php添加表格行列,excel表格怎么插行和列?
- Android如何实现简单的手机桌面GridView
- python科研用哪个软件_科研画图都用什么软件?