Update COLMAP integration for 4.1.0: add GLOMAP mapper and matching type options

#3
by cllim118 - opened
Files changed (3) hide show
  1. colmap_mapper.sh +22 -11
  2. colmap_matcher.sh +108 -84
  3. colmap_reconstruction.sh +7 -5
colmap_mapper.sh CHANGED
@@ -8,6 +8,7 @@ settings_yaml="$4"
8
  calibration_yaml="$5"
9
  rgb_csv="$6"
10
  camera_name="$7"
 
11
 
12
  exp_folder_colmap="${exp_folder}/colmap_${exp_id}"
13
  rgb_dir="${camera_name}"
@@ -25,19 +26,29 @@ then
25
  ba_refine_extra_params="1"
26
  fi
27
 
28
- echo " colmap mapper ..."
29
  database="${exp_folder_colmap}/colmap_database.db"
30
 
31
- colmap mapper \
32
- --database_path ${database} \
33
- --image_path ${rgb_path} \
34
- --output_path ${exp_folder_colmap} \
35
- --Mapper.ba_refine_focal_length ${ba_refine_focal_length} \
36
- --Mapper.ba_refine_principal_point ${ba_refine_principal_point} \
37
- --Mapper.ba_refine_extra_params ${ba_refine_extra_params}
 
 
 
 
 
 
 
 
 
 
 
 
 
38
 
39
  echo " colmap model_converter ..."
40
  colmap model_converter \
41
- --input_path ${exp_folder_colmap}/0 --output_path ${exp_folder_colmap} --output_type TXT
42
-
43
-
 
8
  calibration_yaml="$5"
9
  rgb_csv="$6"
10
  camera_name="$7"
11
+ mapper_type="$8"
12
 
13
  exp_folder_colmap="${exp_folder}/colmap_${exp_id}"
14
  rgb_dir="${camera_name}"
 
26
  ba_refine_extra_params="1"
27
  fi
28
 
 
29
  database="${exp_folder_colmap}/colmap_database.db"
30
 
31
+ if [ "${mapper_type}" == "glomap" ]
32
+ then
33
+ echo " global mapper (GLOMAP) ..."
34
+ colmap global_mapper \
35
+ --database_path ${database} \
36
+ --image_path ${rgb_path} \
37
+ --output_path ${exp_folder_colmap} \
38
+ --GlobalMapper.ba_refine_focal_length ${ba_refine_focal_length} \
39
+ --GlobalMapper.ba_refine_principal_point ${ba_refine_principal_point} \
40
+ --GlobalMapper.ba_refine_extra_params ${ba_refine_extra_params}
41
+ else
42
+ echo " colmap mapper (COLMAP) ..."
43
+ colmap mapper \
44
+ --database_path ${database} \
45
+ --image_path ${rgb_path} \
46
+ --output_path ${exp_folder_colmap} \
47
+ --Mapper.ba_refine_focal_length ${ba_refine_focal_length} \
48
+ --Mapper.ba_refine_principal_point ${ba_refine_principal_point} \
49
+ --Mapper.ba_refine_extra_params ${ba_refine_extra_params}
50
+ fi
51
 
52
  echo " colmap model_converter ..."
53
  colmap model_converter \
54
+ --input_path ${exp_folder_colmap}/0 --output_path ${exp_folder_colmap} --output_type TXT
 
 
colmap_matcher.sh CHANGED
@@ -3,19 +3,47 @@ echo ""
3
  echo "Executing colmap_matcher.sh ..."
4
 
5
  sequence_path="$1"
6
- exp_folder="$2"
7
- exp_id="$3"
8
  settings_yaml="$4"
9
  calibration_yaml="$5"
10
  rgb_csv="$6"
11
  matcher_type="$7"
12
  use_gpu="$8"
13
  camera_name="$9"
 
14
 
15
  exp_folder_colmap="${exp_folder}/colmap_${exp_id}"
16
  rgb_dir=$(awk -F, 'NR==2 { split($2,a,"/"); print a[1]; exit }' "$rgb_csv")
17
  rgb_path="${sequence_path}/${rgb_dir}"
18
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
19
  # Get calibration model
20
  read -r calibration_model more_ <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
21
 
@@ -26,98 +54,104 @@ python3 Baselines/colmap/create_colmap_image_list.py "$rgb_csv" "$colmap_image_l
26
  # Create Colmap Database
27
  database="${exp_folder_colmap}/colmap_database.db"
28
  rm -rf ${database}
29
- colmap database_creator --database_path ${database}
30
 
31
  # Feature extractor
32
- echo " colmap feature_extractor ..."
33
 
