我想通过将卡尔曼过滤器添加到yolo。
在我注意到的另一篇文章中*(请参见下面的image.c文件中的代码(如何获取yolo中边界框的坐标。
if(bot > im.h-1) bot = im.h-1;
// Print bounding box values
printf("Bounding Box: Left=%d, Top=%d, Right=%d, Bottom=%dn", left, top, right, bot);
draw_box_width(im, left, top, right, bot, width, red, green, blue);
使用kalman滤波器的目的是用于对象跟踪(不确定平滑(。如果C 实现还可以,您可能想使用此流行的GitHub存储库https://github.com/alexeyab/darknet
如果您读取文档,则它具有C API,您可以将其使用DarkNet用作库(因此可以使用Yolo模型(并将其加载到C 程序。查看使用DarkNet库的C 程序示例。此处https://github.com/alexeyab/darknet/blob/master/master/src/yolo_console_dll.cpp。
在该C 代码中,作者给出了3个选项来进行对象跟踪,其中1个使用Kalman filter:
-
跟踪光流算法,但它仅适用于实时检测,而不适用于视频。您可以通过不按要求使用该行
//#define TRACK_OPTFLOW
使用该算法。看看第508〜522行
#ifdef TRACK_OPTFLOW
if (detection_data.new_detection) {
tracker_flow.update_tracking_flow(detection_data.cap_frame, detection_data.result_vec);
while (track_optflow_queue.size() > 0) {
draw_frame = track_optflow_queue.back();
result_vec = tracker_flow.tracking_flow(track_optflow_queue.front(), false);
track_optflow_queue.pop();
}
}
else {
track_optflow_queue.push(cap_frame);
result_vec = tracker_flow.tracking_flow(cap_frame, false);
}
detection_data.new_detection = true; // to correct kalman filter
#endif //TRACK_OPTFLOW
- Kalman Filter ,并没有真正推荐它,因为它不是真正准确的,但可能适用于CCTV或固定相机。要使用Kalman过滤器将此值更改为True
bool const use_kalman_filter = false;
。看看第524〜532行
// track ID by using kalman filter
if (use_kalman_filter) {
if (detection_data.new_detection) {
result_vec = track_kalman.correct(result_vec);
}
else {
result_vec = track_kalman.predict();
}
}
- 自定义对象跟踪器,我使用了此自定义功能,并且在我的情况下,它比Kalman过滤器更好,它将为您提供每个对象的跟踪ID。
// track ID by using custom function
else {
int frame_story = std::max(5, current_fps_cap.load());
result_vec = detector.tracking_id(result_vec, true, frame_story, 40);
}