From d706072784bd5f3f6c971249755bcbbfd3db7714 Mon Sep 17 00:00:00 2001 From: Elizarov Ilya <48130864+ieliz@users.noreply.github.com> Date: Sat, 5 Sep 2020 21:47:02 +0300 Subject: [PATCH] Merge pull request #2620 from ieliz:goturn Bounding box fixes for GOTURN tracker * Trying to change branch from master to 3.4 * Removing unnecessary if statement * Frame existence check is added * Changes in GOTURN tracker for reading path to caffemodel and prototxt files in opencv_extra * Replacing get_data_path with findDataFile and moving paths in parameters * tracking: fix GOTURN model loading * Fixing GOTURN memory test: paths to GOTURN files are in cv::FileNode now * Fix * Fix * Fixing comments * Deleting trailing space * Trying to solve the problem with test * Removing ground truth reading part in GOTURN test * Removing trailing spaces * Trying to fix win64/win32 issue * Fixing problem with win32/win64 * Trying to solve issue with win32/win64 --- .../include/opencv2/tracking/tracker.hpp | 2 ++ modules/tracking/src/gtrTracker.cpp | 21 ++++++++++++---- modules/tracking/test/test_main.cpp | 17 ++++++++++++- modules/tracking/test/test_trackers.cpp | 25 +++++++++++++++++++ 4 files changed, 59 insertions(+), 6 deletions(-) diff --git a/modules/tracking/include/opencv2/tracking/tracker.hpp b/modules/tracking/include/opencv2/tracking/tracker.hpp index 3b880d9d6..61bcb0374 100644 --- a/modules/tracking/include/opencv2/tracking/tracker.hpp +++ b/modules/tracking/include/opencv2/tracking/tracker.hpp @@ -1292,6 +1292,8 @@ public: Params(); void read(const FileNode& /*fn*/); void write(FileStorage& /*fs*/) const; + String modelTxt; + String modelBin; }; /** @brief Constructor diff --git a/modules/tracking/src/gtrTracker.cpp b/modules/tracking/src/gtrTracker.cpp index 2b92b7e6e..c56bb5bba 100644 --- a/modules/tracking/src/gtrTracker.cpp +++ b/modules/tracking/src/gtrTracker.cpp @@ -45,7 +45,11 @@ namespace cv { -TrackerGOTURN::Params::Params(){} +TrackerGOTURN::Params::Params() +{ + modelTxt = "goturn.prototxt"; + modelBin = "goturn.caffemodel"; +} void TrackerGOTURN::Params::read(const cv::FileNode& /*fn*/){} @@ -75,7 +79,11 @@ class TrackerGOTURNModel : public TrackerModel{ public: TrackerGOTURNModel(TrackerGOTURN::Params){} Rect2d getBoundingBox(){ return boundingBox_; } - void setBoudingBox(Rect2d boundingBox){ boundingBox_ = boundingBox; } + void setBoudingBox(Rect2d boundingBox) { + if (image_.empty()) + CV_Error(Error::StsInternal, "Set image first"); + boundingBox_ = boundingBox & Rect2d(Point(0, 0), image_.size()); + } Mat getImage(){ return image_; } void setImage(const Mat& image){ image.copyTo(image_); } protected: @@ -108,9 +116,7 @@ bool TrackerGOTURNImpl::initImpl(const Mat& image, const Rect2d& boundingBox) ((TrackerGOTURNModel*)static_cast(model))->setBoudingBox(boundingBox); //Load GOTURN architecture from *.prototxt and pretrained weights from *.caffemodel - String modelTxt = "goturn.prototxt"; - String modelBin = "goturn.caffemodel"; - net = dnn::readNetFromCaffe(modelTxt, modelBin); + net = dnn::readNetFromCaffe(params.modelTxt, params.modelBin); return true; } @@ -137,6 +143,11 @@ bool TrackerGOTURNImpl::updateImpl(const Mat& image, Rect2d& boundingBox) targetPatchRect.x = (float)(prevCenter.x - prevBB.width*padTargetPatch / 2.0 + targetPatchRect.width); targetPatchRect.y = (float)(prevCenter.y - prevBB.height*padTargetPatch / 2.0 + targetPatchRect.height); + targetPatchRect.width = std::min(targetPatchRect.width, (float)prevFrame.cols); + targetPatchRect.height = std::min(targetPatchRect.height, (float)prevFrame.rows); + targetPatchRect.x = std::max(-prevFrame.cols * 0.5f, std::min(targetPatchRect.x, prevFrame.cols * 1.5f)); + targetPatchRect.y = std::max(-prevFrame.rows * 0.5f, std::min(targetPatchRect.y, prevFrame.rows * 1.5f)); + copyMakeBorder(prevFrame, prevFramePadded, (int)targetPatchRect.height, (int)targetPatchRect.height, (int)targetPatchRect.width, (int)targetPatchRect.width, BORDER_REPLICATE); targetPatch = prevFramePadded(targetPatchRect).clone(); diff --git a/modules/tracking/test/test_main.cpp b/modules/tracking/test/test_main.cpp index 0e51ddfd0..bae9acb58 100644 --- a/modules/tracking/test/test_main.cpp +++ b/modules/tracking/test/test_main.cpp @@ -3,4 +3,19 @@ // of this distribution and at http://opencv.org/license.html. #include "test_precomp.hpp" -CV_TEST_MAIN("cv") +static +void initTrackingTests() +{ + const char* extraTestDataPath = +#ifdef WINRT + NULL; +#else + getenv("OPENCV_DNN_TEST_DATA_PATH"); +#endif + if (extraTestDataPath) + cvtest::addDataSearchPath(extraTestDataPath); + + cvtest::addDataSearchSubDirectory(""); // override "cv" prefix below to access without "../dnn" hacks +} + +CV_TEST_MAIN("cv", initTrackingTests()) diff --git a/modules/tracking/test/test_trackers.cpp b/modules/tracking/test/test_trackers.cpp index 1a70f30d9..db1617e35 100644 --- a/modules/tracking/test/test_trackers.cpp +++ b/modules/tracking/test/test_trackers.cpp @@ -567,6 +567,31 @@ TEST_P(DistanceAndOverlap, Scaled_Data_CSRT) test.run(); } +TEST(GOTURN, memory_usage) +{ + cv::Rect2d roi(145, 70, 85, 85); + cv::Mat frame; + + std::string model = cvtest::findDataFile("dnn/gsoc2016-goturn/goturn.prototxt"); + std::string weights = cvtest::findDataFile("dnn/gsoc2016-goturn/goturn.caffemodel", false); + cv::TrackerGOTURN::Params params; + params.modelTxt = model; + params.modelBin = weights; + cv::Ptr tracker = cv::TrackerGOTURN::create(params); + string inputVideo = cvtest::findDataFile("tracking/david/data/david.webm"); + cv::VideoCapture video(inputVideo); + + video >> frame; + tracker->init(frame, roi); + string ground_truth_bb; + for (int nframes = 0; nframes < 15; ++nframes) + { + std::cout << "Frame: " << nframes << std::endl; + video >> frame; + tracker->update(frame, roi); + std::cout << "Predicted ROI: " << roi << std::endl; + } +} INSTANTIATE_TEST_CASE_P( Tracking, DistanceAndOverlap, TESTSET_NAMES);