首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在YOLO v2中添加卡尔曼滤波器

如何在YOLO v2中添加卡尔曼滤波器
EN

Stack Overflow用户
提问于 2019-05-13 01:16:48
回答 1查看 1.5K关注 0票数 0

我想通过在YOLO中添加卡尔曼滤波器来使人的检测变得平滑。

在另一篇文章中,我注意到*(参见下面image.c文件中的代码)如何在YOLO中获取边界框的坐标。

代码语言:javascript
复制
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);
EN

回答 1

Stack Overflow用户

发布于 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种是使用卡尔曼滤波:

  1. Track光流算法,但它只适用于实时检测,不适用于视频。您可以通过取消注释此行//#define TRACK_OPTFLOW来使用算法。看一下508 ~ 522行

代码语言:javascript
复制
#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

  1. Kalman Filter,不是真正推荐的,因为它不是真的准确,但可能适用于闭路电视或固定摄像头。要使用卡尔曼滤波器,请将此值更改为true bool const use_kalman_filter = false;。看一下524 ~532行

代码语言:javascript
复制
// 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();
                            }
                        }

代码语言:javascript
复制
// 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);
                        }
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56101626

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档