多目标跟踪框架boxmot介绍

引言

boxmot由mikel brostrom开发,用于目标检测,分割和姿态估计模型的SOTA(state of art)跟踪模块,现已加入python第三方库 PYPI,可用pip包管理器进行安装。
boxmot所支持的跟踪器采用外观特征识别方法,如重型ReID(CLIRdID)和轻型ReID(LightMBN, OSNet等),来识别不同图像帧中同一个目标。这些ReID权文件在运行boxmot时自动下载,无需事先下载checkpoint文件。
boxmot目前支持的对象检测模型有:yolov8, yolo-NAS和YOLOX。支持的跟踪器:BoTSORT, DeepOCSORT, OCSORT, HybridSORT, ByteTrack, StrongSORT。之前常用的DeepSort由增强型的StrongSORT取代。
boxmot可以看作一个软件封装器,将多种对象检测模型与不同的目标跟踪器组合,实现多目标跟踪。

boxmot安装

安装以linux系统为例,假定该系统已经安装有python >=3.8,且建立好虚拟环境。

将boxmot安装到yolo_tracking目录:

git clone https://github.com/mikel-brostrom/yolo_tracking.git
cd yolo_tracking
pip install -v -e .

以上命令操作过程,即基本完成所需运行的python语言,pytorch模块运行环境。需要说明,这里还需要安装ultralytics相关模块。不过,在yolo_tracking/examples/track.py中,程序自动检查是否安装ultralytics。若没有,则自动安装mikel-brosrom github目录中保存的ultralytics v8.0.146到虚拟环境。需要注意:boxmot v10.0.43仅与ultralytics v8.0.146兼容,若安装ultralytics最新版本将出现莫名错误。
利用examples/track.py安装ultralytics与boxmot现有版本兼容。这里有个问题,track程序将ultralytics安装到虚拟环境,而不在工作目录yolo_tracking下,这样调试程序时,不能跟踪到ultralytics相关的程序模块。当然可以对python调试器做一些相应的配置,就更沟跟踪到虚拟环境的模块,但是操作很麻烦。
把ultralytics安装到yolo_tracking的目录,操作如下:
先删除虚拟环境下和系统中可能安装的ultralytics模块:

pip uninstall ultralytics

克隆ultralytics v8.0.146

git clone https://github.com/mikel-brostrom/ultralytics.git

此操作在home目录下产生ultralytics目录。我们需要将ultralytics二级目录:~/ultralytics/ultralytics移动到yolo_tracking目录下,完成安装ultralytics到工作目录yolo_tracking,这样在python程序调试时,可以跟踪到ultralytics模块。为了防止混淆,将examples/track.py中安装ultralytics语句注释掉:

#__tr = TestRequirements()
#__tr.check_packages(('ultralytics @ git+https://github.com/mikel-brostrom/ultralytics.git', ))  # install  ultralytics

运行示例

运行yolov8s+strongsort对输入视频进行车辆跟踪示例:

python examples/track.py  \--yolo-model yolov8s    \--reid-mode  osnet_x0_25_market1501.pt   \--source     ~/yolo_tracking/MOT16-13-h264.mp4  \ --save         \--show         \--classes 2     \--tracking-method strongsort 

运行 yolo_nas + strongsort 示例:

python examples/track.py  \--yolo-model yolo_nas_s    \--reid-mode  osnet_x0_25_market1501.pt   \--source     ~/yolo_tracking/MOT16-13-h264.mp4  \ --save         \--show         \--classes 2     \--tracking-method strongsort 

track.py程序运行解析

examples/track.py中,经繁琐的模型初始化后,每帧图像的检测-跟踪处理开始于循环:

for frame_idx, r in enumerate(results)

即,每帧产生一个results,对每帧results写入MOT跟踪文件,而实际的处理看跟踪results的跳转。这里跳转至
ultralytics.engine.predictor.py 中的 stream_inference()函数,略过某些初始化,看函数中的循环:

for batch in self.dataset

其中重要的处理在:

