本项目是C++版本的OC-SORT(OC-SORT: Observation-Centric SORT on video Multi-Object Tracking),矩阵运算使用的库是 Eigen。
本项目主要参考了 OC_SORT官方Python实现。
在代码逻辑和变量命令上尽量与官方Python版本的保持一致,线性分配算法使用了开源库Lap。
OC-SORT中改进的Kalman Filter只使用了Eigen库实现。
后续我可能会尝试发布将OCSORT与检测器接合的部署在资源有限设备上的应用。
当前我的设备CPU是:Ryzen R5 2500U
,编译的时候开启-O2
优化,平均处理一帧的时间是5.5ms
。我实现的这版本确实比ByteTrack的C++版本要慢,但是Python原版的比ByteTrack的慢特别多,代码重构成C++还是有提升的,可以在生产环境下试一试了。
首先你需要库有:Eigen。
下载代码库
git clone https://github.com/Postroggy/OC_SORT_CPP.git
cd OC_SORT_CPP
将src
文件夹是对头文件中定义的函数的实现,include
文件夹负责定义头文件。使用时将整个 OC_SORT 打包成动态链接库即可。
假设文件目录如下
├───include
├───src
├───test.cpp
└───CMakeLists.txt
CMakeLists.txt
内容如下:
cmake_minimum_required(VERSION 3.21)
project(OC_SORT_CPP)
set(CMAKE_CXX_STANDARD 17)
find_package(Eigen3 REQUIRED)
set(CMAKE_WINDOWS_EXPORT_ALL_SYMBOLS ON) # MSVC required
file(GLOB SRC_LIST src/*.cpp)
# compile as a DLL named OCLib
add_library(OCLib SHARED ${SRC_LIST})
target_include_directories(OCLib PUBLIC include)
target_link_libraries(OCLib Eigen3::Eigen)
add_executable(OCSORT test.cpp)
target_link_directories(OCSORT PUBLIC include)
target_link_libraries(test PUBLIC Eigen3::Eigen OCLib)
test.cpp
中的内容:见文件
🚧
🚧
和原版的OCSORT稍稍有不一样的地方:
输入的类型:Eigen::Matrix<double,Eigen::Dynamic,6>
格式:<x1>,<y1>,<x2>,<y2>,<confidence>,<class>
输出的类型:Eigen::Matrix<double,Eigen::Dynamic,>
格式:<x1>,<y1>,<x2>,<y2>,<ID>,<class>,<confidence>
这么做是为了方便OCSORT与其他的目标检测器整合形成完整的目标追踪Pipeline。