当前位置: 首页 > news >正文

【YOLO5 项目实战】(6)YOLO5+StrongSORT 目标追踪

欢迎关注『youcans动手学模型』系列
本专栏内容和资源同步到 GitHub/youcans
【YOLO5 项目实战】(1)YOLO5 环境配置与检测
【YOLO5 项目实战】(2)使用自己的数据集训练目标检测模型


【YOLO5 项目实战】(6)YOLO5+StrongSORT 目标追踪

    • 1. 目标追踪任务
      • 1.1 目标追踪任务的一般步骤
      • 1.2 单目标跟踪算法
      • 1.3 DeepSORT 多目标跟踪算法
      • 1.4 StrongSORT 多目标跟踪算法
    • 2. YOLOv5_StrongSORT 安装与配置
      • 2.1 YOLOv5_StrongSORT 简介
      • 2.2 下载 YOLOv5_StrongSORT
      • 2.3 安装项目依赖
    • 3. YOLO5_StrongSORT 目标追踪
      • 3.1 运行帮助
      • 3.2 运行推理(目标追踪)

上节介绍 YOLOv5 目标检测任务,本节详细介绍 YOLOv5 + StrongSORT 算法目标追踪任务。

YOLOv5_StrongSORT 是一个基于 YOLOv5 的两阶段目标追踪算法,用于实现视频中的目标检测和追踪。先使用 Yolov5 模型逐帧进行目标检测,再使用 StrongSORT 对目标检测结果进行匹配来实现目标跟踪。可以帮助用户快速地在本地或者云端上实现视频目标检测和跟踪。


1. 目标追踪任务

目标检测任务要求识别图像或视频中的特定对通过在目标周围绘制边界框(Bounding Box)来标记目标位置。

目标追踪任务在目标检测任务的基础上,要求从视频序列中连续地跟踪特定目标的运动轨迹。目标追踪任务不仅要从图像中检测目标位置,还要在时间上保持目标的一致性。

目标追踪的应用非常广泛,例如视频监控、自动驾驶、视频分析、虚拟现实等。


1.1 目标追踪任务的一般步骤

  1. 目标初始化:首先要在视频序列的第一帧中检测和识别目标,并为目标分配唯一的ID。

  2. 目标预测:在之后的视频帧中,目标追踪算法会使用目标在上一帧中的位置和运动信息,对目标在当前帧的位置进行预测。

  3. 目标检测:使用目标检测或特征匹配技术检测当前帧中的目标位置。常用方法有区域匹配、相关滤波器、深度学习。

  4. 目标关联:检测到当前帧中的目标位置以后,要将其与之前帧中的目标进行关联,以保持目标的一致性。

  5. 后处理: 通过滤波或者平滑处理,可以减少噪声或者不稳定性,并提高追踪的准确性和稳定性。


1.2 单目标跟踪算法

  • MedianFlow: 基于KLT(Kanade-Lucas-Tomasi)光流和匹配的简单单目标跟踪器。
  • KCF(Kernelized Correlation Filters): 使用核相关滤波器来实现快速的单目标跟踪。
  • TLD(Tracking-Learning-Detection): 结合目标检测和跟踪,能够在目标丢失时重新检测目标。
  • MIL(Multi Instance Learning): 采用多实例学习方法跟踪目标。

1.3 DeepSORT 多目标跟踪算法

  • SORT(Simple Online and Real Time Tracking): 在多目标跟踪中,通过卡尔曼滤波和匈牙利算法进行目标关联。

  • DeepSORT(Deep Learning-based SORT)算法是基于深度学习的多目标跟踪算法, 在SORT的基础上加入深度学习特征,提高目标关联的准确性和鲁棒性。主要步骤如下:
    (1)目标检测:在每一帧中,使用目标检测算法(如YOLO、Faster R-CNN、SSD等)来检测图像中的目标,并得到目标的边界框(bounding box)和类别信息。
    (2)边界框预测:使用卡尔曼滤波器对检测到的对象进行边界框预测,生成未来的位置估计。
    (3)深度外观描述符:对于每个检测到的目标,使用预训练的深度学习模型(如ResNet、MobileNet等)来提取目标区域的特征向量。这些特征向量能够表示目标的语义信息和视觉特征。
    (4)IOU匹配:使用IOU计算检测到的边界框与预测边界框的相似度,进行匹配。
    (5)级联匹配:在时间维度上进行级联匹配,确保长时间的对象跟踪稳定性。
    (6)结果输出:结合卡尔曼滤波和深度外观描述符的结果,生成最终的对象跟踪结果。


