yolov8 strongSORT多目标跟踪工具箱BOXMOT

1 引言

多目标跟踪MOT项目在Github中比较完整有:BOXMOT , 由mikel brostrom提供。在以前的版本中,有yolov5+deepsort(版本v3-v5), yolov8+strongsort(版本v6-v9),直至演变到v10,名称BOXMOT。
BOXMOT提供三种对象检测器:yolov8, yolo_nas, yolox; 支持多个跟踪器:BoTSORT, DeepOCSORT, OCSORT, Hybridsort, ByteTrack, StrongSORT 。以前常见的DeepSort在此由增强型StrongSORT替代。

2 安装BOXMOT

boxmot安装
安装环境:Ubuntu18.04,python 3.8,已建有虚拟环境。

将boxmot从github克隆到本地,建立yolo_tracking目录:

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

第三个命令pip install -v -e. 相当于 python setup.py develop,即根据setup.py执行安装,其中“develop”参数将软件包以开发模式安装到Python环境中,以便在开发过程中能够即时反映源代码的修改。
完成BOXMOT安装后,看看yolo_tracking下面有什么:
在这里插入图片描述
图1 yolo_tracking目录
见图1, BOXMOT支持的三个对象检测器定义文件yolonas.py, yolov8.py, yolox.py在examples/detectors目录。跟踪器tracker在boxmot/trackers目录下。 boxmot/appearance目录是tracker所需使用的外观识别REID模块。boxmot/configs为tracker的参数构造文件。boxmot/motion目录是运动预测用Kalman滤波器。
下一步根据需要,安装三个对象检测器。

2.1 安装ultralytics

对象检测器yolov8需要安装ultralytics python库,需注意,BOXMOT适用ultralytics v8.0.146,而最新的版本不适用。
安装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。这样在python程序调试时,可以跟踪到ultralytics模块。为了防止混淆,将examples/track.py和val.py中安装ultralytics语句注释掉:

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

现在,已实现基础对象检测器yolov8的运行环境,可执行跟踪track.py和评估val.py程序。
运行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 

若已下载yolov8s权重文件yolov8s.pt,可在–yolo-model 变量中指定文件路径,若没下载,则track.py根据"yolov8s"自动从网上下载。

2.2 安装yoloNAS

yoloNAS需安装super-gradients:

pip install super-gradients

运行yoloNAS,实现的示例:

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  

BOXMOT使用yoloNAS不能对跟踪对象类进行筛选,而把图像中所有符合COCO数据集类型的对象都提取,大数量目标对跟踪器造成很大负担,运行速度慢。
在yolonas.py的postprocess函数中增加类型过滤:

def postprocess(self, path, preds, im, im0s):results = []for i, pred in enumerate(preds):if pred is None:pred = torch.empty((0, 6))r = Results(path=path,boxes=pred,orig_img=im0s[i],names=self.names)results.append(r)else:pred[:, :4] = ops.scale_boxes(im.shape[2:], pred[:, :4], im0s[i].shape)# filter boxes by classes   ############################################pred = pred[torch.isin(pred[:, 5].cpu(), torch.as_tensor(self.args.classes))]   # added by someoner = Results(path=path,boxes=pred,orig_img=im0s[i],names=self.names)results.append(r)return results

2.3 安装YOLOX

YOLOX官网克隆到本地,产生YOLOX目录。

git clone https://github.com/Megvii-BaseDetection/YOLOX.git

将YOLOX目录下三个子目录:yolox, tools, exps 复制到yolo_tracking,完成YOLOX环境。
实现YOLOX对象检测器的跟踪示例

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

此BOXMOT版本v10.043在使用YOLOX上有限制,从track.py程序下载的权重文件yolox_s仅支持一个类型“person”的对象检测,不支持其他对象检测。从YOLOX Github下载权重文件yolox_s.pth支持COCO数据集的80个类型,这里需要修改:
1 YOLOX官网下载的权重文件yolox_s.pth,80个类型; BOXMOT,track.py下载的yolox_s.pt,1个person类型。在examples/detectors/yolox.py中如下修改:

