From 02e8476cc8b606e92f0ce47011f00b2a5acb8bca Mon Sep 17 00:00:00 2001 From: Wanli Date: Sun, 28 Apr 2024 21:41:24 +0800 Subject: [PATCH] remove goturn related code --- .../opencv2/tracking/tracking_legacy.hpp | 39 --- .../misc/java/test/TrackerCreateTest.java | 11 - .../misc/python/test/test_tracking_contrib.py | 5 - modules/tracking/samples/goturnTracker.cpp | 230 ------------------ modules/tracking/samples/samples_utility.hpp | 4 - modules/tracking/samples/tracker.cpp | 2 +- .../tutorial_introduction_to_tracker.markdown | 1 - 7 files changed, 1 insertion(+), 291 deletions(-) delete mode 100644 modules/tracking/samples/goturnTracker.cpp diff --git a/modules/tracking/include/opencv2/tracking/tracking_legacy.hpp b/modules/tracking/include/opencv2/tracking/tracking_legacy.hpp index e0f17064c..972538e33 100644 --- a/modules/tracking/include/opencv2/tracking/tracking_legacy.hpp +++ b/modules/tracking/include/opencv2/tracking/tracking_legacy.hpp @@ -286,45 +286,6 @@ public: virtual ~TrackerKCF() CV_OVERRIDE {} }; -#if 0 // legacy variant is not available -/** @brief the GOTURN (Generic Object Tracking Using Regression Networks) tracker - - * GOTURN (@cite GOTURN) is kind of trackers based on Convolutional Neural Networks (CNN). While taking all advantages of CNN trackers, - * GOTURN is much faster due to offline training without online fine-tuning nature. - * GOTURN tracker addresses the problem of single target tracking: given a bounding box label of an object in the first frame of the video, - * we track that object through the rest of the video. NOTE: Current method of GOTURN does not handle occlusions; however, it is fairly - * robust to viewpoint changes, lighting changes, and deformations. - * Inputs of GOTURN are two RGB patches representing Target and Search patches resized to 227x227. - * Outputs of GOTURN are predicted bounding box coordinates, relative to Search patch coordinate system, in format X1,Y1,X2,Y2. - * Original paper is here: - * As long as original authors implementation: - * Implementation of training algorithm is placed in separately here due to 3d-party dependencies: - * - * GOTURN architecture goturn.prototxt and trained model goturn.caffemodel are accessible on opencv_extra GitHub repository. -*/ -class CV_EXPORTS_W TrackerGOTURN : public cv::legacy::Tracker -{ -public: - struct CV_EXPORTS Params - { - Params(); - void read(const FileNode& /*fn*/); - void write(FileStorage& /*fs*/) const; - String modelTxt; - String modelBin; - }; - - /** @brief Constructor - @param parameters GOTURN parameters TrackerGOTURN::Params - */ - static Ptr create(const TrackerGOTURN::Params ¶meters); - - CV_WRAP static Ptr create(); - - virtual ~TrackerGOTURN() CV_OVERRIDE {} -}; -#endif - /** @brief the MOSSE (Minimum Output Sum of Squared %Error) tracker The implementation is based on @cite MOSSE Visual Object Tracking using Adaptive Correlation Filters diff --git a/modules/tracking/misc/java/test/TrackerCreateTest.java b/modules/tracking/misc/java/test/TrackerCreateTest.java index f4db6abad..92920b238 100644 --- a/modules/tracking/misc/java/test/TrackerCreateTest.java +++ b/modules/tracking/misc/java/test/TrackerCreateTest.java @@ -5,7 +5,6 @@ import org.opencv.core.CvException; import org.opencv.test.OpenCVTestCase; import org.opencv.video.Tracker; -import org.opencv.video.TrackerGOTURN; import org.opencv.tracking.TrackerKCF; import org.opencv.video.TrackerMIL; @@ -16,16 +15,6 @@ public class TrackerCreateTest extends OpenCVTestCase { super.setUp(); } - - public void testCreateTrackerGOTURN() { - try { - Tracker tracker = TrackerGOTURN.create(); - assert(tracker != null); - } catch (CvException e) { - // expected, model files may be missing - } - } - public void testCreateTrackerKCF() { Tracker tracker = TrackerKCF.create(); } diff --git a/modules/tracking/misc/python/test/test_tracking_contrib.py b/modules/tracking/misc/python/test/test_tracking_contrib.py index 7eeb91e1e..e5d1745f1 100644 --- a/modules/tracking/misc/python/test/test_tracking_contrib.py +++ b/modules/tracking/misc/python/test/test_tracking_contrib.py @@ -11,10 +11,6 @@ class tracking_contrib_test(NewOpenCVTests): t = cv.TrackerMIL_create() t = cv.TrackerKCF_create() - try: - t = cv.TrackerGOTURN_create() - except cv.error as e: - pass # may fail due to missing DL model files def test_createLegacyTracker(self): @@ -22,7 +18,6 @@ class tracking_contrib_test(NewOpenCVTests): t = cv.legacy.TrackerMIL_create() t = cv.legacy.TrackerKCF_create() t = cv.legacy.TrackerMedianFlow_create() - #t = cv.legacy.TrackerGOTURN_create() t = cv.legacy.TrackerMOSSE_create() t = cv.legacy.TrackerCSRT_create() diff --git a/modules/tracking/samples/goturnTracker.cpp b/modules/tracking/samples/goturnTracker.cpp deleted file mode 100644 index 9bdaa97a1..000000000 --- a/modules/tracking/samples/goturnTracker.cpp +++ /dev/null @@ -1,230 +0,0 @@ -/*M/////////////////////////////////////////////////////////////////////////////////////// -// -// IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. -// -// By downloading, copying, installing or using the software you agree to this license. -// If you do not agree to this license, do not download, install, -// copy or use the software. -// -// -// License Agreement -// For Open Source Computer Vision Library -// -// Copyright (C) 2013, OpenCV Foundation, all rights reserved. -// Third party copyrights are property of their respective owners. -// -// Redistribution and use in source and binary forms, with or without modification, -// are permitted provided that the following conditions are met: -// -// * Redistribution's of source code must retain the above copyright notice, -// this list of conditions and the following disclaimer. -// -// * Redistribution's in binary form must reproduce the above copyright notice, -// this list of conditions and the following disclaimer in the documentation -// and/or other materials provided with the distribution. -// -// * The name of the copyright holders may not be used to endorse or promote products -// derived from this software without specific prior written permission. -// -// This software is provided by the copyright holders and contributors "as is" and -// any express or implied warranties, including, but not limited to, the implied -// warranties of merchantability and fitness for a particular purpose are disclaimed. -// In no event shall the Intel Corporation or contributors be liable for any direct, -// indirect, incidental, special, exemplary, or consequential damages -// (including, but not limited to, procurement of substitute goods or services; -// loss of use, data, or profits; or business interruption) however caused -// and on any theory of liability, whether in contract, strict liability, -// or tort (including negligence or otherwise) arising in any way out of -// the use of this software, even if advised of the possibility of such damage. -// -//M*/ - -//Demo of GOTURN tracker -//In order to use GOTURN tracker, GOTURN architecture goturn.prototxt and goturn.caffemodel are required to exist in root folder. -//There are 2 ways to get caffemodel: -//1 - Train you own GOTURN model using -//2 - Download pretrained caffemodel from - -#include "opencv2/opencv_modules.hpp" -#if defined(HAVE_OPENCV_DNN) && defined(HAVE_OPENCV_DATASETS) - -#include "opencv2/datasets/track_alov.hpp" -#include -#include -#include -#include -#include -#include - -using namespace std; -using namespace cv; -using namespace cv::datasets; - -#define NUM_TEST_FRAMES 1000 - -static Mat image; -static bool paused; -static bool selectObjects = false; -static bool startSelection = false; -static Rect boundingBox; - -static const char* keys = -{ "{@dataset_path || Dataset path }" - "{@dataset_id |1| Dataset ID }" -}; - -static void onMouse(int event, int x, int y, int, void*) -{ - if (!selectObjects) - { - switch (event) - { - case EVENT_LBUTTONDOWN: - //set origin of the bounding box - startSelection = true; - boundingBox.x = x; - boundingBox.y = y; - boundingBox.width = boundingBox.height = 0; - break; - case EVENT_LBUTTONUP: - //sei with and height of the bounding box - boundingBox.width = std::abs(x - boundingBox.x); - boundingBox.height = std::abs(y - boundingBox.y); - paused = false; - selectObjects = true; - startSelection = false; - break; - case EVENT_MOUSEMOVE: - - if (startSelection && !selectObjects) - { - //draw the bounding box - Mat currentFrame; - image.copyTo(currentFrame); - rectangle(currentFrame, Point((int)boundingBox.x, (int)boundingBox.y), Point(x, y), Scalar(255, 0, 0), 2, 1); - imshow("GOTURN Tracking", currentFrame); - } - break; - } - } -} - -static void help() -{ - cout << "\nThis example is a simple demo of GOTURN tracking on ALOV300++ dataset" - "ALOV dataset contains videos with ID range: 1~314\n" - "-- pause video [p] and draw a bounding boxes around the targets to start the tracker\n" - "Example:\n" - "./goturnTracker \n" - << endl; - - cout << "\n\nHot keys: \n" - "\tq - quit the program\n" - "\tp - pause video\n"; -} - -int main(int argc, char *argv[]) -{ - CommandLineParser parser(argc, argv, keys); - string datasetRootPath = parser.get(0); - int datasetID = parser.get(1); - - if (datasetRootPath.empty()) - { - help(); - return -1; - } - - Mat frame; - paused = false; - namedWindow("GOTURN Tracking", 0); - setMouseCallback("GOTURN Tracking", onMouse, 0); - - //Create GOTURN tracker - auto tracker = TrackerGOTURN::create(); - - //Load and init full ALOV300++ dataset with a given datasetID, as alternative you can use loadAnnotatedOnly(..) - //to load only frames with labelled ground truth ~ every 5-th frame - Ptr dataset = TRACK_alov::create(); - dataset->load(datasetRootPath); - dataset->initDataset(datasetID); - //Read first frame - dataset->getNextFrame(frame); - if (frame.empty()) - { - cout << "invalid dataset: " << datasetRootPath << endl; - return -2; - } - - frame.copyTo(image); - rectangle(image, boundingBox, Scalar(255, 0, 0), 2, 1); - imshow("GOTURN Tracking", image); - - bool initialized = false; - paused = true; - int frameCounter = 0; - - //Time measurment - int64 e3 = getTickCount(); - - for (;;) - { - if (!paused) - { - //Time measurment - int64 e1 = getTickCount(); - if (initialized){ - if (!dataset->getNextFrame(frame)) - break; - frame.copyTo(image); - } - - if (!initialized && selectObjects) - { - //Initialize the tracker and add targets - tracker->init(frame, boundingBox); - rectangle(frame, boundingBox, Scalar(0, 0, 255), 2, 1); - initialized = true; - } - else if (initialized) - { - //Update all targets - if (tracker->update(frame, boundingBox)) - { - rectangle(frame, boundingBox, Scalar(0, 0, 255), 2, 1); - } - } - imshow("GOTURN Tracking", frame); - frameCounter++; - //Time measurment - int64 e2 = getTickCount(); - double t1 = (e2 - e1) / getTickFrequency(); - cout << frameCounter << "\tframe : " << t1 * 1000.0 << "ms" << endl; - } - - char c = (char)waitKey(2); - if (c == 'q') - break; - if (c == 'p') - paused = !paused; - } - - //Time measurment - int64 e4 = getTickCount(); - double t2 = (e4 - e3) / getTickFrequency(); - cout << "Average Time for Frame: " << t2 * 1000.0 / frameCounter << "ms" << endl; - cout << "Average FPS: " << 1.0 / t2*frameCounter << endl; - - - waitKey(0); - - return 0; -} - -#else // ! HAVE_OPENCV_DNN && HAVE_OPENCV_DATASETS -#include -int main() { - CV_Error(cv::Error::StsNotImplemented , "this sample needs to be built with opencv_datasets and opencv_dnn !"); - return -1; -} -#endif diff --git a/modules/tracking/samples/samples_utility.hpp b/modules/tracking/samples/samples_utility.hpp index 2fe876919..75587ea75 100644 --- a/modules/tracking/samples/samples_utility.hpp +++ b/modules/tracking/samples/samples_utility.hpp @@ -20,8 +20,6 @@ inline cv::Ptr createTrackerByName(const std::string& name) tracker = legacy::upgradeTrackingAPI(legacy::TrackerMedianFlow::create()); else if (name == "MIL") tracker = cv::TrackerMIL::create(); - else if (name == "GOTURN") - tracker = cv::TrackerGOTURN::create(); else if (name == "MOSSE") tracker = legacy::upgradeTrackingAPI(legacy::TrackerMOSSE::create()); else if (name == "CSRT") @@ -48,8 +46,6 @@ inline cv::Ptr createTrackerByName_legacy(const std::string tracker = legacy::TrackerMedianFlow::create(); else if (name == "MIL") tracker = legacy::TrackerMIL::create(); - else if (name == "GOTURN") - CV_Error(cv::Error::StsNotImplemented, "FIXIT: migration on new API is required"); else if (name == "MOSSE") tracker = legacy::TrackerMOSSE::create(); else if (name == "CSRT") diff --git a/modules/tracking/samples/tracker.cpp b/modules/tracking/samples/tracker.cpp index 5de5e60f6..b7b15592a 100644 --- a/modules/tracking/samples/tracker.cpp +++ b/modules/tracking/samples/tracker.cpp @@ -22,7 +22,7 @@ static void help() "Example of is in opencv_extra/testdata/cv/tracking/\n" "Call:\n" "./tracker []\n" - "tracker_algorithm can be: MIL, BOOSTING, MEDIANFLOW, TLD, KCF, GOTURN, MOSSE.\n" + "tracker_algorithm can be: MIL, BOOSTING, MEDIANFLOW, TLD, KCF, MOSSE.\n" << endl; cout << "\n\nHot keys: \n" diff --git a/modules/tracking/tutorials/tutorial_introduction_to_tracker.markdown b/modules/tracking/tutorials/tutorial_introduction_to_tracker.markdown index 5f4efcdc8..0fa7547b3 100644 --- a/modules/tracking/tutorials/tutorial_introduction_to_tracker.markdown +++ b/modules/tracking/tutorials/tutorial_introduction_to_tracker.markdown @@ -50,7 +50,6 @@ Explanation + MEDIANFLOW + TLD + KCF - + GOTURN + MOSSE Each tracker algorithm has their own advantages and disadvantages, please refer the documentation of @ref cv::Tracker for more detailed information.