1.4 StrongSORT 多目标跟踪算法

StrongSORT 算法在 DeepSORT的基础上进行改进,通过在特征提取、运动信息处理和成本矩阵计算等方面的改进,提高了多目标跟踪的性能。StrongSORT++则通过引入AFLink和GSI技术,进一步优化了跟踪的准确性和鲁棒性。这些改进使得StrongSORT能够在复杂的场景中更有效地处理遮挡、目标丢失和重新出现等问题,从而实现最先进的跟踪性能(SOTA)。

StrongSORT 算法对 DeepSORT 的主要改进包括:
(1)BoT(Bag of Tricks): 改进了外观特征提取器,它使用深度学习技术来提取目标的视觉特征,这些特征对于区分和识别不同的目标至关重要。
(2)EMA(Exponential Moving Average): 通过引入惯性项来平滑特征更新,EMA有助于减少噪声和异常值的影响,使得跟踪更加稳定。
(3)NSA(Neural Network-based Appearance): 这是一种用于非线性运动的卡尔曼滤波器,它通过神经网络来预测目标的状态,以适应更复杂的运动模式。
(4)MC(Motion Compensation): 包括运动信息的成本矩阵,这有助于在匹配过程中更好地考虑目标的运动信息,提高匹配的准确性。
(5)ECC(External Camera Calibration): 摄像机运动更正,它允许算法校正摄像机的外部参数,从而提高跟踪的准确性。
(6)woC(Without Cascading): 不采用级联算法,这可能意味着算法避免了在不同阶段使用不同复杂度的检测器,从而提高了处理速度。

StrongSORT++是StrongSORT的一个变体,它进一步引入了:
(1)AFLink(Association Graph Linking): 这是一种仅使用运动信息的全局链接方法,它在离线处理阶段用于改进跟踪结果。
(2)GSI(Gaussian Process-based Interpolation): 通过高斯过程对检测误差进行内插,这是一种后处理技术,用于进一步提高跟踪的精度。

StrongSORT 下载地址:
论文地址:https://arxiv.org/abs/2202.13514
代码地址:https://github.com/dyhBUPT/StrongSORT

在这里插入图片描述


2. YOLOv5_StrongSORT 安装与配置

2.1 YOLOv5_StrongSORT 简介

YOLOv5_StrongSORT 是一个基于 YOLOv5 的两阶段目标追踪算法,用于实现视频中的目标检测和追踪。

  • 先使用 YOLOv5/YOLOv7/YOLOv8 作为目标检测器,逐帧进行目标检测,具有很高的检测速度和精度。

  • 再使用 StrongSORT追踪算法,利用OSNet模型进行特征匹配,实现对视频中物体的精准识别和稳定跟踪。

    • StrongSORT模块通过结合运动信息和外观特征,增强了物体在帧间的连续性,即便是在快速移动或遮挡的情况下也能保持良好的跟踪效果。
    • OSNet行人重识别模型是深层特征提取网络,确保了对个体身份的准确识别,即使在光照变化和姿态变换等条件下也是如此。

2.2 下载 YOLOv5_StrongSORT

项目下载地址:

  • 原始项目地址:Github-Yolov5_StrongSORT_OSNet
  • 推荐下载地址:Github-StrongSORT-YOLO

方法一:克隆 repo。

git clone https://github.com/bharath5673/StrongSORT-YOLO

方法二:直接从 GitHub 网页下载压缩文件,如下图所示。
解压到 Python 项目文件夹,如"C:\Python|PythonProjects\YOLOv5_StrongSORT"。