def __init__(self, model, device, args):self.args = argsself.pt = Falseself.stride = 32  # max stride in YOLOX# model_type one of: 'yolox_n', 'yolox_s', 'yolox_m', 'yolox_l', 'yolox_x'model_type = self.get_model_from_weigths(YOLOX_ZOO.keys(), model)if model_type == 'yolox_n':exp = get_exp(None, 'yolox_nano')else:exp = get_exp(None, model_type)LOGGER.info(f'Loading {model_type} with {str(model)}')# download crowdhuman bytetrack modelsif not model.exists() and model.stem == model_type:LOGGER.info('Downloading pretrained weights...')gdown.download(url=YOLOX_ZOO[model_type + '.pt'],output=str(model),quiet=False)# "yolox_s.pt" 表示num_classes =1,  "yolox_s.pth"表示num_classes = 80。#    boxmot下载的ckpt只处理“person”类型,#     github.com/Megvii-BaseDetection/YOLOX提供的ckpt用于num_classes,可处理多种类型。# needed for bytetrack yolox people models# update with your custom model needsexp.num_classes = 1             self.num_classes = 1elif model.stem == model_type:exp.num_classes = 1self.num_classes = 1_, file_extension = os.path.splitext(str(model))            if file_extension == ".pth":exp.num_classes = 80           self.num_classes = 80if exp.num_classes ==1:    self.img_normal = True  #num_classes = 1,    BOXMOT format: 0.0-1.0else:self.img_normal = False   #num_classes = 80, YOLOX website ckpt format:  0-255 ckpt = torch.load(str(model),map_location=torch.device('cpu'))self.model = exp.get_model()self.model.eval()self.model.load_state_dict(ckpt["model"])self.model = fuse_model(self.model)self.model.to(device)self.model.eval()

这里,对 YoloXStrategy(YoloInterface)类增加类变量:self.num_classes,适应来自不同网站的yolox权重文件。

2 YOLOX官网yolox detector所处理的图像为0-255数据,而BOXMOT yolox detector所处理图像数据为0.0 - 1.0,需要针对不同权重文件对图像输入进行变换。对 YoloXStrategy(YoloInterface)类增加类变量:self.img_normal。

更改yolox.py postprocess

