【免费源码】使用YOLOv11和OCSort进行多类别目标跟踪。(基于ncnn框架,c++实现)
yolov11_ocsort_ncnn
使用YOLOv11和OCSort进行多类别目标跟踪。(基于ncnn框架,c++实现)
本项目开源自:https://github.com/zhahoi/yolov11_ocsort_ncnn.git
写在前面
之前尝试过使用YOLOv11和DeepSort实现行人跟踪,亲自实现后发现Deepsort这个算法的局限性还是挺大的。(yolov11_deepsort_ncnn)一方面使用DeepSort进行目标追踪需要另外训练出一个模型,增加推理时间;另一方面,只能跟踪单类别的目标。老实说,实际应用选择该算法应该比较少。
最近在网上检索合适的目标跟踪算法时,发现了一个除了ByteTracker
和DeepSort
另外的一种目标跟踪算法。以下是三者算法优略比较(来自chatgpt):
特性 / 算法 | DeepSort | ByteTrack | OCSort |
---|---|---|---|
基本思想 | 基于检测 + Kalman Filter + 外观特征匹配 | 基于检测 + Kalman Filter + IoU 匹配 | 基于检测 + Kalman Filter + 区分可见/遮挡状态的匹配 |
外观特征依赖 | 强依赖 CNN 特征用于匹配,处理遮挡能力较强 | 可选外观特征,主要依赖运动信息 | 默认不依赖外观特征,结合可见性/遮挡信息匹配 |
遮挡处理 | 使用外观特征缓解遮挡 | 基于运动信息,遮挡期间易丢失 | 明确区分“可见/遮挡轨迹”,遮挡后重新关联能力更强 |
误匹配率 | 中等,遮挡严重时可能误关联 | 较低,通过低分检测补充轨迹 | 更低,通过 Occlusion-aware Matching 减少误关联 |
速度 | 中等,外观特征提取耗时 | 高速,轻量级 | 高速,计算轻量,且无需外观特征 |
轻量级 / 部署 | 较重,需要特征提取网络 | 轻量级,易部署 | 轻量级,简单 Kalman + 区分可见性逻辑 |
跟踪稳定性 | 遮挡多时轨迹易断裂 | 遮挡轻微影响,短时遮挡易断 | 遮挡追踪能力更稳定,尤其是短期遮挡 |
对低分检测的利用 | 一般忽略低分框 | 使用低分框补充轨迹 | 可以智能利用低分检测框,提高遮挡恢复率 |
主要优势 | 对外观变化敏感,遮挡时表现一般 | 快速,低复杂度,低误匹配 | 遮挡处理更智能、误匹配少、速度快、轻量化 |
从表中就可以看到,OCSort算法在目标跟踪中存在很大的优势,因此自己想尝试用ncnn框架实现该算法。
【基本说明】使用的目标检测为YOLOv11的nano版本,OCSort算法参考自官方的OC_SORT项目,其中存在c++
实现。由于OCSort是一种即插即用的目标跟踪算法,因此很容易地可以嵌入到现有的其他项目中。在本项目中,几乎没对OCSort的代码部分进行修改,修改的部分来自融合目标检测和目标跟踪部分。
【注】对应的tensorRT版本实现,指路:yolov11_ocsort_tensorrt。
环境配置
- Ubuntu 2024.04
- ncnn-20250503-full-source
- opencv-3.4.10
- eigen3
注:并不需要和本仓库代码的配置环境保持一致,可以根据自己的实际情况来即可。
推理设置
-
先将本项目拷贝到本地的运行环境中。
$ git clone https://github.com/zhahoi/yolov11_ocsort_ncnn.git
-
修改
CMakeLists.txt
中依赖库的位置,和detector/yolov11.h
中引入权重的位置。 -
在仓库中新建
build
文件夹; -
随后进入
build
文件夹下,使用以下指令进行编译:$ cmake .. $ make -j8
-
进行推理(参考)
$ ./yolov11_ocsort ***.mp4 //进行视频推理 $ ./yolov11_ocsort ***.mp4 1 //进行视频推理并保存推理后的视频
推理结果
写在后面
- 我自己实现后发现,ocsort的推理帧数还真的是不错,在没有gpu的情况下还可以保证20-30帧率的检测速度。另外这是多类别跟踪,真的是比deepsort强很多。
- 如果有疑问的话,可以开issue提问。如果觉得这个项目还不错的话麻烦给一个star或者fork,可以让我开心一整天。
- 某些把我开源的代码拿去打包出售的人能不能去死一死,做个人好嘛。
Reference
- OC_SORT
- yolov11_deepsort_ncnn