virtual void set_window(const cv::Mat & window) = 0;
virtual ComplexMat forward(const cv::Mat & input) = 0;
virtual void forward(Scale_vars & vars) = 0;
- virtual ComplexMat forward_raw(float *input, bool all_scales) = 0;
+ virtual void forward_raw(Scale_vars & vars, bool all_scales) = 0;
virtual ComplexMat forward_window(const std::vector<cv::Mat> & input) = 0;
virtual void forward_window(Scale_vars & vars) = 0;
virtual cv::Mat inverse(const ComplexMat & input) = 0;
return complex_result;
}
-void cuFFT::forward(Scale_var & vars)
+void cuFFT::forward(Scale_vars & vars)
{
return;
}
-ComplexMat cuFFT::forward_raw(float *input, bool all_scales)
+void cuFFT::forward_raw(Scale_vars & vars, bool all_scales)
{
- ComplexMat complex_result;
+ ComplexMat *result = vars.flag & Track_flags::AUTO_CORRELATION ? & vars.kf : & vars.kzf;
if (all_scales){
- complex_result.create(m_height, m_width / 2 + 1, m_num_of_scales);
- CufftErrorCheck(cufftExecR2C(plan_f_all_scales, reinterpret_cast<cufftReal*>(input),
- complex_result.get_p_data()));
+ CufftErrorCheck(cufftExecR2C(plan_f_all_scales, reinterpret_cast<cufftReal*>(vars.gauss_corr_res),
+ result->get_p_data()));
} else {
- complex_result.create(m_height, m_width/ 2 + 1, 1);
- CufftErrorCheck(cufftExecR2C(plan_f, reinterpret_cast<cufftReal*>(input),
- complex_result.get_p_data()));
+ CufftErrorCheck(cufftExecR2C(plan_f, reinterpret_cast<cufftReal*>(vars.gauss_corr_res),
+ result->get_p_data()));
}
- return complex_result;
+ return;
}
ComplexMat cuFFT::forward_window(const std::vector<cv::Mat> & input)
return result;
}
-void cuFFT::forward_window(Scale_var & vars)
+void cuFFT::forward_window(Scale_vars & vars)
{
+ int n_channels = vars.patch_feats.size();
+ ComplexMat *result = vars.flag & Track_flags::TRACKER_UPDATE ? & vars.xf : & vars.zf;
+ if(n_channels > (int) m_num_of_feats){
+ cv::Mat in_all(m_height * n_channels, m_width, CV_32F, data_fw_all_scales);
+ for (int i = 0; i < n_channels; ++i) {
+ cv::Mat in_roi(in_all, cv::Rect(0, i*m_height, m_width, m_height));
+ in_roi = vars.patch_feats[i].mul(m_window);
+ }
+
+ CufftErrorCheck(cufftExecR2C(plan_fw_all_scales, reinterpret_cast<cufftReal*>(data_fw_all_scales_d), result->get_p_data()));
+ } else {
+ cv::Mat in_all(m_height * n_channels, m_width, CV_32F, data_fw);
+ for (int i = 0; i < n_channels; ++i) {
+ cv::Mat in_roi(in_all, cv::Rect(0, i*m_height, m_width, m_height));
+ in_roi = vars.patch_feats[i].mul(m_window);
+ }
+
+ CufftErrorCheck(cufftExecR2C(plan_fw, reinterpret_cast<cufftReal*>(data_fw_d), result->get_p_data()));
+ }
return;
}
return real_result/(m_width*m_height);
}
-void cuFFT::inverse(Scale_var & vars)
+void cuFFT::inverse(Scale_vars & vars)
{
return;
}
void set_window(const cv::Mat & window) override;
ComplexMat forward(const cv::Mat & input) override;
void forward(Scale_vars & vars) override;
- ComplexMat forward_raw(float *input, bool all_scales) override;
+ void forward_raw(Scale_vars & vars, bool all_scales) override;
ComplexMat forward_window(const std::vector<cv::Mat> & input) override;
void forward_window(Scale_vars & vars) override;
cv::Mat inverse(const ComplexMat & input) override;
return;
}
-ComplexMat Fftw::forward_raw(float *input, bool all_scales)
+void Fftw::forward_raw(Scale_vars & vars, bool all_scales)
{
- ComplexMat dummy;
- return dummy;
+ return;
}
ComplexMat Fftw::forward_window(const std::vector<cv::Mat> & input)
void set_window(const cv::Mat & window) override;
ComplexMat forward(const cv::Mat & input) override;
void forward(Scale_vars & vars) override;
- ComplexMat forward_raw(float *input, bool all_scales) override;
+ void forward_raw(Scale_vars & vars, bool all_scales) override;
ComplexMat forward_window(const std::vector<cv::Mat> & input) override;
void forward_window(Scale_vars & vars) override;
cv::Mat inverse(const ComplexMat & input) override;
//window weights, i.e. labels
fft.init(p_windows_size[0]/p_cell_size, p_windows_size[1]/p_cell_size, p_num_of_feats, p_num_scales, m_use_big_batch);
p_yf = fft.forward(gaussian_shaped_labels(p_output_sigma, p_windows_size[0]/p_cell_size, p_windows_size[1]/p_cell_size));
+ DEBUG_PRINTM(p_yf);
fft.set_window(cosine_window_function(p_windows_size[0]/p_cell_size, p_windows_size[1]/p_cell_size));
//obtain a sub-window for training initial model
DEBUG_PRINTM(p_model_xf);
scale_vars[0].flag = Track_flags::AUTO_CORRELATION;
+
if (m_use_linearkernel) {
ComplexMat xfconj = p_model_xf.conj();
p_model_alphaf_num = xfconj.mul(p_yf);
cudaSetDeviceFlags(cudaDeviceMapHost);
for (int i = 0;i<p_num_scales;++i) {
+ scale_vars[i].ifft2_res = cv::Mat(p_windows_size[1]/p_cell_size, p_windows_size[0]/p_cell_size, CV_32FC(p_num_of_feats));
+ scale_vars[i].response = cv::Mat(p_windows_size[1]/p_cell_size, p_windows_size[0]/p_cell_size, CV_32FC1);
+
+ scale_vars[i].zf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, p_num_of_feats);
+ scale_vars[i].kzf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, 1);
+ scale_vars[i].kf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, 1);
+
+ if (i==0)
+ scale_vars[i].xf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, p_num_of_feats);
+
CudaSafeCall(cudaHostAlloc((void**)&scale_vars[i].xf_sqr_norm, alloc_size*sizeof(float), cudaHostAllocMapped));
CudaSafeCall(cudaHostGetDevicePointer((void**)&scale_vars[i].xf_sqr_norm_d, (void*)scale_vars[i].xf_sqr_norm, 0));
scale_vars[i].response = cv::Mat(p_windows_size[1]/p_cell_size, p_windows_size[0]/p_cell_size, CV_32FC1);
scale_vars[i].zf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, p_num_of_feats);
- scale_vars[i].kzf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, p_num_of_feats);
- scale_vars[i].kf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, p_num_of_feats);
+ scale_vars[i].kzf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, 1);
+ scale_vars[i].kf = ComplexMat(p_windows_size[1]/p_cell_size, (p_windows_size[0]/p_cell_size)/2+1, 1);
//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)/2+1, p_num_of_feats);
DEBUG_PRINTM(this->p_model_alphaf * vars.kzf);
vars.flag = Track_flags::RESPONSE;
vars.kzf = this->p_model_alphaf * vars.kzf;
+ //TODO Add support for fft.inverse(vars) for CUFFT
+#ifdef CUFFT
+ vars.response = fft.inverse(vars.kzf);
+#else
fft.inverse(vars);
+#endif
}
DEBUG_PRINTM(vars.response);
DEBUG_PRINTM(vars.xyf);
#ifdef CUFFT
if(auto_correlation)
- cuda_gaussian_correlation(fft.inverse_raw(xyf), vars.gauss_corr_res, vars.xf_sqr_norm_d, vars.xf_sqr_norm_d, sigma, xf.n_channels, xf.n_scales, p_roi_height, p_roi_width);
+ cuda_gaussian_correlation(fft.inverse_raw(vars.xyf), vars.gauss_corr_res, vars.xf_sqr_norm_d, vars.xf_sqr_norm_d, sigma, xf.n_channels, xf.n_scales, p_roi_height, p_roi_width);
else
- cuda_gaussian_correlation(fft.inverse_raw(xyf), vars.gauss_corr_res, vars.xf_sqr_norm_d, vars.yf_sqr_norm_d, sigma, xf.n_channels, xf.n_scales, p_roi_height, p_roi_width);
+ cuda_gaussian_correlation(fft.inverse_raw(vars.xyf), vars.gauss_corr_res, vars.xf_sqr_norm_d, vars.yf_sqr_norm_d, sigma, xf.n_channels, xf.n_scales, p_roi_height, p_roi_width);
- return fft.forward_raw(vars.gauss_corr_res, xf.n_scales==p_num_scales);
+ fft.forward_raw(vars, xf.n_scales==p_num_scales);
+ return;
#else
//ifft2 and sum over 3rd dimension, we dont care about individual channels
fft.inverse(vars);