weixu000 / libtorch-yolov3-deepsort

MIT License
237 stars 77 forks source link

如何调整跟踪参数? #27

Open opentld opened 3 years ago

opentld commented 3 years ago

首先感谢@weixu000做的很棒的工作! 我用yolov4+TensorRT+torch复现了这个项目,但我发现一个问题,在进行跟踪时,有时候tracker似乎并没有跟踪到目标。但是detector的检测是检测到的,并且置信度还挺高。而且看传给tracker的参数,也只是将rect传过去就可以,与置信度并无关系。 所以我想请教一下,应该如何调整跟踪参数,使得跟踪更加准确并且不会丢呢? 我看deepsort.cpp对iou_mat有一些阈值,是不是要调整这里? 麻烦您方便的时候给与解答 再次感谢@weixu000 !

FishHe commented 2 years ago

同样非常感谢weixu分享自己的代码~ 工程中和原始论文有一些不同,我暂时只看了滤波器的差异:

文件 libtorch-yolov3-deepsort/tracking/src/KalmanTracker.cpp 描述的的运动估计模型和原论文不同: kf.transitionMatrix = (Mat_(stateNum, stateNum) << 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1); void KalmanTracker::init(cv::Rect2f initRect) { // initialize state vector with bounding box in [cx,cy,s,r] style kf.statePost.at(0, 0) = initRect.x + initRect.width / 2; kf.statePost.at(1, 0) = initRect.y + initRect.height / 2; kf.statePost.at(2, 0) = initRect.area(); kf.statePost.at(3, 0) = initRect.width / initRect.height; } 从源码中可以看出,作者的状态变量是:[x,y,s,r,vx,vy,vs],xy是中心坐标,s是面积,r是纵横比 作者认为物体在运动过程中,xys符合一阶线性微分模型,r符合静态滤波条件

原始论文中,使用 [x,y,r,h,vx,vy,vr,vh],h是BBOX的高。

另外,作者的源码中,没有考虑不同观测值、运动系统的方差差异: setIdentity(kf.processNoiseCov, Scalar::all(1e-2)); setIdentity(kf.measurementNoiseCov, Scalar::all(1e-1)); setIdentity(kf.errorCovPost, Scalar::all(1));

这些参数需要结合数据,进一步确定。