# Preprocess              
with profilers[0]:im = self.preprocess(im0s)       #1 图像格式处理,提取帧内容到数组。
# Inference
with profilers[1]preds = self.inference(im, *args, **kwargs)   #2 对象检测器,提取帧内目标。# Postprocesswith profilers[2]:                                 # 3  对所提取目标的后处理,即对跟踪器的目标输入,进行某种处理。if isinstance(self.model, AutoBackend):                           self.results = self.postprocess(preds, im, im0s)           # ultralytics内定义的检测器处理方法,  如 yolov8else:self.results = self.model.postprocess(path, preds, im, im0s)   # ultralytics之外的检测器处理, 如 yolo_nas, yoloxwith profilers[3]:self.run_callbacks('on_predict_postprocess_end')         # 4  构造跟踪器 tracker, 对检测目标的跟踪
  1. preprocess, 输入图像处理。
  2. inference, 推理,目标检测器提取图像帧中的目标。
  3. postprocess, 目标检测器输出preds的处理, yolov8用 non_max_suppression(); 非ultralytics的目标检测器(yolo_nas, yolox)则貌似没有处理。
  4. postprocess_end,跟踪器处理,输出跟踪结果results。
    yolov8以及之前的版本,yolov3, yolov5等采用non_max_suppression(preds, …)来去除不可信的多余目标,且可根据classes来筛选需要保留的目标类别,从而减少目标数量,为后续的跟踪器创造较好的工作环境,减少跟踪器运行时间。因为跟踪器按照目标数量逐一迭代产生跟踪轨迹tracks,迭代为串行运算,目标越多跟踪时间越长。Postprocess执行non_max_supperssion。
    对于yolo-nas,由Deci AI公司开发,目前尚未公开,boxmot无法筛选目标类别,所以,postprocess对preds基本没有处理,直接送到跟踪器tracker。
    最后,on_predict_postprocess_end执行跟踪器操作,输入preds,输出results。

图1
图1 yolov8 postprocess,经non_max_suppression(),筛选出小车对象(classes=2)。

在这里插入图片描述
图2 yolo_nas postprocess, boxmot目前不能通过筛选classes目标,跟踪输出多个类型目标。

ultralytics.trackers.track.py执行函数 on_predict_postprocess_end, boxmot所支持的跟踪器定义在 boxmot.trackers目录中。
完成 Preprocess, Inference, Postprocess后,得到跟踪输出results,进入可视化过程,在输入视频上绘制跟踪框;标注目标id、类型、置信度等参数等。
由此,完成一帧图像的检测-跟踪-可视化。predictor.py函数stream_inference对一帧图像处理,track.py中的循环体(for frame_idx, r in enumerate(results))对输入视频逐帧处理。

examples目录下还有两个可执行文件val.py, evolve.py
val.py 根据选定的benchmark(MOT16, MOT17, MOT20),对检测器+跟踪器组合做性能评估,跟踪类型为persons。
以下benchmark = MOT17, yolov8s + strongsort的评估结果如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
看来MOT-17指标与mikel brostrom提供的评估指标还有相当差距,原因不明。此外,本人运行得到的MOT-16各项指标与MOT-17倒是相差很小。

evolve.py 对跟踪器进行配置参数优化,就是在val.py过程提供评估指标,采用NSGA-II多目标遗传算法调整跟踪器配置参数,迭代运行,实现配置参数优化。显然,这是耗时较多的计算过程,尚未尝试。

跟踪框可视化

此处记录跟踪框可视化过程,便于对跟踪框所标注的目标信息进行修改显示。对此部分内容不感兴趣的读者可忽略。
从一帧图像的处理着手,见predictor.py 中函数stream_inference(), 其中看注释Visualize, save, write results下面的循环:

for i in range(n):if self.args.verbose or self.args.save or self.args.save_txt or self.args.show:   ###############s += self.write_results(i, self.results, (p, im, im0))   # 此处进入跟踪框可视化

函数write_results部分:

def write_results(self, idx, results, batch):if self.args.save or self.args.show:  # Add bbox to imageplot_args = {'line_width': self.args.line_width,'boxes': self.args.boxes,'conf': self.args.show_conf,'labels': self.args.show_labels}if not self.args.retina_masks:plot_args['im_gpu'] = im[idx]self.plotted_img = result.plot(**plot_args)     ####进入plot

result.plot在 ultralytics.engine.results.py定义,模块引用

