yolov11_ocsort_ncnn

使用YOLOv11和OCSort进行多类别目标跟踪。(基于ncnn框架,c++实现)


本项目开源自:https://github.com/zhahoi/yolov11_ocsort_ncnn.git


写在前面

之前尝试过使用YOLOv11和DeepSort实现行人跟踪,亲自实现后发现Deepsort这个算法的局限性还是挺大的。(yolov11_deepsort_ncnn)一方面使用DeepSort进行目标追踪需要另外训练出一个模型,增加推理时间;另一方面,只能跟踪单类别的目标。老实说,实际应用选择该算法应该比较少。

最近在网上检索合适的目标跟踪算法时,发现了一个除了ByteTrackerDeepSort另外的一种目标跟踪算法。以下是三者算法优略比较(来自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

注:并不需要和本仓库代码的配置环境保持一致,可以根据自己的实际情况来即可。

推理设置

  1. 先将本项目拷贝到本地的运行环境中。

    $ git clone https://github.com/zhahoi/yolov11_ocsort_ncnn.git
    
  2. 修改CMakeLists.txt中依赖库的位置,和detector/yolov11.h中引入权重的位置。

  3. 在仓库中新建build文件夹;

  4. 随后进入build文件夹下,使用以下指令进行编译:

    $ cmake ..
    $ make -j8
    
  5. 进行推理(参考)

    $ ./yolov11_ocsort ***.mp4  //进行视频推理
    $ ./yolov11_ocsort ***.mp4  1 //进行视频推理并保存推理后的视频
    

推理结果

在这里插入图片描述

在这里插入图片描述

写在后面

  1. 我自己实现后发现,ocsort的推理帧数还真的是不错,在没有gpu的情况下还可以保证20-30帧率的检测速度。另外这是多类别跟踪,真的是比deepsort强很多。
  2. 如果有疑问的话,可以开issue提问。如果觉得这个项目还不错的话麻烦给一个star或者fork,可以让我开心一整天。
  3. 某些把我开源的代码拿去打包出售的人能不能去死一死,做个人好嘛。

Reference

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