You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
227 lines
7.6 KiB
227 lines
7.6 KiB
////////////////////////////////////////////////////////////////////////////
|
|
// File: ConfigBA.h
|
|
// Author: Changchang Wu (ccwu@cs.washington.edu)
|
|
// Description : configuration object class
|
|
//
|
|
// Copyright (c) 2011 Changchang Wu (ccwu@cs.washington.edu)
|
|
// and the University of Washington at Seattle
|
|
//
|
|
// This library is free software; you can redistribute it and/or
|
|
// modify it under the terms of the GNU General Public
|
|
// License as published by the Free Software Foundation; either
|
|
// Version 3 of the License, or (at your option) any later version.
|
|
//
|
|
// This library is distributed in the hope that it will be useful,
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
// General Public License for more details.
|
|
//
|
|
////////////////////////////////////////////////////////////////////////////////
|
|
|
|
#ifndef CONFIG_BA_H
|
|
#define CONFIG_BA_H
|
|
#include <vector>
|
|
|
|
namespace pba {
|
|
|
|
class ConfigBA {
|
|
protected:
|
|
enum {
|
|
TIMER_OVERALL = 0,
|
|
TIMER_OPTIMIZATION,
|
|
TIMER_GPU_ALLOCATION,
|
|
TIMER_GPU_UPLOAD,
|
|
TIMER_PREPROCESSING,
|
|
TIMER_GPU_DOWNLOAD,
|
|
TIMER_CG_ITERATION,
|
|
TIMER_LM_ITERATION,
|
|
TIMER_FUNCTION_JJ,
|
|
TIMER_FUNCTION_PJ,
|
|
TIMER_FUNCTION_DD,
|
|
TIMER_FUNCTION_JX,
|
|
TIMER_FUNCTION_JTE,
|
|
TIMER_FUNCTION_BC,
|
|
TIMER_FUNCTION_MP,
|
|
TIMER_FUNCTION_UP,
|
|
TIMER_PROFILE_STEP,
|
|
NUM_TIMER,
|
|
FUNC_JX = 0,
|
|
FUNC_JX_,
|
|
FUNC_JTEC_JCT,
|
|
FUNC_JTEC_JCO,
|
|
FUNC_JTEP,
|
|
FUNC_JTE_,
|
|
FUNC_JJ_JCO_JCT_JP,
|
|
FUNC_JJ_JCO_JP,
|
|
FUNC_JJ_JCT_JP,
|
|
FUNC_JJ_JP,
|
|
FUNC_PJ,
|
|
FUNC_BCC_JCT,
|
|
FUNC_BCC_JCO,
|
|
FUNC_BCP,
|
|
FUNC_MPC,
|
|
FUNC_MPP,
|
|
FUNC_VS,
|
|
FUNC_VV,
|
|
NUM_FUNC
|
|
};
|
|
class TimerBA {
|
|
ConfigBA* _config;
|
|
int _timer;
|
|
|
|
public:
|
|
TimerBA(ConfigBA* config, int timer) {
|
|
(_config = config)->BundleTimerStart(_timer = timer);
|
|
}
|
|
TimerBA(ConfigBA* config, int timer, bool) {
|
|
(_config = config)->BundleTimerSwitch(_timer = timer);
|
|
}
|
|
~TimerBA() { _config->BundleTimerSwitch(_timer); }
|
|
};
|
|
friend class TimerBA;
|
|
|
|
public:
|
|
//////////////////////////////
|
|
int __lm_max_iteration; //(default 50)
|
|
int __cg_max_iteration; //(default 100)
|
|
int __cg_min_iteration; //(default 10)
|
|
int __cg_recalculate_freq; //(default 0)
|
|
bool __accurate_gain_ratio; //(default true) accurate gain ratio for
|
|
//approximate solutions
|
|
|
|
//////////////////////////////
|
|
float __lm_delta_threshold; //(default 1e-6)|dx|_2, I use absolute (not
|
|
//relative) change
|
|
float __lm_gradient_threshold; //(default 1e-10)|Jt * e|_inf
|
|
float __lm_mse_threshold; //(default 0.25) quit if MSE is equal to or smaller
|
|
//than this
|
|
float __lm_initial_damp; //(default 0.001)initial damping factor
|
|
float __lm_minimum_damp; //(default 1e-10)minimum damping factor
|
|
float __lm_maximum_damp;
|
|
float __cg_norm_threshold; //(default 0.1)terminate CG if norm ratio is less
|
|
//than threshold
|
|
float __cg_norm_guard; //(default 1.0)abort cg when norm increases to
|
|
int __pba_experimental;
|
|
bool __cg_schur_complement;
|
|
|
|
//////////////////////////////
|
|
bool __lm_check_gradient; //(default false) check g_inf for convergence
|
|
float __lm_damping_auto_switch;
|
|
bool __lm_use_diagonal_damp; //(default true)use (Jt*J + lambda * diag(Jt*J))
|
|
//= Jt * e
|
|
// or use (Jt*J + lambda * I) = Jt * e
|
|
bool __fixed_intrinsics; //(default false) set true for calibrated camera
|
|
//system
|
|
int __use_radial_distortion; //(default 0, 1 for projection distortion, 2 for
|
|
//measurement distortion)
|
|
bool __reset_initial_distortion; //(default false) reset the initial
|
|
//distortio to 0
|
|
|
|
////////////////////////////
|
|
int __verbose_level; //(default 2) how many messages to print out
|
|
bool __abort_flag; //(default false)abort the bundle adjustment loop if set
|
|
//true
|
|
bool __verbose_cg_iteration; //(default false)print out details of Conjugate
|
|
//Gradients
|
|
bool __verbose_function_time; //(default false)print timing of some key
|
|
//functions
|
|
bool __save_gradient_norm; //(default false)save |Jt * e|_2 of each iteration
|
|
bool __verbose_allocation; //(default false)whether print out allocation
|
|
//details
|
|
bool __verbose_sse; //(default false) show mse or sse
|
|
|
|
///////////////////////////////////
|
|
bool __jc_store_transpose; //(default true) whether store transpose of JC
|
|
bool __no_jacobian_store; //(default false) whether use memory saving mode
|
|
bool __jc_store_original; //(default true) whether store original JC
|
|
|
|
///////////////////////////////////
|
|
bool __jacobian_normalize; //(default true) scaling the jacobians according
|
|
//to initial jacobians
|
|
bool __focal_normalize; //(default true) data normalization
|
|
bool __depth_normalize; //(default true) data normalization
|
|
bool __depth_degeneracy_fix;
|
|
float __data_normalize_median;
|
|
float __depth_check_epsilon;
|
|
/////////////////////////////
|
|
|
|
protected:
|
|
bool __multiply_jx_usenoj; // for debug purpose
|
|
protected:
|
|
/////////////////////////////
|
|
int __selected_device;
|
|
int __cpu_data_precision;
|
|
int __bundle_time_budget;
|
|
int __bundle_mode_next;
|
|
int __bundle_current_mode;
|
|
//////////////////////////////
|
|
float __initial_mse;
|
|
float __final_mse;
|
|
float __final_mse_x;
|
|
float __focal_scaling;
|
|
float __depth_scaling;
|
|
int __current_device;
|
|
int __current_iteration;
|
|
int __num_cg_iteration;
|
|
int __num_lm_success;
|
|
int __num_lm_iteration;
|
|
int __num_projection_eval;
|
|
int __num_jacobian_eval;
|
|
int __num_camera_modified;
|
|
int __num_point_behind;
|
|
int __pba_return_code;
|
|
int __recent_cg_status;
|
|
int __profile_pba;
|
|
bool __cpu_thread_profile;
|
|
bool __debug_pba;
|
|
bool __warmup_device;
|
|
size_t __memory_usage;
|
|
/////////////////////////////////////
|
|
bool __matlab_format_stat;
|
|
char* __stat_filename;
|
|
const char* __driver_output;
|
|
std::vector<float> __bundle_records;
|
|
double __timer_record[NUM_TIMER];
|
|
int __num_cpu_thread_all;
|
|
int __num_cpu_thread[NUM_FUNC];
|
|
|
|
protected:
|
|
ConfigBA();
|
|
///////////////////////////////
|
|
void ResetTemporarySetting();
|
|
void ResetBundleStatistics();
|
|
void PrintBundleStatistics();
|
|
void SaveBundleStatistics(int ncam, int npt, int nproj);
|
|
///////////////////////////////////////
|
|
void BundleTimerStart(int timer);
|
|
void BundleTimerSwitch(int timer);
|
|
float BundleTimerGet(int timer);
|
|
void BundleTimerSwap(int timer1, int timer2);
|
|
float BundleTimerGetNow(int timer = TIMER_OPTIMIZATION);
|
|
/////////////////////////////////
|
|
void SaveBundleRecord(int iter, float res, float damping, float gn, float gi);
|
|
bool IsTimeBudgetAvailable();
|
|
double MyClock();
|
|
|
|
public:
|
|
void ParseParam(int argc, char** argv);
|
|
|
|
public:
|
|
// the following are to be called after finishing BA
|
|
const char* GetOutputParam() { return __driver_output; }
|
|
float GetInitialMSE() { return __initial_mse; }
|
|
float GetFinalMSE() { return __final_mse; }
|
|
double GetBundleTiming(int timer = TIMER_OVERALL) {
|
|
return __timer_record[timer];
|
|
}
|
|
int GetIterationsLM() { return __num_lm_iteration; }
|
|
int GetIterationsCG() { return __num_cg_iteration; }
|
|
int GetCurrentDevice() { return __current_device; }
|
|
int GetBundleReturnCode() { return __pba_return_code; }
|
|
int GetActiveDevice() { return __selected_device; }
|
|
};
|
|
|
|
} // namespace pba
|
|
|
|
#endif
|