yolov11+bytetrack的目标跟踪实现

目录

yolov11介绍——实时端到端物体检测

概述

主要特征

支持的任务和模式

性能指标

总结

ByteTrack: Multi-Object Tracking by Associating Every Detection Box

1. Motivation

2. BYTE

3. ByteTrack

         4.具体代码

UI界面设计

历史记录

5.完整代码实现+UI界面


 

yolov11介绍——实时端到端物体检测

概述

 

YOLO11 是 Ultralytics YOLO 系列实时物体检测器的最新版本,重新定义了在尖端准确度、速度和效率方面的可能性。在前几代 YOLO 版本的显著进步基础上,YOLO11 在架构和训练方法上引入了重大改进,使其成为广泛计算机视觉任务的灵活选择。

 

主要特征

        增强特征提取:YOLO11 使用了改进的主干和颈部架构,这增强了特征提取能力,以实现更精确的物体检测和复杂任务的执行。

        优化以提高效率和速度:YOLO11 引入了精简的架构设计和优化的训练管道,提供更快的处理速度,并保持了准确性与性能之间的最佳平衡。

        参数更少,精度更高:随着模型设计的改进,YOLO11m 在 COCO 数据集上的平均精度(mAP)更高,同时比 YOLOv8m 使用的参数减少了 22%,使其在保持高精度的同时计算效率更高。

        适应跨环境:YOLO11 可以无缝部署在各种环境中,包括边缘设备、云平台以及支持 NVIDIA GPU 的系统,确保最大程度的灵活性。

        支持的任务范围广泛:无论是对象检测、实例分割、图像分类、姿态估计,还是定向对象检测(OBB),YOLO11 都旨在应对多样化的计算机视觉挑战

支持的任务和模式

        YOLO11 在 YOLOv8 引入的多功能模型系列基础上构建,提供了针对各种计算机视觉任务增强的支持:

        这张表格提供了 YOLO11 模型变体的概览,展示了它们在特定任务中的适用性以及与推理、验证、训练和导出等操作模式的兼容性。这种灵活性使 YOLO11 适用于计算机视觉的广泛应用,从实时检测到复杂的分割任务。

性能指标

总结

Ultralytics YOLO11 相比于之前的版本,关键的改进有哪些?
        增强特征提取:YOLO11 使用了改进的主干和颈部架构,增强了特征提取能力,从而实现更精确的物体检测。
        优化效率与速度:精简的建筑设计和优化的训练管道在保持准确性和性能平衡的同时,提供更快的处理速度。
        参数更少,精度更高:YOLO11m 在 COCO 数据集上使用比 YOLOv8m 少 22% 的参数实现了更高的平均精度(mAP),使其在保持高精度的同时计算效率更高。
        适应不同环境:YOLO11 可以部署在各种环境中,包括边缘设备、云平台以及支持 NVIDIA GPU 的系统。
        支持的任务范围广泛:YOLO11 支持多种计算机视觉任务,包括对象检测、实例分割、图像分类、姿态估计和定向对象检测(OBB)。

ByteTrack: Multi-Object Tracking by Associating Every Detection Box

沿着多目标跟踪(MOT)中tracking-by-detection的范式,我们提出了一种简单高效的数据关联方法BYTE。 利用检测框和跟踪轨迹之间的相似性,在保留高分检测结果的同时,从低分检测结果中去除背景,挖掘出真正的物体(遮挡、模糊等困难样本),从而降低漏检并提高轨迹的连贯性。BYTE能轻松应用到9种state-of-the-art的MOT方法中,并取得1-10个点不等的IDF1指标的提升。基于BYTE我们提出了一个跟踪方法ByteTrack,首次以30 FPS的运行速度在MOT17上取得80.3 MOTA,77.3 IDF1和63.1 HOTA,目前位居MOTChallenge榜单第一。我们还在开源代码中加入了将BYTE应用到不同MOT方法中的教程以及ByteTrack的部署代码。

Paper: http://arxiv.org/abs/2110.06864

 

纵轴是MOTA,横轴是FPS,圆的半径代表IDF1的相对大小


1. Motivation

Tracking-by-detection是MOT中的一个经典高效的流派,通过相似度(位置、外观、运动等信息)来关联检测框得到跟踪轨迹。由于视频中场景的复杂性,检测器无法得到完美的检测结果。为了处理true positive/false positive的trade-off,目前大部分MOT方法会选择一个阈值,只保留高于这个阈值的检测结果来做关联得到跟踪结果,低于这个阈值的检测结果直接丢弃。但是这样做合理吗?答案是否定的。黑格尔说过:“存在即合理。”低分检测框往往预示着物体的存在(例如遮挡严重的物体)。简单地把这些物体丢弃会给MOT带来不可逆转的错误,包括大量的漏检和轨迹中断,降低整体跟踪性能。

2. BYTE

为了解决之前方法丢弃低分检测框的不合理性,我们提出了一种简单、高效、通用的数据关联方法BYTE (each detection box is a basic unit of the tracklet, as byte in computer program)。直接地将低分框和高分框放在一起与轨迹关联显然是不可取的,会带来很多的背景(false positive)。BYTE将高分框和低分框分开处理,利用低分检测框和跟踪轨迹之间的相似性,从低分框中挖掘出真正的物体,过滤掉背景。整个流程如下图所示:

