在对目标进行检测之后,往后需要对其检测框位置进行跟踪,从而能够为其分配ID。在地平线机器人平台中,官方提供了一个ROS Pakage,专门用来做目标跟踪的,Pakage名为Mot,代码地址为:https://c-gitlab.horizon.ai/HHP/box/hobot_perception/mot
仔细研究发现,该pakage中的目标跟踪算法比较简单,只做了基于IOU简单匹配的目标跟踪策略以及基于IOU欧式距离的目标跟踪策略:

图1. 地平线mot模块支持的跟踪策略
可以看出基于IOU匈牙利匹配的目标跟踪策略以及基于特征的目标跟踪策略目前还没有实现。而且由于基于IOU匈牙利匹配的目标跟踪策略最经典的算法莫过于SORT算法。因此本人决定移植SORT算法到X3派上,并且以人体头部位置跟踪为例,介绍其使用方法。
1. 首先要对目标进行检测,得到目标的检测框(BBox, Bounding Box),这是目标跟踪的基础,同时检测的好坏直接影响了目标跟踪的精度。不管使用什么网络模型,这一步在x3派上都已经比较成熟了,这里不再赘述。
2. 在得到目标的BBox之后就可以对其进行跟踪,跟踪的接口比较简单,这里简单列出代码如下:
std::vector<Rect> detections; // detections 容器里存储目标的BBox
std::vector<int> ids_vec; // 分配的目标ID会放到这个容器里
for ( int i = 0; i < dets.size(); i ++ ) {
// BBox的格式:左上角x值,左上角y值,框的宽度,框的高度, 转成Rect类型即可
detections.push_back( Rect( dets[i].left(), dets[i].top(), dets[i].width(), dets[i].height() ) );
}
tracker.Run( detections ); // 运行跟踪算法
const auto tracks = tracker.GetTracks(); // 得到跟踪结果
for( auto& trk : tracks ) {
ids_vec.push_back( trk.first ); // 分配ID
}
3. 测试结果

可以看出SORT算法在面对丢帧的情况下,会切换ID。经过测试,一般在丢四帧以内不会跟丢。要想解决这个问题,还得依赖基于特征的IOU匹配策略。后面会尝试移植Deep-Sort算法来进行验证。