34
  if [ "${calibration_model}" == "unknown" ]
35
  then
36
- echo " camera model : $calibration_model"
37
- colmap feature_extractor \
38
- --database_path ${database} \
39
- --image_path ${rgb_path} \
40
- --image_list_path ${colmap_image_list} \
41
- --ImageReader.camera_model SIMPLE_PINHOLE \
42
- --ImageReader.single_camera 1 \
43
- --ImageReader.single_camera_per_folder 1 \
44
- --FeatureExtraction.use_gpu ${use_gpu}
 
45
  fi
46
 
47
  if [ "${calibration_model}" == "pinhole" ]
48
  then
49
- read -r calibration_model fx fy cx cy <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
50
- echo " camera model : $calibration_model"
51
- echo " fx: $fx , fy: $fy , cx: $cx , cy: $cy"
52
- colmap feature_extractor \
53
- --database_path ${database} \
54
- --image_path ${rgb_path} \
55
- --image_list_path ${colmap_image_list} \
56
- --ImageReader.camera_model PINHOLE \
57
- --ImageReader.single_camera 1 \
58
- --ImageReader.single_camera_per_folder 1 \
59
- --FeatureExtraction.use_gpu ${use_gpu} \
60
- --ImageReader.camera_params "${fx},${fy},${cx},${cy}"
 
61
  fi
62
 
63
  if [ "${calibration_model}" == "radtan4" ]
64
  then
65
- read -r calibration_model fx fy cx cy k1 k2 p1 p2 <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
66
- echo " camera model : $calibration_model"
67
- echo " fx: $fx , fy: $fy , cx: $cx , cy: $cy"
68
- echo " k1: $k1 , k2: $k2 , p1: $p1 , p2: $p2"
69
- colmap feature_extractor \
70
- --database_path ${database} \
71
- --image_path ${rgb_path} \
72
- --image_list_path ${colmap_image_list} \
73
- --ImageReader.camera_model "OPENCV" \
74
- --ImageReader.single_camera 1 \
75
- --ImageReader.single_camera_per_folder 0 \
76
- --FeatureExtraction.use_gpu ${use_gpu} \
77
- --ImageReader.camera_params "${fx},${fy},${cx},${cy},${k1},${k2},${p1},${p2}"
 
78
  fi
79
 
80
  if [ "${calibration_model}" == "radtan5" ]
81
  then
82
- read -r calibration_model fx fy cx cy k1 k2 p1 p2 k3 <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
83
- echo " camera model : $calibration_model"
84
- echo " fx: $fx , fy: $fy , cx: $cx , cy: $cy"
85
- echo " k1: $k1 , k2: $k2 , p1: $p1 , p2: $p2, k3: $k3"
86
- colmap feature_extractor \
87
- --database_path ${database} \
88
- --image_path ${rgb_path} \
89
- --image_list_path ${colmap_image_list} \
90
- --ImageReader.camera_model "FULL_OPENCV" \
91
- --ImageReader.single_camera 1 \
92
- --ImageReader.single_camera_per_folder 1 \
93
- --FeatureExtraction.use_gpu ${use_gpu} \
94
- --ImageReader.camera_params "${fx},${fy},${cx},${cy},${k1},${k2},${p1},${p2},${k3},0,0,0"
 
95
  fi
96
 
97
  if [ "${calibration_model}" == "equid4" ]
98
  then
99
- read -r calibration_model fx fy cx cy k1 k2 k3 k4 <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
100
- echo " camera model : $calibration_model"
101
- echo " fx: $fx , fy: $fy , cx: $cx , cy: $cy"
102
- echo " k1: $k1 , k2: $k2 , k3: $k3 , k4: $k4"
103
- colmap feature_extractor \
104
- --database_path ${database} \
105
- --image_path ${rgb_path} \
106
- --image_list_path ${colmap_image_list} \
107
- --ImageReader.camera_model "OPENCV_FISHEYE"\
108
- --ImageReader.single_camera 1 \
109
- --ImageReader.single_camera_per_folder 1 \
110
- --FeatureExtraction.use_gpu ${use_gpu} \
111
- --ImageReader.camera_params "${fx},${fy},${cx},${cy},${k1},${k2},${k3},${k4}"
 
112
  fi
113
 
114
  # Exhaustive Feature Matcher
115
- if [ "${matcher_type}" == "exhaustive" ]
116
  then
117
- echo " colmap exhaustive_matcher ..."
118
  colmap exhaustive_matcher \
119
- --database_path ${database} \
120
- --FeatureMatching.use_gpu ${use_gpu}
 
