我想通过在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=%d\n", left, top, right, bot);
draw_box_width(im, left, top, right, bot, width, red, green, blue);
发布于 2019-05-13 08:13:20
使用卡尔曼滤波器的目的是为了目标跟踪(不确定是否平滑)。如果C++实现还可以,那么您可能想要使用这个流行的github存储库https://github.com/AlexeyAB/darknet
如果你阅读了文档,它有C++ API,你可以使用darknet作为库(这样你就可以使用你的yolo模型)并将其加载到你的C++程序中。请看一下在https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp中使用darknet库C++程序示例。
在C++代码中,作者给出了3种进行目标跟踪选项,其中1种是使用卡尔曼滤波:
//#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
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();
}
}
// 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);
}
https://stackoverflow.com/questions/56101626
复制相似问题