注意:直接下载 zip 压缩包,可能会缺一些模块。这是因为项目中包含的子项目往往是一个链接,并没有直接放到本项目中管理维护,所以下载的 压缩包并不包含子项目的源码。

  1. 默认 yolov5文件夹下内容是空的,需要点击编号(yolov5@******)下载yolov5源码放在yolov5目录下。
  2. 如果从原始项目地址 [Github-Yolov5_StrongSORT_OSNet] 下载,strong_sort/deep/reid 目录也是空的,需要另外下载 torchreid 并放到 strong_sort/deep/reid。如果从推荐下载地址[Github-StrongSORT-YOLO] 下载,则 strong_sort/deep/reid 目录中已经包括 torchreid,无需另外下载。

在这里插入图片描述

在下载的 YOLOv5 项目中,包括了项目说明文档:Readme.md。

在这里插入图片描述


2.3 安装项目依赖

本项目中的 requirements.txt 文件已经详细列出了所需的库及版本。

# pip install -r requirements.txt# base ----------------------------------------matplotlib>=3.2.2
numpy>=1.18.5
opencv-python>=4.1.2
Pillow>=7.1.2
PyYAML>=5.3.1
requests>=2.23.0
scipy>=1.4.1
torch>=1.7.0
torchvision>=0.8.1
tqdm>=4.41.0# plotting ------------------------------------pandas>=1.1.4
seaborn>=0.11.0# deep_sort -----------------------------------easydict# torchreidCython
h5py
six
tb-nightly
future
yacs
gdown
flake8
yapf
isort==4.3.21
imageio

可以在 Pycharm 的控制台(terminal),输入脚本指令来安装所需的库。

也可以通过 Anaconda 或 Miniconda 来安装,注意要安装到所选择的 Python 环境。


3. YOLO5_StrongSORT 目标追踪

3.1 运行帮助

在 Github-StrongSORT-YOLO 项目中提供了 YOLOv5 和 YOLOv7 两种检测器。本文只讨论使用 YOLOv5 检测器。

从控制台运行 track_v5.py 查看帮助:

python track_v5.py -h

(torch) PS C:\Python\PythonProjects\YOLOv5_StrongSORT> python .\track_v5.py -h
usage: track_v5.py [-h] [--yolo-weights YOLO_WEIGHTS [YOLO_WEIGHTS ...]] [--strong-sort-weights STRONG_SORT_WEIGHTS] [--config-strongsort CONFIG_STRONGSORT] [--source SOURCE] [--imgsz IMGSZ [IMGSZ ...]][--conf-thres CONF_THRES] [--iou-thres IOU_THRES] [--max-det MAX_DET] [--device DEVICE] [--show-vid] [--save-txt] [--save-conf] [--save-crop] [--save-vid] [--nosave] [--count] [--draw][--classes CLASSES [CLASSES ...]] [--agnostic-nms] [--augment] [--visualize] [--update] [--project PROJECT] [--name NAME] [--exist-ok] [--line-thickness LINE_THICKNESS] [--hide-labels] [--hide-conf][--hide-class] [--half] [--dnn]optional arguments:-h, --help            show this help message and exit--yolo-weights YOLO_WEIGHTS [YOLO_WEIGHTS ...]model.pt path(s)--strong-sort-weights STRONG_SORT_WEIGHTS--config-strongsort CONFIG_STRONGSORT--source SOURCE       file/dir/URL/glob, 0 for webcam--imgsz IMGSZ [IMGSZ ...], --img IMGSZ [IMGSZ ...], --img-size IMGSZ [IMGSZ ...]inference size h,w--conf-thres CONF_THRESconfidence threshold--iou-thres IOU_THRESNMS IoU threshold--max-det MAX_DET     maximum detections per image--device DEVICE       cuda device, i.e. 0 or 0,1,2,3 or cpu--show-vid            display tracking video results--save-txt            save results to *.txt--save-conf           save confidences in --save-txt labels--save-crop           save cropped prediction boxes--save-vid            save video tracking results--nosave              do not save images/videos--count               display all MOT counts results on screen--draw                display object trajectory lines--classes CLASSES [CLASSES ...]filter by class: --classes 0, or --classes 0 2 3--agnostic-nms        class-agnostic NMS--augment             augmented inference--visualize           visualize features--update              update all models--project PROJECT     save results to project/name--name NAME           save results to project/name--exist-ok            existing project/name ok, do not increment--line-thickness LINE_THICKNESSbounding box thickness (pixels)--hide-labels         hide labels--hide-conf           hide confidences--hide-class          hide IDs--half                use FP16 half-precision inference--dnn                 use OpenCV DNN for ONNX inference

