Как добавить фильтр Калмана в YOLO v2 - PullRequest
0 голосов
/ 12 мая 2019

Я хотел бы сделать обнаружение людей плавным, добавив фильтр Калмана в YOLO.

В другом посте я заметил * (см. Код ниже в файле image.c), как получить координаты ограничительной рамки вЙОЛО.

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);

1 Ответ

0 голосов
/ 13 мая 2019

Цель использования фильтра Калмана для отслеживания объектов (не обязательно для сглаживания).Если реализация C ++ в порядке, вы, вероятно, захотите использовать этот популярный репозиторий github https://github.com/AlexeyAB/darknet

Если вы читаете документацию, у него есть C ++ API, в котором вы можете использовать darknet в качестве библиотеки (так что вы можете использовать свою модель yolo)и загрузите его в свою C ++ программу.Взгляните на пример программы на C ++, которая использует библиотеку darknet здесь https://github.com/AlexeyAB/darknet/blob/master/src/yolo_console_dll.cpp.

В этом коде C ++ автор предоставляет 3 варианта для отслеживания объектов, 1 из них использует фильтр Калмана:

  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
Фильтр Калмана , не очень рекомендуется, потому что он не очень точный, но может работать для CCTV или стационарной камеры.Чтобы использовать фильтр Калмана, измените это значение на 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();
                            }
                        }
Custom Object Tracker , я использовал эту пользовательскую функцию, и в моем случае она работает лучше, чем фильтр Калмана, он даст вам идентификатор трека для каждого объекта.
// 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);
                        }
...