Цель данной работы - получить общее представление о фундаментальных объектах компьютерного зрения - особых точках. Рассмотреть одно из возможных применений - трекинг объектов.
Данный репозиторий содержит:
include
-- директория с заголовочным файлом, содержащим интерфейс трекера.samples
-- директория с исходным кодом приложения, которое запускает трекинг на видео. Имя алгоритма и путь к видео передаются параметрами командной строки. Кроме того, может быть указан файл с описанием ground-truth траектории, в этом случае приложение также выдаст метрики precision и recall для запускаемого трекера.dataset
-- директория с примерами видео. Для каждого видео имеется одноименный файл с расширением.txt
, в котором указана ground-truth траектория..gitignore
-- список файлов, находящихся в директории проекта, но игнорируемые git'ом..travis.yml
-- конфигурационный файл для системы автоматического тестирования Travis-CI.CMakeLists.txt
-- общий файл для сборки проекта с помощью CMake.README.md
-- настоящий файл.
Основные задачи:
- Реализовать алгоритм трекинга Median Flow.
- Собрать качественные метрики на имеющемся наборе видео, дать им оценку.
Дополнительные задачи:
- Улучшить качественные оценки трекинга при помощи реализации вспомогательных
процедур:
- Использование различных способов фильтрации точек (фиксированный порог, среднее и т.п.).
- Оценка масштаба.
- Использование различных особых точек (Harris corners,
goodFeaturesToTrack
, SIFT/SURF/ORB features и т.п.). - Детектировать срыв трекинга.
- Сделать форк upstream-репозитория, затем клонировать origin к себе на локальную машину. Для получения инструкций можно обратиться к разделу Общие инструкции по работе с Git в практической работе 1.
- Собрать проект с помощью CMake и MS VS (раздел
Сборка проекта с помощью CMake и MS VS
в практической работе 1). В результате успешной сборки в
build-каталоге в директории
bin
должен появить исполняемый файлtracking_sample.exe
. - Запустить
tracking_sample.exe
для получения справки и разобраться с параметрами его запуска. - Добавить новую реализацию интерфейса
Tracker
. - Реализовать примитивную версию алгоритма Median Flow.
- Запустить реализованный трекер на различных видео из каталога
dataset
, проанализировать его качество. - Реализовать полную версию алгоритма, проанализировать качество.
- Попытаться ещё улучшить качество (см. Дополнительные задачи).
-
Сделать форк upstream-репозитория, затем клонировать origin к себе на локальную машину. Для инструкций можно обратиться к разделу Общие инструкции по работе с Git в практической работе 1.
-
Собрать проект с помощью CMake и MS VS (см. раздел Сборка проекта с помощью CMake и MS VS в практической работе 1). В результате успешной сборки в build-каталоге в директории
bin
долен появить исполняемый файлtracking_sample.exe
. -
Запустить
tracking_sample.exe
для получения справки и разобраться с параметрами его запуска.- Приложение можно запускать без параметров - тогда оно просто выдает справку.
Tracker algorithm: Video name: Error: can't recognize tracking algorithm or open video Usage: tracking_sample.exe <tracker_algorithm> <video_name> <bounding_box or path_to_gt_file> Video examples can be found in "dataset" folder Bounding box should be given in format "x1,y1,x2,y2", where x's and y's are integer cordinates of opposed corners of bounding box Ground truth files are text files where each line is the representation of a bounding box in the described format. Examples can also be found in the"dataset" folder. Examples: $ ./bin/tracking_sample dummy ../dataset/car.mp4 $ ./bin/tracking_sample dummy ../dataset/car.mp4 142,125,232,164 $ ./bin/tracking_sample dummy ../dataset/car.mp4 ../dataset/car.txt
- Можно также передать 2 параметра так, как показано ниже. В
результате откроется окно, в котором нужно будет мышью выбрать
объект для трекинга. После чего будет показан результат трекинга
с использованием указанного алгоритма (в данном случае -
dummy
).
$ tracking_sample.exe dummy ../../dataset/car.mp4
- Можно передать 3 параметра так, как показано ниже. Тогда, кроме результатов указанного трекера, будет показана также разметка для сопровождаемого объекта (ground-truth). При этом по завершении видео, будут выведены качественные оценки алгоритма.
$ tracking_sample.exe dummy ../../dataset/car.mp4 ../../dataset/car.txt
-
Добавить новую реализацию интерфейса
Tracker
.- Добавить новый файл с расширением
.cpp
в директориюsamples
(например,tracker_median_flow_YOUR_NAME.cpp
). - Перезапустить CMake, чтобы он "подхватил" созданный файл.
- Реализовать в созданном файле интерфейс
Tracker
, аналогично реализации в файлеtracker_dummy.cpp
. Тела методов могут быть пока тривиальными.
#include <tracker.hpp> class TrackerYourName : public Tracker { public: virtual ~TrackerYourName() {} virtual bool init( const cv::Mat& frame, const cv::Rect& initial_position ); virtual bool track( const cv::Mat& frame, cv::Rect& new_position ); private: cv::Rect position_; }; bool TrackerYourName::init( const cv::Mat& frame, const cv::Rect& initial_position ) { position_ = initial_position; return true; } bool TrackerYourName::track( const cv::Mat& frame, cv::Rect& new_position ) { new_position = position_; return true; }
- В тот же файл после объявления класса необходимо поместить функцию создания собственного трекера
cv::Ptr<Tracker> createTrackerYourName() { return cv::Ptr<Tracker>(new TrackerYourName()); }
- Добавить объвление своей функции
createTrackerYourName
в файлtrackers_factory.cpp
.
cv::Ptr<Tracker> createTrackerYourName();
- Вызов реализации полученной функции-фабрики необходимо поместить
в функцию
createTracker
(файлtrackers_factory.cpp
), добавив дополнительную ветку в операторе условия.
if (impl_name == "dummy") return createTrackerDummy(); else if (impl_name == "your_name"): return createTrackerYourName();
- Не забудьте исправить подсказку в функции
help
(файлtracking_sample.cpp
), добавив информацию о возможности задания вашего трекераyour_name
.
- Добавить новый файл с расширением
-
Реализовать примитивную версию алгоритма Median Flow. Метод
track
в созданной реализации должен содержать:- Выбрать точки для сопровождения в прямоугольнике.
- Вычислить для них optical flow (следует использовать функцию
calcOpticalFlowPyrLK
, пример использования) и отфильтровать "плохие" точки. Фильтрация "плохих" точек осуществляется следующим образом:- Отбросить точки, которые не протрекались, у них статус
false
. - Выбрать медианную ошибку.
- Назначить "плохими" все точки, для которых ошибка больше медианной.
- Отбросить точки, которые не протрекались, у них статус
- Выбрать медианные смещения по X и по Y.
-
Запустить реализованный трекер на различных видео из каталога
dataset
, проанализировать его качество. Попробуйте ответить на вопросы:- Насколько полученные оценки близки к идеальным, равным 1?
- В каких случаях алгоритм срабатывает плохо?
-
Реализовать полную версию алгоритма, проанализировать качество. Шаги "полного" алгоритма следующие:
- Выбрать точки в прямоугольнике.
- Вычислить для них optical flow (и отбросить "плохие").
- Вычислить обратный optical flow (и отбросить "плохие" по forward-backward
правилу). Фильтрация по forward-backward правилу осуществляется
следующим образом:
- Вычислить optical flow в обратном направлении.
- Отфильтровать точки - если положение оригинальной точки и её образа,
вычисленного с помощью forward-backward flow "сильно" отличаются, её нужно
отбросить.
- Выбрать медианную ошибку.
- Назначить "плохими" все точки, для которых ошибка больше медианной.
- Взять медианные смещения по X и по Y.
- Оценить масштаб. Оценка масштаба осуществляется следующим образом:
- Для всех пар точек нужно определить отношение расстояния между ними на предыдущем и следующем кадре.
- Выбрать медианное отношение.
-
Попытаться ещё улучшить качество (см. Дополнительные задачи).