其中:

[–yolo-weights] 用于指定YOLOv5 权重文件的路径,默认路径为:‘weights/yolov5n.pt’
[–strong-sort-weights] 用于指定OSNet权重文件的路径,默认路径为:‘weights/osnet_x0_25_msmt17.pt’
[–config-strongsort] 用于指定StrongSort配置文件的路径,默认路径为:‘strong_sort/configs/strong_sort.yaml’
[–source] 用于指定输入视频文件的路径,默认路径为:‘inference/images…’
[–output OUTPUT] 用于指定输出结果文件的路径,默认路径为:‘inference/output’
[–save-vid] 用于指定是否保存跟踪结果视频文件
[–classes] 用于指定跟踪类别

track_v5.py 默认不保存视频,只能在控制台查看输出结果。如果要保存视频,可以指定–save-vid参数,使用命令 python track_v5.py --save-vid。


3.2 运行推理(目标追踪)

将测试视频保存在文件夹 ‘inference/images/test_person.mp4’,YOLOv5 权重文件保存在文件夹 ‘weights/yolov5n.pt’,OSNet权重文件保存在‘weights/osnet_x0_25_msmt17.pt’。

从控制台运行 track.py 对测试视频进行目标追踪:

python track_v5.py --source ‘inference/images/test_person.mp4’ --save-vid

运行结果如下:

(torch) PS C:\Python\PythonProjects\YOLOv5_StrongSORT> python track_v5.py --source 'inference/images/test_person.mp4' --save-vid
track_v5: yolo_weights=C:\Python\PythonProjects\YOLOv5_StrongSORT\weights\yolov5n.pt, strong_sort_weights=C:\Python\PythonProjects\YOLOv5_StrongSORT\weights\osnet_x0_25_msmt17.pt, config_strongsort=strong_sort/configs/strong_sort.yaml, source=inference/images/test_person.mp4, imgsz=[640, 640], conf_thres=0.5, iou_thres=0.5, max_det=1000, device=, show_vid=False, save_txt=False, save_conf=False, save_crop=False, save_vid=True, nosave=False, count=False, draw=False, classes=None, agnostic_nms=False, augment=False, visualize=False, update=False, project=inference\images, name=exp, exist_ok=False, line_thickness=2, hide_labels=False, hide_conf=False, hide_class=False, half=False, dnn=False
YOLOv5  2024-8-21 Python-3.8.19 torch-2.3.1+cu121 CUDA:0 (NVIDIA GeForce RTX 3060, 12288MiB)Fusing layers... 
YOLOv5n summary: 213 layers, 1867405 parameters, 0 gradients, 4.5 GFLOPs
Model: osnet_x0_25
- params: 203,568
- flops: 82,316,000
Successfully loaded pretrained weights from "C:\Python\PythonProjects\YOLOv5_StrongSORT\weights\osnet_x0_25_msmt17.pt"
** The following layers are discarded due to unmatched keys or layer size: ['classifier.weight', 'classifier.bias']
video 1/1 (1/443) C:\Python\PythonProjects\YOLOv5_StrongSORT\inference\images\test_person.mp4: 384x640 12 persons, 1 bicycle, Done. YOLO:(0.062s), StrongSORT:(0.049s)
video 1/1 (2/443) C:\Python\PythonProjects\YOLOv5_StrongSORT\inference\images\test_person.mp4: 384x640 12 persons, 2 bicycles, Done. YOLO:(0.016s), StrongSORT:(0.062s)...
video 1/1 (443/443) C:\Python\PythonProjects\YOLOv5_StrongSORT\inference\images\test_person.mp4: 384x640 13 persons, Done. YOLO:(0.009s), StrongSORT:(0.044s)
Speed: 1.2ms pre-process, 10.1ms inference, 1.3ms NMS, 36.5ms strong sort update per image at shape (1, 3, 640, 640)
Results saved to inference\images\exp