(1)BYTE会将每个检测框根据得分分成两类,高分框和低分框,总共进行两次匹配。

(2)第一次使用高分框和之前的跟踪轨迹进行匹配。

(3)第二次使用低分框和第一次没有匹配上高分框的跟踪轨迹(例如在当前帧受到严重遮挡导致得分下降的物体)进行匹配。

(4)对于没有匹配上跟踪轨迹,得分又足够高的检测框,我们对其新建一个跟踪轨迹。对于没有匹配上检测框的跟踪轨迹,我们会保留30帧,在其再次出现时再进行匹配。

我们认为,BYTE能work的原因是遮挡往往伴随着检测得分由高到低的缓慢降低:被遮挡物体在被遮挡之前是可视物体,检测分数较高,建立轨迹;当物体被遮挡时,通过检测框与轨迹的位置重合度就能把遮挡的物体从低分框中挖掘出来,保持轨迹的连贯性。

 

3. ByteTrack

ByteTrack使用当前性能非常优秀的检测器YOLOX得到检测结果。在数据关联的过程中,和SORT一样,只使用卡尔曼滤波来预测当前帧的跟踪轨迹在下一帧的位置,预测的框和实际的检测框之间的IoU作为两次匹配时的相似度,通过匈牙利算法完成匹配。这里值得注意的是我们没有使用ReID特征来计算外观相似度:

(1)第一点是为了尽可能做到简单高速,第二点是我们发现在检测结果足够好的情况下,卡尔曼滤波的预测准确性非常高,能够代替ReID进行物体间的长时刻关联。实验中也发现加入ReID对跟踪结果没有提升。

(2)如果需要引入ReID特征来计算外观相似度,可以参考我们开源代码中将BYTE应用到JDE,FairMOT等joint-detection-and-embedding方法中的教程。

(3)ByteTrack只使用运动模型没有使用外观相似度能在MOT17,20取得高性能的本质原因是MOT数据集的运动模式比较单一

4.具体代码

UI界面设计

 

历史记录

 

 

5.完整代码实现+UI界面

视频,笔记和代码,以及注释都已经上传网盘,放在主页置顶文章

 

### 将YOLOv8与ByteTrack集成 为了实现YOLOv8与ByteTrack的有效结合,可以按照如下方法操作: #### 安装依赖库 确保已安装必要的Python包来支持YOLOv8和ByteTrack的功能。通常情况下,这涉及到安装`ultralytics`以及其他可能需要的计算机视觉库。 ```bash pip install ultralytics bytetrack ``` #### 导入所需模块并初始化模型 加载YOLOv8预训练权重文件以及配置ByteTrack参数设置。这里假设已经下载好了相应的YOLOv8模型文件(如`yolov8s.onnx`) 和 ByteTrack所需的资源。 ```python from ultralytics import YOLO import cv2 from byte_tracker import BYTETracker # 假定这是处理跟踪逻辑的一个类 # 初始化YOLOv8对象检测器 model = YOLO('path/to/yolov8_model.onnx') # 创建BYTETracker实例用于多目标跟踪 byte_tracker = BYTETracker(frame_rate=30) # 设置帧率为每秒30帧或其他适当值 ``` #### 图像读取与预测 对于每一帧视频数据或者静态图片执行目标检测,并获取边界框信息作为输入传递给ByteTrack进行轨迹关联计算。 ```python def process_frame(image_path): image = cv2.imread(image_path) # 执行YOLOv8的目标检测任务 detections = model.predict(image)[0].boxes.data.tolist() online_targets = [] if len(detections) > 0: track_results = byte_tracker.update(np.array(detections), image.shape[:2]) for t in track_results: bbox, id_, score = t.tlbr.astype(int).tolist(), int(t.track_id), float(t.score) online_targets.append((bbox, id_)) # 绘制矩形边框标记被识别到的对象及其ID编号 label = f'ID-{id_}' color = (0, 255, 0) thickness = 2 cv2.rectangle(image, tuple(bbox[:2]), tuple(bbox[2:]), color=color, thickness=thickness) cv2.putText(image, text=label, org=(bbox[0], max(0,bbox[1]-10)), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=.5, color=color, thickness=thickness//2) return image, online_targets ``` 此部分代码展示了如何利用YOLOv8完成物体定位后,再通过调用`update()`函数将这些位置更新至ByteTrack中以便持续追踪多个移动实体[^1]。 #### 结果展示或保存 最后一步是对经过上述流程处理后的图像做进一步的操作——要么直接显示出来供即时查看;要么将其序列化存储起来形成完整的监控录像片段。 ```python processed_image, _ = process_frame("input/image_or_video_frame.png") cv2.imshow('Processed Frame', processed_image) cv2.waitKey(0) cv2.destroyAllWindows() ``` 以上就是YOLOv8同ByteTrack相结合的一种典型做法概述[^4]。
评论 40
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值