欢迎关注『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 目标追踪任务的一般步骤
-
目标初始化:首先要在视频序列的第一帧中检测和识别目标,并为目标分配唯一的ID。
-
目标预测:在之后的视频帧中,目标追踪算法会使用目标在上一帧中的位置和运动信息,对目标在当前帧的位置进行预测。
-
目标检测:使用目标检测或特征匹配技术检测当前帧中的目标位置。常用方法有区域匹配、相关滤波器、深度学习。
-
目标关联:检测到当前帧中的目标位置以后,要将其与之前帧中的目标进行关联,以保持目标的一致性。
-
后处理: 通过滤波或者平滑处理,可以减少噪声或者不稳定性,并提高追踪的准确性和稳定性。
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 压缩包,可能会缺一些模块。这是因为项目中包含的子项目往往是一个链接,并没有直接放到本项目中管理维护,所以下载的 压缩包并不包含子项目的源码。
- 默认 yolov5文件夹下内容是空的,需要点击编号(yolov5@******)下载yolov5源码放在yolov5目录下。
- 如果从原始项目地址 [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
# torchreid
Cython
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_THRES
confidence threshold
--iou-thres IOU_THRES
NMS 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_THICKNESS
bounding 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