121
  fi
122
 
123
  # Sequential Feature Matcher
@@ -126,30 +160,20 @@ then
126
  num_rgb=$(( $(wc -l < "$rgb_csv") - 1 ))
127
 
128
  # Pick vocabulary tree based on the number of images
129
- vocabulary_tree="Baselines/colmap/vocab_tree_faiss_flickr100K_words32K.bin"
130
  if [ "$num_rgb" -gt 1000 ]; then
131
- vocabulary_tree="Baselines/colmap/vocab_tree_faiss_flickr100K_words256K.bin"
132
  fi
133
  if [ "$num_rgb" -gt 10000 ]; then
134
- vocabulary_tree="Baselines/colmap/vocab_tree_faiss_flickr100K_words1M.bin"
135
  fi
136
 
137
- echo " colmap sequential_matcher ..."
138
  echo " Vocabulary Tree: $vocabulary_tree"
139
  colmap sequential_matcher \
140
  --database_path "${database}" \
141
  --SequentialMatching.loop_detection 1 \
142
  --SequentialMatching.vocab_tree_path ${vocabulary_tree} \
 
143
  --FeatureMatching.use_gpu "${use_gpu}"
144
- fi
145
-
146
- # LightGlue Feature Matcher
147
- if [ "${matcher_type}" == "custom" ]
148
- then
149
- colmap exhaustive_matcher \
150
- --database_path ${database} \
151
- --FeatureMatching.use_gpu ${use_gpu}
152
-
153
- pixi run -e lightglue python3 Baselines/colmap/feature_matcher.py --database ${database} --rgb_path ${rgb_path} --rgb_csv ${rgb_csv}
154
- fi
155
-
 
3
  echo "Executing colmap_matcher.sh ..."
4
 
5
  sequence_path="$1"
6
+ exp_folder="$2"
7
+ exp_id="$3"
8
  settings_yaml="$4"
9
  calibration_yaml="$5"
10
  rgb_csv="$6"
11
  matcher_type="$7"
12
  use_gpu="$8"
13
  camera_name="$9"
14
+ matching_type="${10}"
15
 
16
  exp_folder_colmap="${exp_folder}/colmap_${exp_id}"
17
  rgb_dir=$(awk -F, 'NR==2 { split($2,a,"/"); print a[1]; exit }' "$rgb_csv")
18
  rgb_path="${sequence_path}/${rgb_dir}"
19
 
20
+ # matching_type: FeatureExtraction.type + FeatureMatching.type
21
+ feature_matching_type=""
22
+ feature_extraction_type="SIFT"
23
+
24
+ case "${matching_type}" in
25
+ sift_bruteforce)
26
+ feature_extraction_type="SIFT"
27
+ feature_matching_type="SIFT_BRUTEFORCE"
28
+ ;;
29
+ sift_lightglue)
30
+ feature_extraction_type="SIFT"
31
+ feature_matching_type="SIFT_LIGHTGLUE"
32
+ ;;
33
+ aliked_bruteforce)
34
+ feature_extraction_type="ALIKED_N16ROT"
35
+ feature_matching_type="ALIKED_BRUTEFORCE"
36
+ ;;
37
+ aliked_lightglue)
38
+ feature_extraction_type="ALIKED_N16ROT"
39
+ feature_matching_type="ALIKED_LIGHTGLUE"
40
+ ;;
41
+ *)
42
+ echo "Unknown matching_type: ${matching_type}"
43
+ exit 1
44
+ ;;
45
+ esac
46
+
47
  # Get calibration model
48
  read -r calibration_model more_ <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
49
 
 
54
  # Create Colmap Database
55
  database="${exp_folder_colmap}/colmap_database.db"
56
  rm -rf ${database}
57
+ colmap database_creator --database_path ${database}
58
 
59
  # Feature extractor
60
+ echo " colmap feature_extractor (${feature_extraction_type}) ..."
61
 
62
  if [ "${calibration_model}" == "unknown" ]
63
  then
64
+ echo " camera model : $calibration_model"
65
+ colmap feature_extractor \
66
+ --database_path ${database} \
67
+ --image_path ${rgb_path} \
68
+ --image_list_path ${colmap_image_list} \
69
+ --ImageReader.camera_model OPENCV \
70
+ --ImageReader.single_camera 1 \
71
+ --ImageReader.single_camera_per_folder 1 \
72
+ --FeatureExtraction.type ${feature_extraction_type} \
73
+ --FeatureExtraction.use_gpu ${use_gpu}
74
  fi
75
 
76
  if [ "${calibration_model}" == "pinhole" ]