from ultralytics.utils.plotting import Annotator

下面是result.plot函数使用类Anootator

annotator = Annotator(                                       #定义实例annotatordeepcopy(self.orig_img if img is None else img),line_width,font_size,font,pil or (pred_probs is not None and show_probs),  # Classify tasks default to pil=Trueexample=names)...
# Plot Detect results
if pred_boxes and show_boxes:for d in reversed(pred_boxes):c, conf, id = int(d.cls), float(d.conf) if conf else None, None if d.id is None else int(d.id.item())name = ('' if id is None else f' {id} ')    label = (f'{name} {conf:.2f}' if conf else name) if labels else Noneannotator.box_label(d.xyxy.squeeze(), label, color=colors(c, True))     # 进入annotator.box_label , 绘制bbox框。

实际的跟踪框bbox绘制在函数 annotator.box_label(), 这个可视化与mikel brostrom之前的版本(v3, v4, v5, v6)一致,都用ultralytics.utils.plotting.py。找到这个annotator.box_label,可以更改跟踪框显示方式,因为默认的label参数太多(id, class_name, conf),当图像帧中目标很多时,显示label一团糟,根本看不清。找到修改地方就主动。见图1,图2的简洁label显示。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/148616.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【动手学深度学习-Pytorch版】Transformer代码总结

本文是纯纯的撸代码讲解,没有任何Transformer的基础内容~ 是从0榨干Transformer代码系列,借用的是李沐老师上课时讲解的代码。 本文是根据每个模块的实现过程来进行讲解的。如果您想获取关于Transformer具体的实现细节(不含代码)可…

国庆中秋特辑(七)Java软件工程师常见20道编程面试题

以下是中高级Java软件工程师常见编程面试题,共有20道。 如何判断一个数组是否为有序数组? 答案:可以通过一次遍历,比较相邻元素的大小。如果发现相邻元素的大小顺序不对,则数组不是有序数组。 public boolean isSort…

【Unity】两种方式实现弹跳平台/反弹玩家(玩家触发与物体自身触发事件实现蹦床的物理效果)

一、声明 只实现物理反弹的效果,不实现蹦床会有的视觉拉伸效果,请自行找相关代码 二、实现 经过我的实践,我发现要想实现一个平台反弹的效果,要么就选择给player添加一个物理材质(平台加了没用)&#xff0…

arduino嵌入式1,LED闪烁案例

CVE系列在等等吧,环境我有点懒得搭建了 文章目录 前言一、anduino是什么玩意儿?二、使用步骤1.找蓝图/画蓝图2.写入数据成果 总结 前言 最近在学习嵌入式开发,我的单片机到了,然后我就沉迷于嵌入式开发的环境中 提示:…

Linux嵌入式学习之Ubuntu入门(六)shell脚本详解

系列文章内容 Linux嵌入式学习之Ubuntu入门(一)基本命令、软件安装、文件结构、编辑器介绍 Linux嵌入式学习之Ubuntu入门(二)磁盘文件介绍及分区、格式化等 Linux嵌入式学习之Ubuntu入门(三)用户、用户组…

go-fastdfs分布式文件存储集群搭建和测试

一、官方文件 https://sjqzhang.github.io/go-fastdfs/#character2、集群原理 小集群原理: 大集群原理 二、服务端集群部署 1、在集群每个节点机器上下载安装包 (建议使用最新稳定版本) wget --no-check-certificate https://github.com/sjqzhang/go…

【Linux基础】Linux发展史

👉系列专栏:【Linux基础】 🙈个人主页:sunny-ll 一、前言 本篇主要介绍Linux的发展历史,这里并不需要我们掌握,但是作为一个合格的Linux学习者与操作者,这些东西是需要了解的,而且…

docker基本命令

一、镜像操作 1、搜索镜像 docker search 仓库名/镜像名 2、下载镜像 docker pull 仓库名/镜像名:标签 若不指明标签,则表示下载最新版本的【标签为latest】 3、查看镜像 docker images 4、创建镜像 docker tag 原仓库/镜像名:原标名 新…

机器人制作开源方案 | 家庭清扫拾物机器人

作者:罗诚、李旭洋、胡旭、符粒楷 单位:南昌交通学院 人工智能学院 指导老师:揭吁菡 在家庭中我们有时无法到一些低矮阴暗的地方进行探索,比如茶几下或者床底下,特别是在部分家庭中,如果没有及时对这些阴…

【网络安全】2023年堡垒机品牌大全

随着大家网络安全意识的增加,随着国家等保政策的严格执行,越来越多的企业开始采购堡垒机。这里就给大家总结了部分堡垒机品牌,让大家参考参考。 2023年堡垒机品牌大全 1、行云堡垒 2、JumpServer 3、安恒 4、骞云 5、齐治 6、阿里云 …

【应用层协议】HTTPS的加密流程

文章目录 1. 认识HTTPS2. 密文3. HTTPS加密流程3.1 对称加密3.2 非对称加密3.3 证书 1. 认识HTTPS HTTPS(超文本传输协议安全)也是一个应用层协议,它是在HTTP协议的基础上引入了一个加密层。 也就是HTTP协议传输文本的方式是明文,…

【Docker Compose】Docker Compose 的安装,使用以及实现微服务集群的部署

文章目录 前言:Docker 部署存在的问题一、 初识 Docker Compose1.1 什么是 Docker Compose1.2 在 CentOS 上安装 Docker Compose 二、深入了解 Docker Compose 文件2.1 Docker Compose 文件概述2.2 Docker Compose 文件详解2.3 示例:编写 Docker Compose…

Flutter AI五子棋

前言 在上一篇文章中,讲解了如何实现双人在本地对战的五子棋,但是只有一个人的时候就不太好玩,同时博主也没有把五子棋相关的文章写过瘾。那么这篇文章,我们来实现一个功能更加丰富的五子棋吧!在设计五子棋的算法方面&…

mysql5.7停止维护时间

mysql5.7将于2023年10月停止官网支持和更新;老项目要准备升级,新项目的mysql必须是mysql8.0(2023-10) 官方升级咨询地址 oracle官方升级咨询地址https://go.oracle.com/LP116153?elq_mid247718&sh1518132002061316121320310…

vue、vuex状态管理

使用步骤: 1、安装vuex 口诀:“233”、“344” 数字分别对应,“vue版本,vue 路由版本、vuex 版本”。 所以这里了使用vuex3版本: yarn add vuex3 2、创建仓库文件 编写如下: // 这个文件用于存放vuex的…

JAVA面经整理(7)

一)什么是AQS? 1)AQS也被称之为是抽象同步队列,它是JUC包底下的多个组件的底层实现,Lock,CountDownLatch和Semphore底层都使用到了AQS AQS的核心思想就是给予一个等待队列和同步状态来实现的,它的内部使用一个先进先出…

