ACloudViewer  3.9.4
A Modern Library for 3D Data Processing
SparseBundleCU.h
Go to the documentation of this file.
1 // File: SparseBundleCU.h
3 // Author: Changchang Wu (ccwu@cs.washington.edu)
4 // Description : interface of the CUDA-version of multicore bundle
5 // adjustment
6 //
7 // Copyright (c) 2011 Changchang Wu (ccwu@cs.washington.edu)
8 // and the University of Washington at Seattle
9 //
10 // This library is free software; you can redistribute it and/or
11 // modify it under the terms of the GNU General Public
12 // License as published by the Free Software Foundation; either
13 // Version 3 of the License, or (at your option) any later version.
14 //
15 // This library is distributed in the hope that it will be useful,
16 // but WITHOUT ANY WARRANTY; without even the implied warranty of
17 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
18 // General Public License for more details.
19 //
21 
22 #if !defined(SPARSE_BUNDLE_CU_H)
23 #define SPARSE_BUNDLE_CU_H
24 
25 #include "ConfigBA.h"
26 #include "CuTexImage.h"
27 #include "DataInterface.h"
28 
29 namespace pba {
30 
31 class SparseBundleCU : public ParallelBA, public ConfigBA {
32  protected: // cpu data
37  float* _point_data;
39  const float* _imgpt_data;
40  const int* _camera_idx;
41  const int* _point_idx;
42  const int* _focal_mask;
43  std::vector<float> _imgpt_datax;
45  float _projection_sse; // sumed square error
46  protected: // cuda data
61 
67 
76 
78  protected:
80  float _weight_q;
85 
86  protected:
87  bool ProcessIndexCameraQ(std::vector<int>& qmap, std::vector<int>& qlist);
88  void ProcessWeightCameraQ(std::vector<int>& cpnum, std::vector<int>& qmap,
89  std::vector<float>& qmapw,
90  std::vector<float>& qlistw);
91 
92  protected: // internal functions
93  int GetParameterLength();
94  int InitializeBundle();
95  int ValidateInputData();
96  void ReleaseAllocatedData();
98  bool InitializeBundleGPU();
99  bool TransferDataToGPU();
100  void TransferDataToHost();
101  void DenormalizeData();
102  void NormalizeData();
103  void NormalizeDataF();
104  void NormalizeDataD();
105  void DebugProjections();
106  void RunDebugSteps();
107  bool CheckRequiredMem(int fresh = 1);
108  bool CheckRequiredMemX();
109  void ReserveStorage(size_t ncam, size_t npt, size_t nproj);
110  void ReserveStorageAuto();
111 
112  protected:
114  CuTexImage& proj);
116  CuTexImage& proj);
117  float UpdateCameraPoint(CuTexImage& dx, CuTexImage& cuImageTempProj);
118  float SaveUpdatedSystem(float residual_reduction, float dx_sqnorm,
119  float damping);
120  float EvaluateDeltaNorm();
121  void EvaluateJacobians(bool shuffle = true);
123  void ComputeJtE(CuTexImage& E, CuTexImage& JtE, int mode = 0);
124  void ComputeJX(CuTexImage& X, CuTexImage& JX, int mode = 0);
125  void ComputeDiagonal(CuTexImage& JJ, CuTexImage& JJI);
126  void ComputeBlockPC(float lambda, bool dampd = true);
127  void ApplyBlockPC(CuTexImage& v, CuTexImage& pv, int mode = 0);
128  int SolveNormalEquationPCGB(float lambda);
129  int SolveNormalEquationPCGX(float lambda);
130  int SolveNormalEquation(float lambda);
132  void NonlinearOptimizeLM();
133  void BundleAdjustment();
134  void RunTestIterationLM(bool reduced);
135  void SaveBundleRecord(int iter, float res, float damping, float& g_norm,
136  float& g_inf);
138  void SaveNormalEquation(float lambda);
139  void RunProfileSteps();
140  void WarmupDevice();
141 
142  public:
143  virtual float GetMeanSquaredError();
144  virtual void SetCameraData(size_t ncam, CameraT* cams);
145  virtual void SetPointData(size_t npoint, Point3D* pts);
146  virtual void SetProjection(size_t nproj, const Point2D* imgpts,
147  const int* point_idx, const int* cam_idx);
148  virtual void SetFocalMask(const int* fmask, float weight);
149  virtual int RunBundleAdjustment();
150 
152  virtual void AbortBundleAdjustment() { __abort_flag = true; }
153  virtual int GetCurrentIteration() { return __current_iteration; }
154  virtual void SetNextTimeBudget(int seconds) {
156  }
157  virtual void SetNextBundleMode(BundleModeT mode) {
158  __bundle_mode_next = mode;
159  }
160  virtual void SetFixedIntrinsics(bool fixed) { __fixed_intrinsics = fixed; }
163  }
164  virtual void ParseParam(int narg, char** argv) {
165  ConfigBA::ParseParam(narg, argv);
166  }
167  virtual ConfigBA* GetInternalConfig() { return this; }
168 
169  public:
170  SparseBundleCU(int device);
171  size_t GetMemCapacity();
172 };
173 
174 } // namespace pba
175 
176 #endif
char type
void * X
Definition: SmallVector.cpp:45
void ParseParam(int argc, char **argv)
Definition: ConfigBA.cpp:340
bool __fixed_intrinsics
Definition: ConfigBA.h:113
bool __abort_flag
Definition: ConfigBA.h:122
int __current_iteration
Definition: ConfigBA.h:164
int __bundle_mode_next
Definition: ConfigBA.h:155
int __use_radial_distortion
Definition: ConfigBA.h:115
int __bundle_time_budget
Definition: ConfigBA.h:154
CuTexImage _cuCameraMeasurementListT
CuTexImage _cuCameraData
CuTexImage _cuCameraQListW
float EvaluateProjection(CuTexImage &cam, CuTexImage &point, CuTexImage &proj)
CuTexImage _cuVectorRK
bool CheckRequiredMem(int fresh=1)
void ComputeJtE(CuTexImage &E, CuTexImage &JtE, int mode=0)
CuTexImage _cuCameraMeasurementMap
virtual void SetCameraData(size_t ncam, CameraT *cams)
CuTexImage _cuVectorPK
void EvaluateJacobians(bool shuffle=true)
virtual float GetMeanSquaredError()
CuTexImage _cuVectorJtE
LM normal equation.
const int * _camera_idx
virtual void SetNextTimeBudget(int seconds)
virtual void SetPointData(size_t npoint, Point3D *pts)
virtual void SetFocalMask(const int *fmask, float weight)
CuTexImage _cuCameraDataEX
void SaveBundleRecord(int iter, float res, float damping, float &g_norm, float &g_inf)
virtual int RunBundleAdjustment()
int SolveNormalEquation(float lambda)
CuTexImage _cuVectorSJ
CuTexImage _cuCameraQMap
float SaveUpdatedSystem(float residual_reduction, float dx_sqnorm, float damping)
virtual void EnableRadialDistortion(DistortionT type)
void ComputeBlockPC(float lambda, bool dampd=true)
virtual void SetNextBundleMode(BundleModeT mode)
CuTexImage _cuImageProj
virtual void AbortBundleAdjustment()
float UpdateCameraPoint(CuTexImage &dx, CuTexImage &cuImageTempProj)
CuTexImage _cuVectorXK
const float * _imgpt_data
CuTexImage _cuJacobianPoint
float EvaluateProjectionX(CuTexImage &cam, CuTexImage &point, CuTexImage &proj)
virtual int GetCurrentIteration()
void ApplyBlockPC(CuTexImage &v, CuTexImage &pv, int mode=0)
CuTexImage _cuJacobianCamera
void RunTestIterationLM(bool reduced)
SparseBundleCU(int device)
std::vector< float > _imgpt_datax
const int * _focal_mask
virtual void ParseParam(int narg, char **argv)
void ComputeJX(CuTexImage &X, CuTexImage &JX, int mode=0)
const int * _point_idx
CuTexImage _cuCameraMeasurementList
void ProcessWeightCameraQ(std::vector< int > &cpnum, std::vector< int > &qmap, std::vector< float > &qmapw, std::vector< float > &qlistw)
void ComputeDiagonal(CuTexImage &JJ, CuTexImage &JJI)
virtual void SetProjection(size_t nproj, const Point2D *imgpts, const int *point_idx, const int *cam_idx)
bool ProcessIndexCameraQ(std::vector< int > &qmap, std::vector< int > &qlist)
CuTexImage _cuVectorJJ
CuTexImage _cuPointData
CuTexImage _cuCameraQMapW
void SaveNormalEquation(float lambda)
CuTexImage _cuVectorJX
CuTexImage _cuPointMeasurementMap
virtual void SetFixedIntrinsics(bool fixed)
int SolveNormalEquationPCGX(float lambda)
CuTexImage _cuJacobianCameraT
CuTexImage _cuCameraQList
CuTexImage _cuMeasurements
CuTexImage _cuProjectionMap
int SolveNormalEquationPCGB(float lambda)
void ReserveStorage(size_t ncam, size_t npt, size_t nproj)
CuTexImage _cuBufferData
CuTexImage _cuVectorZK
CuTexImage _cuPointDataEX
Definition: ConfigBA.cpp:44
#define seconds
Definition: rename.h:375
Definition: lsd.c:149