77
  then
78
+ read -r calibration_model fx fy cx cy <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
79
+ echo " camera model : $calibration_model"
80
+ echo " fx: $fx , fy: $fy , cx: $cx , cy: $cy"
81
+ colmap feature_extractor \
82
+ --database_path ${database} \
83
+ --image_path ${rgb_path} \
84
+ --image_list_path ${colmap_image_list} \
85
+ --ImageReader.camera_model PINHOLE \
86
+ --ImageReader.single_camera 1 \
87
+ --ImageReader.single_camera_per_folder 1 \
88
+ --FeatureExtraction.type ${feature_extraction_type} \
89
+ --FeatureExtraction.use_gpu ${use_gpu} \
90
+ --ImageReader.camera_params "${fx},${fy},${cx},${cy}"
91
  fi
92
 
93
  if [ "${calibration_model}" == "radtan4" ]
94
  then
95
+ read -r calibration_model fx fy cx cy k1 k2 p1 p2 <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
96
+ echo " camera model : $calibration_model"
97
+ echo " fx: $fx , fy: $fy , cx: $cx , cy: $cy"
98
+ echo " k1: $k1 , k2: $k2 , p1: $p1 , p2: $p2"
99
+ colmap feature_extractor \
100
+ --database_path ${database} \
101
+ --image_path ${rgb_path} \
102
+ --image_list_path ${colmap_image_list} \
103
+ --ImageReader.camera_model "OPENCV" \
104
+ --ImageReader.single_camera 1 \
105
+ --ImageReader.single_camera_per_folder 1 \
106
+ --FeatureExtraction.type ${feature_extraction_type} \
107
+ --FeatureExtraction.use_gpu ${use_gpu} \
108
+ --ImageReader.camera_params "${fx},${fy},${cx},${cy},${k1},${k2},${p1},${p2}"
109
  fi
110
 
111
  if [ "${calibration_model}" == "radtan5" ]
112
  then
113
+ read -r calibration_model fx fy cx cy k1 k2 p1 p2 k3 <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
114
+ echo " camera model : $calibration_model"
115
+ echo " fx: $fx , fy: $fy , cx: $cx , cy: $cy"
116
+ echo " k1: $k1 , k2: $k2 , p1: $p1 , p2: $p2, k3: $k3"
117
+ colmap feature_extractor \
118
+ --database_path ${database} \
119
+ --image_path ${rgb_path} \
120
+ --image_list_path ${colmap_image_list} \
121
+ --ImageReader.camera_model "FULL_OPENCV" \
122
+ --ImageReader.single_camera 1 \
123
+ --ImageReader.single_camera_per_folder 1 \
124
+ --FeatureExtraction.type ${feature_extraction_type} \
125
+ --FeatureExtraction.use_gpu ${use_gpu} \
126
+ --ImageReader.camera_params "${fx},${fy},${cx},${cy},${k1},${k2},${p1},${p2},${k3},0,0,0"
127
  fi
128
 
129
  if [ "${calibration_model}" == "equid4" ]
130
  then
131
+ read -r calibration_model fx fy cx cy k1 k2 k3 k4 <<< $(python3 Baselines/colmap/get_calibration.py "$calibration_yaml" "$camera_name")
132
+ echo " camera model : $calibration_model"
133
+ echo " fx: $fx , fy: $fy , cx: $cx , cy: $cy"
134
+ echo " k1: $k1 , k2: $k2 , k3: $k3 , k4: $k4"
135
+ colmap feature_extractor \
136
+ --database_path ${database} \
137
+ --image_path ${rgb_path} \
138
+ --image_list_path ${colmap_image_list} \
139
+ --ImageReader.camera_model "OPENCV_FISHEYE" \
140
+ --ImageReader.single_camera 1 \
141
+ --ImageReader.single_camera_per_folder 1 \
142
+ --FeatureExtraction.type ${feature_extraction_type} \
143
+ --FeatureExtraction.use_gpu ${use_gpu} \
144
+ --ImageReader.camera_params "${fx},${fy},${cx},${cy},${k1},${k2},${k3},${k4}"
145
  fi
146
 
147
  # Exhaustive Feature Matcher
148
+ if [ "${matcher_type}" == "exhaustive" ];
149
  then
150
+ echo " colmap exhaustive_matcher (${feature_matching_type}) ..."
151
  colmap exhaustive_matcher \
152
+ --database_path "${database}" \
153
+ --FeatureMatching.type "${feature_matching_type}" \
154
+ --FeatureMatching.use_gpu "${use_gpu}"
155
  fi
156
 