def postprocess(self, path, preds, im, im0s):results = []for i, pred in enumerate(preds):pred = postprocess(pred.unsqueeze(0),  # YOLOX postprocessor expects 3D araryself.num_classes,                                             #  1   num_classes  conf_thre=0.5,              #0.1nms_thre=0.7,            # 0.45class_agnostic=True,   )[0]

更改ultralytics/engine/predictor.py preprocess函数

def preprocess(self, im):"""Prepares input image before inference.Args:im (torch.Tensor | List(np.ndarray)): BCHW for tensor, [(HWC) x B] for list."""not_tensor = not isinstance(im, torch.Tensor)if not_tensor:im = np.stack(self.pre_transform(im))im = im[..., ::-1].transpose((0, 3, 1, 2))  # BGR to RGB, BHWC to BCHW, (n, 3, h, w)im = np.ascontiguousarray(im)  # contiguousim = torch.from_numpy(im)img = im.to(self.device)img = img.half() if self.model.fp16 else img.float()  # uint8 to fp16/32if not_tensor:                                 # -------------------------------------------------------------------------if not self.model.img_normal:return img                          # yolox  num_classes = 80  , img 取值 0-255                                    img /= 255                              # 0 - 255 to 0.0 - 1.0   # yolov8, yolo_nas and yolox  num_classes = 1的ckpt,img 取值 0.0 - 1.0 。return img

注:如果更改BOXMOT中默认的yolox单一类型处理模式,由于对ultralytics/engine/predictor.py preprocess方法做了修改,会涉及到yolov8和yoloNAS,所以:
yolov8: ultralytics/nn/autobackend.py, 类 AutoBackend, 增加类变量 self.img_normal = True
yoloNAS:examples/detectors/yolonas.py, 类 YoloNASStrategy, 增加类变量 self.img_normal = True

当然,如果不改变BOXMOT默认的yolox,则无需改变yolov8和yoloNAS。

对比BOXMOT 默认yolox_s.pt和YOLOX官网yolo_s.pth,两者分别运行val.py

python examples/val.py   \
--yolo-model    examples/weights/yolox_s.pt  \   --tracking-method  deepocsort   \--benchmark  MOT17python examples/val.py   \
--yolo-model    examples/weights/yolox_s.pth  \   --tracking-method  deepocsort   \--benchmark  MOT17

得到如下结果(取MOT17 - FRCNN每个序列的前10帧):

                                  HOTA           MOTA          MOTP          IDF1
yolox_s.pt             68.294         67.268         81.267       81.403   
yolox_s.pth           60.038         52.223         78.765       70.531

这因为yolox_s.pt是针对拥挤行人情况的权重,而yolox_s.pth则适用于COCO各种类型,所以评价指标有提高。

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

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

相关文章

使用asp.net core web api创建web后台,并连接和使用Sql Server数据库

前言:因为要写一个安卓端app,实现从服务器中获取电影数据,所以需要搭建服务端代码,之前学过C#,所以想用C#实现服务器段代码用于测试,本文使用C#语言,使用asp.net core web api组件搭建服务器端&…

BN体系理解——类封装复现

from pathlib import Path from typing import Optionalimport torch import torch.nn as nn from torch import Tensorclass BN(nn.Module):def __init__(self,num_features,momentum0.1,eps1e-8):##num_features是通道数"""初始化方法:param num_features:特征…

产品升级!全球尺度下原核基因组关键基因共进化无标题

微生物是群落型的生存方式,高通量测序时代到来后,掀起了针对微生物群落整体研究的高潮,比如基于功能基因/16S/ITS/扩增子、宏基因组等进行群落多样性分析。但是,我们基于分离培养等方法获得单菌落,针对单菌开展基因组、…

十一、WSGI与Web框架

目录 一、什么是WSGI1.1 WSGI接口的组成部分1.2 关于environ 二、简易的web框架实现2.1 文件结构2.2 在web/my_web.py定义动态响应内容2.3 在html/index.html中定义静态页面内容2.4 在web_server.py中实现web服务器框架2.5 测试 三、让简易的web框架动态请求支持多页面3.1 修改…

Python in Visual Studio Code 2023年10月发布

排版:Alan Wang 我们很高兴地宣布 Visual Studio Code 的 Python 和 Jupyter 扩展于 2023 年 10 月发布! 此版本包括以下公告: Python 调试器扩展更新弃用 Python 3.7 支持Pylint 扩展更换时的 Lint 选项Mypy 扩展报告的范围和守护程序模式G…

mysql面试题36:MySQL的binlog有几种录入格式?分别有什么区别

该文章专注于面试,面试只要回答关键点即可,不需要对框架有非常深入的回答,如果你想应付面试,是足够了,抓住关键点 面试官:MySQL的binlog有几种录入格式?分别有什么区别 MySQL的binlog(二进制日志)是用于记录数据库的更改操作的一种机制,它可以用于数据恢复、数据复…

Java集合(三)--- List接口

文章目录 一、List接口常用实现类的对比二、List接口中的常用方法代码 提示:以下是本篇文章正文内容,下面案例可供参考 一、List接口常用实现类的对比 二、List接口中的常用方法 代码 package com.tyust.edu;import org.junit.Test;import java.util.A…

2023年【危险化学品生产单位安全生产管理人员】及危险化学品生产单位安全生产管理人员模拟考试题

题库来源:安全生产模拟考试一点通公众号小程序 危险化学品生产单位安全生产管理人员考前必练!安全生产模拟考试一点通每个月更新危险化学品生产单位安全生产管理人员模拟考试题题目及答案!多做几遍,其实通过危险化学品生产单位安…

CRMEB多商户商城系统阿里云集群部署教程

注意: 1.所有服务创建时地域一定要选择一致,这里我用的是杭州K区 2.文件/图片上传一定要用类似oss的云文件服务, 本文不做演示 一、 创建容器镜像服务,容器镜像服务(aliyun.com) ,个人版本就可以 先创建一个命名空间 然后创建一个镜像仓库 查看并记录镜像公网地址…

自定义类型:结构体,枚举,联合 (1)

1 结构体的声明 1.1 结构的基础知识 结构是一些值的集合,这些值称为成员变量。结构的每个成员可以是不同类型的变量。 1.2 结构的声明 struct tag { member-list; }variable-list; 例如描述一个学生: struct是结构体关键字,不能省略。 …

运维大数据平台的建设与实践探索

随着企业数字化转型的推进,运维管理面临着前所未有的挑战和机遇。为应对日益复杂且严峻的挑战,数字免疫系统和智能运维等概念应运而生。数字免疫系统和智能运维作为新兴技术,正引领着运维管理的新趋势。数字免疫系统和智能运维都借助大数据运…

同创永益成为英迈首家签约生态伙伴

日前,同创永益已和英迈签署生态运营战略协议,并正式成为英迈全新打造的GTM生态圈的首位签约合作伙伴。双方将携手对“同创数字韧性平台”产品进行一站式联合解决方案的持续整合,并将大力推动该联合解决方案在市场上的进一步拓展。 云原生时代…

vite+vue3+ts中使用require.context | 报错require is not defined | 获取文件夹中的文件名

vitevue3ts中使用require.context|报错require is not defined|获取文件夹中的文件名 目录 vitevue3ts中使用require.context|报错require is not defined|获取文件夹中的文件名一、问题背景二、报错原因三、解决方法 一、问题背景 如题在vitevue3ts中使用required.context时报…

科技资讯|9月新能源汽车零售74.3万辆,充电桩迎来发展高峰

据中国乘联会发布的初步数据,中国 9 月份乘用车市场零售 202.8 万辆,同比增长 6%,环比增 6%。今年以来,我国乘用车市场累计零售 1,524 万辆,同比增长 2%。 乘联会预计,9 月份新能源车市场零售 74.3 万辆&a…

Java架构师系统架构设计资源估算

目录 1 认识资源估算1.1 预估未来发展1.2 资源估算的意义 2 资源估算方法2.1 确定系统目标2.2 并发用户数2.3 指标数据 3 资源估算的经验法则4 资源估算的常见参考数据4.1 带宽估算4.2 nginx估算4.3 tomcat估算4.4 操作系统估算4.5 redis估算4.6 mysql估算 5 并发人数估算5.1 请…

【Unity3D编辑器开发】Unity3D中制作一个可以随时查看键盘对应KeyCode值面板,方便开发

推荐阅读 CSDN主页GitHub开源地址Unity3D插件分享简书地址我的个人博客 大家好,我是佛系工程师☆恬静的小魔龙☆,不定时更新Unity开发技巧,觉得有用记得一键三连哦。 一、前言 在开发中,会遇到要使用监控键盘输入的KeyCode值来执…

Python- socket编程

Python中的socket模块为网络通信提供了基础API,使我们能够在应用程序中实现低级的网络交互。使用socket编程,可以创建TCP、UDP和RAW sockets来进行数据通信。 以下是Python socket 编程的简要概述: 1. 核心概念 Socket: 通信的端点&#x…

分布式事务入门

文章目录 分布式事务问题本地事务分布式事务演示分布式事务问题 理论基础CAP定理一致性可用性分区容错矛盾 BASE理论 SeataSeata的架构部署TC服务微服务集成seata 动手实践XA模式两阶段提交Seata的XA模型实现XA模式 AT模式Seata的AT模型流程梳理脏写问题实现AT模式 TCC模式流程…

github小记(一):清除github在add或者commit之后缓存区

github清除在add或者commit之后缓存区 前言1. 第一步之后想要撤销2. 第二步之后想要撤销a. 改变一下rrr.txt的内容b. 想提交本地文件的test文件夹c. 我后悔了突然不想提交了 前言 github自用 一般github上代码提交顺序: 第一步: git add . or git ad…

0基础学习VR全景平台篇 第107篇:全景图调色和细节处理(上,地拍)

上课!全体起立~ 大家好,欢迎观看蛙色官方系列全景摄影课程! 今天教给大家的课程是地拍全景图调色和细节处理,下面我们就开始吧! 1.把照片快速导入LR软件 选择【图库】模块 打开软件后,点击【导入】按…