]> rtime.felk.cvut.cz Git - hercules2020/kcf.git/commitdiff
Removed memory allocation in tracker update
authorShanigen <vkaraf@gmail.com>
Wed, 1 Aug 2018 08:51:08 +0000 (10:51 +0200)
committerMichal Sojka <michal.sojka@cvut.cz>
Wed, 5 Sep 2018 06:38:33 +0000 (08:38 +0200)
Added xf to Scale_vars, which is used during tracker updating and was allocated every frame.
Now it is allocated only once in KCF_Tracker::init in scale_vars[0] and is reused every frame.

src/fft_opencv.cpp
src/kcf.cpp
src/scale_vars.hpp

index b69b84e0aacef86c459336efd0d935a9911510fc..a2083e4e8383a3a80c6dba9c9a722fb542cafb7a 100644 (file)
@@ -56,10 +56,12 @@ void FftOpencv::forward_window(Scale_vars & vars)
 {
     int n_channels = vars.patch_feats.size();
 
+    ComplexMat *result = vars.flag & Track_flags::TRACKER_UPDATE ? & vars.xf : & vars.zf;
+
     for (int i = 0; i < n_channels; ++i) {
         cv::Mat complex_result;
         cv::dft(vars.patch_feats[i].mul(m_window), complex_result, cv::DFT_COMPLEX_OUTPUT);
-        vars.zf.set_channel(i, complex_result);
+        result->set_channel(i, complex_result);
     }
     return;
 }
index c156b80d3bd9b1b33000fed3c17779262e7a27ef..9e84c46ba06e206c99da556d30671089dc49c81e 100644 (file)
@@ -184,6 +184,9 @@ void KCF_Tracker::init(cv::Mat &img, const cv::Rect & bbox, int fit_size_x, int
         scale_vars[i].patch_feats.reserve(p_num_of_feats);
 
         scale_vars[i].zf = ComplexMat(p_windows_size[1]/p_cell_size, p_windows_size[0]/p_cell_size, p_num_of_feats);
+        //We use scale_vars[0] for updating the tracker, so we only allocate memory for  its xf only.
+        if (i==0)
+            scale_vars[i].xf = ComplexMat(p_windows_size[1]/p_cell_size, p_windows_size[0]/p_cell_size, p_num_of_feats);
     }
 #endif
 
@@ -353,21 +356,22 @@ void KCF_Tracker::track(cv::Mat &img)
         p_current_scale = p_min_max_scale[1];
     //obtain a subwindow for training at newly estimated target position
     get_features(input_rgb, input_gray, p_pose.cx, p_pose.cy, p_windows_size[0], p_windows_size[1], scale_vars[0], p_current_scale);
-    ComplexMat xf = fft.forward_window(scale_vars[0].patch_feats);
+    scale_vars[0].flag = Track_flags::TRACKER_UPDATE;
+    fft.forward_window(scale_vars[0]);
 
     //subsequent frames, interpolate model
-    p_model_xf = p_model_xf * (1. - p_interp_factor) + xf * p_interp_factor;
+    p_model_xf = p_model_xf * (1. - p_interp_factor) + scale_vars[0].xf * p_interp_factor;
 
     ComplexMat alphaf_num, alphaf_den;
-    scale_vars[0].flag = Track_flags::AUTO_CORRELATION;
 
     if (m_use_linearkernel) {
-        ComplexMat xfconj = xf.conj();
+        ComplexMat xfconj = scale_vars[0].xf.conj();
         alphaf_num = xfconj.mul(p_yf);
-        alphaf_den = (xf * xfconj);
+        alphaf_den = (scale_vars[0].xf * xfconj);
     } else {
+        scale_vars[0].flag = Track_flags::AUTO_CORRELATION;
         //Kernel Ridge Regression, calculate alphas (in Fourier domain)
-        gaussian_correlation(scale_vars[0], xf, xf, p_kernel_sigma, true);
+        gaussian_correlation(scale_vars[0], scale_vars[0].xf, scale_vars[0].xf, p_kernel_sigma, true);
 //        ComplexMat alphaf = p_yf / (kf + p_lambda); //equation for fast training
 //        p_model_alphaf = p_model_alphaf * (1. - p_interp_factor) + alphaf * p_interp_factor;
         alphaf_num = p_yf * scale_vars[0].kf;
@@ -386,6 +390,7 @@ void KCF_Tracker::scale_track(Scale_vars & vars, cv::Mat & input_rgb, cv::Mat &
     get_features(input_rgb, input_gray, this->p_pose.cx, this->p_pose.cy, this->p_windows_size[0], this->p_windows_size[1],
                                 vars, this->p_current_scale * scale);
 
+    vars.flag = Track_flags::SCALE_RESPONSE;
     fft.forward_window(vars);
     DEBUG_PRINTM(vars.zf);
 
index 458ed4398956a9778b788c7774ec89da7469f18d..5cc4546d76d25a63a6bbd52b7d014012ad3fd54f 100644 (file)
@@ -12,6 +12,8 @@ enum Track_flags
     RESPONSE = 1 << 0, // binary 0001
     AUTO_CORRELATION = 1 << 1, // binary 0010
     CROSS_CORRELATION = 1 << 2, // binary 0100
+    SCALE_RESPONSE = 1 << 3,// binary 1000
+    TRACKER_UPDATE = 1 << 4,// binary 0001 0000
 };
 
 struct Scale_vars
@@ -24,7 +26,7 @@ struct Scale_vars
     std::vector<cv::Mat> patch_feats;
 
     cv::Mat in_all, ifft2_res, response;
-    ComplexMat zf, kzf, kf, xyf;
+    ComplexMat zf, kzf, kf, xyf, xf;
 
     Track_flags flag;