157
  # Sequential Feature Matcher
 
160
  num_rgb=$(( $(wc -l < "$rgb_csv") - 1 ))
161
 
162
  # Pick vocabulary tree based on the number of images
163
+ vocabulary_tree="Baselines/colmap/vocab_tree_flickr100K_words32K.bin"
164
  if [ "$num_rgb" -gt 1000 ]; then
165
+ vocabulary_tree="Baselines/colmap/vocab_tree_flickr100K_words256K.bin"
166
  fi
167
  if [ "$num_rgb" -gt 10000 ]; then
168
+ vocabulary_tree="Baselines/colmap/vocab_tree_flickr100K_words1M.bin"
169
  fi
170
 
171
+ echo " colmap sequential_matcher (${feature_matching_type}) ..."
172
  echo " Vocabulary Tree: $vocabulary_tree"
173
  colmap sequential_matcher \
174
  --database_path "${database}" \
175
  --SequentialMatching.loop_detection 1 \
176
  --SequentialMatching.vocab_tree_path ${vocabulary_tree} \
177
+ --FeatureMatching.type "${feature_matching_type}" \
178
  --FeatureMatching.use_gpu "${use_gpu}"
179
+ fi
 
 
 
 
 
 
 
 
 
 
 
colmap_reconstruction.sh CHANGED
@@ -2,6 +2,8 @@
2
 
3
  # Default values
4
  matcher_type="exhaustive"
 
 
5
  use_gpu="1"
6
  verbose="0"
7
  settings_yaml=""
@@ -33,6 +35,8 @@ echo " Experiment Folder : $exp_folder"
33
  echo " Experiment ID : $exp_id"
34
  echo " Verbose : $verbose"
35
  echo " Matcher Type : $matcher_type"
 
 
36
  echo " Use GPU : $use_gpu"
37
  echo " Settings YAML : $settings_yaml"
38
  echo " Calibration YAML : $calibration_yaml"
@@ -48,8 +52,8 @@ mkdir "$exp_folder_colmap"
48
  # Run COLMAP scripts for matching and mapping
49
  export QT_QPA_PLATFORM_PLUGIN_PATH="$CONDA_PREFIX/plugins/platforms"
50
  colmap_args="$sequence_path $exp_folder $exp_id $settings_yaml $calibration_yaml $rgb_csv"
51
- ./Baselines/colmap/colmap_matcher.sh $colmap_args $matcher_type $use_gpu $camera_name
52
- ./Baselines/colmap/colmap_mapper.sh $colmap_args $camera_name
53
 
54
  # Convert COLMAP outputs to a format suitable for VSLAM-LAB
55
  python Baselines/colmap/colmap_to_vslamlab.py $sequence_path $exp_folder $exp_id $verbose $rgb_csv $camera_name
@@ -64,6 +68,4 @@ if [ "$verbose" -eq 1 ]; then
64
  fi
65
 
66
  # # Remove colmap data
67
- # rm -rf ${exp_folder_colmap}
68
-
69
-
 
2
 
3
  # Default values
4
  matcher_type="exhaustive"
5
+ matching_type="sift_bruteforce"
6
+ mapper_type="colmap"
7
  use_gpu="1"
8
  verbose="0"
9
  settings_yaml=""
 
35
  echo " Experiment ID : $exp_id"
36
  echo " Verbose : $verbose"
37
  echo " Matcher Type : $matcher_type"
38
+ echo " Matching Type : $matching_type"
39
+ echo " Mapper Type : $mapper_type"
40
  echo " Use GPU : $use_gpu"
41
  echo " Settings YAML : $settings_yaml"
42
  echo " Calibration YAML : $calibration_yaml"
 
52
  # Run COLMAP scripts for matching and mapping
53
  export QT_QPA_PLATFORM_PLUGIN_PATH="$CONDA_PREFIX/plugins/platforms"
54
  colmap_args="$sequence_path $exp_folder $exp_id $settings_yaml $calibration_yaml $rgb_csv"
55
+ ./Baselines/colmap/colmap_matcher.sh $colmap_args $matcher_type $use_gpu $camera_name $matching_type
56
+ ./Baselines/colmap/colmap_mapper.sh $colmap_args $camera_name $mapper_type
57
 
58
  # Convert COLMAP outputs to a format suitable for VSLAM-LAB
59
  python Baselines/colmap/colmap_to_vslamlab.py $sequence_path $exp_folder $exp_id $verbose $rgb_csv $camera_name
 
68
  fi
69
 
70
  # # Remove colmap data
71
+ # rm -rf ${exp_folder_colmap}