目标追踪结果如下图所示,追踪视频默认保存在文件夹 ‘inference/images/exp/test_person.mp4’。

在这里插入图片描述

如果要获得追踪结果的数据文件,可以在运行 track.py 时加入 “–save-txt” 选项:

python track_v5.py --source ‘inference/images/test_person.mp4’ --save-vid --save-txt

就可以得到 追踪结果数据文件 ‘inference/images/exp/test_person. txt’。,内容如下。

3 0 1 245 794 113 280 -1 -1 -1 -1 
3 0 2 799 235 66 188 -1 -1 -1 -1 
3 0 3 1648 116 68 167 -1 -1 -1 -1 
...
443 0 48 278 590 107 256 -1 -1 -1 -1 
443 0 49 1410 840 137 239 -1 -1 -1 -1 

追踪结果数据文件的每行有 10列数据,依次是:帧序号 frame_idx, 目标序号 identity, 边界框参数 bbox_left, bbox_top, bbox_w, bbox_h, 和标志位 -1, -1, -1, -1。


【本节完】


版权声明:
欢迎关注『youcans动手学模型』系列
转发请注明原文链接:
【YOLO5 项目实战】(6)YOLO5+StrongSORT 目标追踪
Copyright 2024 youcans, XUPT
Crated:2024-08-21


相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 再学C++(一):C++中类与结构体的区别
  • 【C++ Primer Plus习题】2.6
  • 模型优化之剪枝
  • libevent之android与鸿蒙编译过程
  • H3C M-LAG与双活网关接口结合应用场景实验
  • 数据结构-链表-第二天
  • elasticsearch的高亮查询三种模式查询及可能存在的问题
  • 数据结构----双向链表
  • linux笔记1
  • 删除 Docker 容器的日志文件
  • 线程通信【详解】
  • 使用DOM破坏启动xss
  • 机器学习-识别手写数字
  • 网络编程day8
  • 系统编程 网络 基于tcp协议
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • AHK 中 = 和 == 等比较运算符的用法
  • const let
  • CSS相对定位
  • Java比较器对数组,集合排序
  • nginx 负载服务器优化
  • Redis中的lru算法实现
  • text-decoration与color属性
  • webpack+react项目初体验——记录我的webpack环境配置
  • XML已死 ?
  • 阿里云购买磁盘后挂载
  • 从 Android Sample ApiDemos 中学习 android.animation API 的用法
  • 看图轻松理解数据结构与算法系列(基于数组的栈)
  • 删除表内多余的重复数据
  • 微信小程序--------语音识别(前端自己也能玩)
  • 异步
  • 用Node EJS写一个爬虫脚本每天定时给心爱的她发一封暖心邮件
  • ​io --- 处理流的核心工具​
  • #define MODIFY_REG(REG, CLEARMASK, SETMASK)
  • #宝哥教你#查看jquery绑定的事件函数
  • (2024)docker-compose实战 (8)部署LAMP项目(最终版)
  • (LeetCode 49)Anagrams
  • (二)换源+apt-get基础配置+搜狗拼音
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (附源码)springboot优课在线教学系统 毕业设计 081251
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)Mysql的优化设置
  • (转)德国人的记事本
  • (转)利用ant在Mac 下自动化打包签名Android程序
  • .locked1、locked勒索病毒解密方法|勒索病毒解决|勒索病毒恢复|数据库修复
  • .NET Framework 3.5安装教程
  • .NET 直连SAP HANA数据库
  • .Net6 Api Swagger配置
  • .Net开发笔记(二十)创建一个需要授权的第三方组件
  • .NET中的Event与Delegates,从Publisher到Subscriber的衔接!
  • [20150629]简单的加密连接.txt
  • [Android]竖直滑动选择器WheelView的实现
  • [bzoj1912]异象石(set)
  • [CSS3备忘] transform animation 等
  • [GXYCTF2019]禁止套娃1