机器视觉工程师努力工作确实不一定涨工资,但是努力工作,确实有很大可能涨工资

机器视觉工程师努力工作确实不一定涨工资,但是努力工作,确实有很大可能涨工资 其实在我们机器视觉工程张薪资方面,正常是一年两次调整周期。

arm 汇编基础指令

实现1-100求和 .text .globl _start_start:mov r0, #1 i&#xff0c;i1mov r1, #100 条件变量i<100mov r2, #0 sumLoop: 循环cmp r0,r1 比较r0和r1的大小bhi stop 当r0>r1时&#xff0c;跳到stop标签a…

Android 中级控件

目录 一、图形定制1.1 图形Drawable1.2 形状图形1.3 状态列表图形 二、选择按钮2.1 复选框2.2 开关按钮2.3 单选按钮 三、文本输入3.1 编辑框3.2 焦点变更监听器3.3 文本变化监听器 四、对话框4.1 提醒对话框4.2 日期对话框4.3 时间对话框 一、图形定制 1.1 图形Drawable ~~~~…

苹果签名有多少种类之TF签名(TestFlight签名)是什么?优势是什么?什么场合需要应用到?

&#xff08;一&#xff09;TestFlight 能够让您&#xff1a;邀请内部和外部的测试人员为应用程序提供反馈。 跟踪应用程序在测试过程中发现的 bug 和用户体验问题。 收集 Crash 报告&#xff0c;了解应用程序在真实设备上的运行状况。 要使用 TestFlight&#xff0c;您可以按照…