Realcat commited on
Commit
4d4dd90
1 Parent(s): 35cab6c

add: GIM (https://github.com/xuelunshen/gim)

Browse files
This view is limited to 50 files because it contains too many changes.   See raw diff
Files changed (50) hide show
  1. common/config.yaml +23 -1
  2. common/utils.py +50 -23
  3. common/viz.py +35 -34
  4. datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot135.jpg +3 -0
  5. datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot180.jpg +3 -0
  6. datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot225.jpg +3 -0
  7. datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot270.jpg +3 -0
  8. datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot315.jpg +3 -0
  9. datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot45.jpg +3 -0
  10. datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot90.jpg +3 -0
  11. datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot135.jpg +3 -0
  12. datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot180.jpg +3 -0
  13. datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot225.jpg +3 -0
  14. datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot270.jpg +3 -0
  15. datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot315.jpg +3 -0
  16. datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot45.jpg +3 -0
  17. datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot90.jpg +3 -0
  18. datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot135.jpg +3 -0
  19. datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot180.jpg +3 -0
  20. datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot225.jpg +3 -0
  21. datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot270.jpg +3 -0
  22. datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot315.jpg +3 -0
  23. datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot45.jpg +3 -0
  24. datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot90.jpg +3 -0
  25. datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot135.jpg +3 -0
  26. datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot180.jpg +3 -0
  27. datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot225.jpg +3 -0
  28. datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot270.jpg +3 -0
  29. datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot315.jpg +3 -0
  30. datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot45.jpg +3 -0
  31. datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot90.jpg +3 -0
  32. datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot135.jpg +3 -0
  33. datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot180.jpg +3 -0
  34. datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot225.jpg +3 -0
  35. datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot270.jpg +3 -0
  36. datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot315.jpg +3 -0
  37. datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot45.jpg +3 -0
  38. datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot90.jpg +3 -0
  39. datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot135.jpg +3 -0
  40. datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot180.jpg +3 -0
  41. datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot225.jpg +3 -0
  42. datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot270.jpg +3 -0
  43. datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot315.jpg +3 -0
  44. datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot45.jpg +3 -0
  45. datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot90.jpg +3 -0
  46. datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot135.jpg +3 -0
  47. datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot180.jpg +3 -0
  48. datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot225.jpg +3 -0
  49. datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot270.jpg +3 -0
  50. datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot315.jpg +3 -0
common/config.yaml CHANGED
@@ -16,7 +16,29 @@ defaults:
16
  setting_geometry: Homography
17
 
18
  matcher_zoo:
19
- roma:
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
20
  matcher: roma
21
  dense: true
22
  info:
 
16
  setting_geometry: Homography
17
 
18
  matcher_zoo:
19
+ DUSt3R:
20
+ # TODO: duster is under development
21
+ enable: false
22
+ matcher: duster
23
+ dense: true
24
+ info:
25
+ name: DUSt3R #dispaly name
26
+ source: "CVPR 2024"
27
+ github: https://github.com/naver/dust3r
28
+ paper: https://arxiv.org/abs/2312.14132
29
+ project: https://dust3r.europe.naverlabs.com
30
+ display: true
31
+ GIM(dkm):
32
+ matcher: gim(dkm)
33
+ dense: true
34
+ info:
35
+ name: GIM(DKM) #dispaly name
36
+ source: "ICLR 2024"
37
+ github: https://github.com/xuelunshen/gim
38
+ paper: https://arxiv.org/abs/2402.11095
39
+ project: https://xuelunshen.com/gim
40
+ display: true
41
+ RoMa:
42
  matcher: roma
43
  dense: true
44
  info:
common/utils.py CHANGED
@@ -10,11 +10,11 @@ from typing import Callable, Dict, Any, Optional, Tuple, List, Union
10
  from hloc import matchers, extractors, logger
11
  from hloc.utils.base_model import dynamic_load
12
  from hloc import match_dense, match_features, extract_features
13
- from hloc.utils.viz import add_text, plot_keypoints
14
  from .viz import (
15
  fig2im,
16
  plot_images,
17
  display_matches,
 
18
  plot_color_line_matches,
19
  )
20
  import time
@@ -131,7 +131,7 @@ def gen_examples():
131
  "dedode",
132
  "loftr",
133
  "disk",
134
- "roma",
135
  "d2net",
136
  "aspanformer",
137
  "topicfm",
@@ -148,6 +148,7 @@ def gen_examples():
148
  np.random.shuffle(new_B)
149
  return new_B.tolist()
150
 
 
151
  def gen_images_pairs(count: int = 5):
152
  path = str(ROOT / "datasets/sacre_coeur/mapping")
153
  imgs_list = [
@@ -156,9 +157,34 @@ def gen_examples():
156
  if file.lower().endswith((".jpg", ".jpeg", ".png"))
157
  ]
158
  pairs = list(combinations(imgs_list, 2))
 
 
159
  selected = random.sample(range(len(pairs)), count)
160
  return [pairs[i] for i in selected]
161
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
162
  def gen_image_pairs_wxbs(count: int = None):
163
  prefix = "datasets/wxbs_benchmark/.WxBS/v1.1"
164
  wxbs_path = ROOT / prefix
@@ -179,6 +205,7 @@ def gen_examples():
179
 
180
  # image pair path
181
  pairs = gen_images_pairs()
 
182
  pairs += gen_image_pairs_wxbs()
183
 
184
  match_setting_threshold = DEFAULT_SETTING_THRESHOLD
@@ -211,8 +238,8 @@ def gen_examples():
211
 
212
  def set_null_pred(feature_type: str, pred: dict):
213
  if feature_type == "KEYPOINT":
214
- pred["mkeypoints0_orig"] = np.array([])
215
- pred["mkeypoints1_orig"] = np.array([])
216
  pred["mmconf"] = np.array([])
217
  elif feature_type == "LINE":
218
  pred["mline_keypoints0_orig"] = np.array([])
@@ -246,9 +273,9 @@ def filter_matches(
246
  mkpts0: Optional[np.ndarray] = None
247
  mkpts1: Optional[np.ndarray] = None
248
  feature_type: Optional[str] = None
249
- if "keypoints0_orig" in pred.keys() and "keypoints1_orig" in pred.keys():
250
- mkpts0 = pred["keypoints0_orig"]
251
- mkpts1 = pred["keypoints1_orig"]
252
  feature_type = "KEYPOINT"
253
  elif (
254
  "line_keypoints0_orig" in pred.keys()
@@ -277,8 +304,8 @@ def filter_matches(
277
  mask = np.array(mask.ravel().astype("bool"), dtype="bool")
278
  if H is not None:
279
  if feature_type == "KEYPOINT":
280
- pred["mkeypoints0_orig"] = mkpts0[mask]
281
- pred["mkeypoints1_orig"] = mkpts1[mask]
282
  pred["mmconf"] = pred["mconf"][mask]
283
  elif feature_type == "LINE":
284
  pred["mline_keypoints0_orig"] = mkpts0[mask]
@@ -313,9 +340,9 @@ def compute_geometry(
313
  mkpts0: Optional[np.ndarray] = None
314
  mkpts1: Optional[np.ndarray] = None
315
 
316
- if "keypoints0_orig" in pred.keys() and "keypoints1_orig" in pred.keys():
317
- mkpts0 = pred["keypoints0_orig"]
318
- mkpts1 = pred["keypoints1_orig"]
319
  elif (
320
  "line_keypoints0_orig" in pred.keys()
321
  and "line_keypoints1_orig" in pred.keys()
@@ -654,27 +681,19 @@ def run_matching(
654
  )
655
  logger.info(f"Matching images done using: {time.time()-t1:.3f}s")
656
  t1 = time.time()
657
- # plot images with keypoints\
 
658
  titles = [
659
  "Image 0 - Keypoints",
660
  "Image 1 - Keypoints",
661
  ]
662
- output_keypoints = plot_images([image0, image1], titles=titles, dpi=300)
663
- if "keypoints0" in pred.keys() and "keypoints1" in pred.keys():
664
- plot_keypoints([pred["keypoints0"], pred["keypoints1"]])
665
- text = (
666
- f"# keypoints0: {len(pred['keypoints0'])} \n"
667
- + f"# keypoints1: {len(pred['keypoints1'])}"
668
- )
669
- add_text(0, text, fs=15)
670
- output_keypoints = fig2im(output_keypoints)
671
 
672
  # plot images with raw matches
673
  titles = [
674
  "Image 0 - Raw matched keypoints",
675
  "Image 1 - Raw matched keypoints",
676
  ]
677
-
678
  output_matches_raw, num_matches_raw = display_matches(pred, titles=titles)
679
 
680
  # if enable_ransac:
@@ -755,3 +774,11 @@ ransac_zoo = {
755
  "USAC_ACCURATE": cv2.USAC_ACCURATE,
756
  "USAC_PARALLEL": cv2.USAC_PARALLEL,
757
  }
 
 
 
 
 
 
 
 
 
10
  from hloc import matchers, extractors, logger
11
  from hloc.utils.base_model import dynamic_load
12
  from hloc import match_dense, match_features, extract_features
 
13
  from .viz import (
14
  fig2im,
15
  plot_images,
16
  display_matches,
17
+ display_keypoints,
18
  plot_color_line_matches,
19
  )
20
  import time
 
131
  "dedode",
132
  "loftr",
133
  "disk",
134
+ "RoMa",
135
  "d2net",
136
  "aspanformer",
137
  "topicfm",
 
148
  np.random.shuffle(new_B)
149
  return new_B.tolist()
150
 
151
+ # normal examples
152
  def gen_images_pairs(count: int = 5):
153
  path = str(ROOT / "datasets/sacre_coeur/mapping")
154
  imgs_list = [
 
157
  if file.lower().endswith((".jpg", ".jpeg", ".png"))
158
  ]
159
  pairs = list(combinations(imgs_list, 2))
160
+ if len(pairs) < count:
161
+ count = len(pairs)
162
  selected = random.sample(range(len(pairs)), count)
163
  return [pairs[i] for i in selected]
164
 
165
+ # rotated examples
166
+ def gen_rot_image_pairs(count: int = 5):
167
+ path = ROOT / "datasets/sacre_coeur/mapping"
168
+ path_rot = ROOT / "datasets/sacre_coeur/mapping_rot"
169
+ rot_list = [45, 90, 135, 180, 225, 270]
170
+ pairs = []
171
+ for file in os.listdir(path):
172
+ if file.lower().endswith((".jpg", ".jpeg", ".png")):
173
+ for rot in rot_list:
174
+ file_rot = "{}_rot{}.jpg".format(Path(file).stem, rot)
175
+ if (path_rot / file_rot).exists():
176
+ pairs.append(
177
+ [
178
+ path / file,
179
+ path_rot / file_rot,
180
+ ]
181
+ )
182
+ if len(pairs) < count:
183
+ count = len(pairs)
184
+ selected = random.sample(range(len(pairs)), count)
185
+ return [pairs[i] for i in selected]
186
+
187
+ # extramely hard examples
188
  def gen_image_pairs_wxbs(count: int = None):
189
  prefix = "datasets/wxbs_benchmark/.WxBS/v1.1"
190
  wxbs_path = ROOT / prefix
 
205
 
206
  # image pair path
207
  pairs = gen_images_pairs()
208
+ pairs += gen_rot_image_pairs()
209
  pairs += gen_image_pairs_wxbs()
210
 
211
  match_setting_threshold = DEFAULT_SETTING_THRESHOLD
 
238
 
239
  def set_null_pred(feature_type: str, pred: dict):
240
  if feature_type == "KEYPOINT":
241
+ pred["mmkeypoints0_orig"] = np.array([])
242
+ pred["mmkeypoints1_orig"] = np.array([])
243
  pred["mmconf"] = np.array([])
244
  elif feature_type == "LINE":
245
  pred["mline_keypoints0_orig"] = np.array([])
 
273
  mkpts0: Optional[np.ndarray] = None
274
  mkpts1: Optional[np.ndarray] = None
275
  feature_type: Optional[str] = None
276
+ if "mkeypoints0_orig" in pred.keys() and "mkeypoints1_orig" in pred.keys():
277
+ mkpts0 = pred["mkeypoints0_orig"]
278
+ mkpts1 = pred["mkeypoints1_orig"]
279
  feature_type = "KEYPOINT"
280
  elif (
281
  "line_keypoints0_orig" in pred.keys()
 
304
  mask = np.array(mask.ravel().astype("bool"), dtype="bool")
305
  if H is not None:
306
  if feature_type == "KEYPOINT":
307
+ pred["mmkeypoints0_orig"] = mkpts0[mask]
308
+ pred["mmkeypoints1_orig"] = mkpts1[mask]
309
  pred["mmconf"] = pred["mconf"][mask]
310
  elif feature_type == "LINE":
311
  pred["mline_keypoints0_orig"] = mkpts0[mask]
 
340
  mkpts0: Optional[np.ndarray] = None
341
  mkpts1: Optional[np.ndarray] = None
342
 
343
+ if "mkeypoints0_orig" in pred.keys() and "mkeypoints1_orig" in pred.keys():
344
+ mkpts0 = pred["mkeypoints0_orig"]
345
+ mkpts1 = pred["mkeypoints1_orig"]
346
  elif (
347
  "line_keypoints0_orig" in pred.keys()
348
  and "line_keypoints1_orig" in pred.keys()
 
681
  )
682
  logger.info(f"Matching images done using: {time.time()-t1:.3f}s")
683
  t1 = time.time()
684
+
685
+ # plot images with keypoints
686
  titles = [
687
  "Image 0 - Keypoints",
688
  "Image 1 - Keypoints",
689
  ]
690
+ output_keypoints = display_keypoints(pred, titles=titles)
 
 
 
 
 
 
 
 
691
 
692
  # plot images with raw matches
693
  titles = [
694
  "Image 0 - Raw matched keypoints",
695
  "Image 1 - Raw matched keypoints",
696
  ]
 
697
  output_matches_raw, num_matches_raw = display_matches(pred, titles=titles)
698
 
699
  # if enable_ransac:
 
774
  "USAC_ACCURATE": cv2.USAC_ACCURATE,
775
  "USAC_PARALLEL": cv2.USAC_PARALLEL,
776
  }
777
+
778
+
779
+ def rotate_image(input_path, degrees, output_path):
780
+ from PIL import Image
781
+
782
+ img = Image.open(input_path)
783
+ img_rotated = img.rotate(-degrees)
784
+ img_rotated.save(output_path)
common/viz.py CHANGED
@@ -1,11 +1,12 @@
1
  import cv2
 
2
  import matplotlib
3
  import numpy as np
4
  import seaborn as sns
5
  import matplotlib.pyplot as plt
6
  from pathlib import Path
7
- import typing
8
  from typing import Dict, Any, Optional, Tuple, List, Union
 
9
 
10
 
11
  def plot_images(
@@ -376,6 +377,21 @@ def draw_image_pairs(
376
  return fig2im(fig)
377
 
378
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
379
  def display_matches(
380
  pred: Dict[str, np.ndarray],
381
  titles: List[str] = [],
@@ -397,41 +413,26 @@ def display_matches(
397
  img0 = pred["image0_orig"]
398
  img1 = pred["image1_orig"]
399
  num_inliers = 0
 
 
 
 
 
 
 
 
 
 
 
400
  # draw raw matches
401
  if (
402
- "keypoints0_orig" in pred
403
- and "keypoints1_orig" in pred
404
- and pred["keypoints0_orig"] is not None
405
- and pred["keypoints1_orig"] is not None
406
- and tag == "KPTS_RAW"
407
- ):
408
- mkpts0 = pred["keypoints0_orig"]
409
- mkpts1 = pred["keypoints1_orig"]
410
- num_inliers = len(mkpts0)
411
- if "mconf" in pred:
412
- mconf = pred["mconf"]
413
- else:
414
- mconf = np.ones(len(mkpts0))
415
- fig_mkpts = draw_matches_core(
416
- mkpts0,
417
- mkpts1,
418
- img0,
419
- img1,
420
- mconf,
421
- dpi=dpi,
422
- titles=titles,
423
- texts=texts,
424
- )
425
- fig = fig_mkpts
426
- elif (
427
- "mkeypoints0_orig" in pred
428
- and "mkeypoints1_orig" in pred
429
- and pred["mkeypoints0_orig"] is not None
430
- and pred["mkeypoints1_orig"] is not None
431
- and tag == "KPTS_RANSAC"
432
  ): # draw ransac matches
433
- mkpts0 = pred["mkeypoints0_orig"]
434
- mkpts1 = pred["mkeypoints1_orig"]
435
  num_inliers = len(mkpts0)
436
  if "mmconf" in pred:
437
  mmconf = pred["mmconf"]
@@ -454,7 +455,7 @@ def display_matches(
454
  and "line1_orig" in pred
455
  and pred["line0_orig"] is not None
456
  and pred["line1_orig"] is not None
457
- # and (tag == "LINES_RAW" or tag == "LINES_RANSAC")
458
  ):
459
  # lines
460
  mtlines0 = pred["line0_orig"]
 
1
  import cv2
2
+ import typing
3
  import matplotlib
4
  import numpy as np
5
  import seaborn as sns
6
  import matplotlib.pyplot as plt
7
  from pathlib import Path
 
8
  from typing import Dict, Any, Optional, Tuple, List, Union
9
+ from hloc.utils.viz import add_text, plot_keypoints
10
 
11
 
12
  def plot_images(
 
377
  return fig2im(fig)
378
 
379
 
380
+ def display_keypoints(pred: dict, titles: List[str] = []):
381
+ img0 = pred["image0_orig"]
382
+ img1 = pred["image1_orig"]
383
+ output_keypoints = plot_images([img0, img1], titles=titles, dpi=300)
384
+ if "keypoints0_orig" in pred.keys() and "keypoints1_orig" in pred.keys():
385
+ plot_keypoints([pred["keypoints0_orig"], pred["keypoints1_orig"]])
386
+ text = (
387
+ f"# keypoints0: {len(pred['keypoints0_orig'])} \n"
388
+ + f"# keypoints1: {len(pred['keypoints1_orig'])}"
389
+ )
390
+ add_text(0, text, fs=15)
391
+ output_keypoints = fig2im(output_keypoints)
392
+ return output_keypoints
393
+
394
+
395
  def display_matches(
396
  pred: Dict[str, np.ndarray],
397
  titles: List[str] = [],
 
413
  img0 = pred["image0_orig"]
414
  img1 = pred["image1_orig"]
415
  num_inliers = 0
416
+ KPTS0_KEY = None
417
+ KPTS1_KEY = None
418
+ if tag == "KPTS_RAW":
419
+ KPTS0_KEY = "mkeypoints0_orig"
420
+ KPTS1_KEY = "mkeypoints1_orig"
421
+ elif tag == "KPTS_RANSAC":
422
+ KPTS0_KEY = "mmkeypoints0_orig"
423
+ KPTS1_KEY = "mmkeypoints1_orig"
424
+ else:
425
+ # TODO: LINES_RAW, LINES_RANSAC
426
+ raise ValueError(f"Unknown tag: {tag}")
427
  # draw raw matches
428
  if (
429
+ KPTS0_KEY in pred
430
+ and KPTS1_KEY in pred
431
+ and pred[KPTS0_KEY] is not None
432
+ and pred[KPTS1_KEY] is not None
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
433
  ): # draw ransac matches
434
+ mkpts0 = pred[KPTS0_KEY]
435
+ mkpts1 = pred[KPTS1_KEY]
436
  num_inliers = len(mkpts0)
437
  if "mmconf" in pred:
438
  mmconf = pred["mmconf"]
 
455
  and "line1_orig" in pred
456
  and pred["line0_orig"] is not None
457
  and pred["line1_orig"] is not None
458
+ and (tag == "LINES_RAW" or tag == "LINES_RANSAC")
459
  ):
460
  # lines
461
  mtlines0 = pred["line0_orig"]
datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot135.jpg ADDED

Git LFS Details

  • SHA256: 2b73c04d53516237028bd6c74011d2b94eb09a99e2741ee2c491f070a4b9dd28
  • Pointer size: 131 Bytes
  • Size of remote file: 134 kB
datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot180.jpg ADDED

Git LFS Details

  • SHA256: 85a3bac5d7072d1bb06022b052d4c7b27e7216a8e02688ab5d9d954799254a06
  • Pointer size: 131 Bytes
  • Size of remote file: 128 kB
datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot225.jpg ADDED

Git LFS Details

  • SHA256: d3d1ccde193e18620aa6da0aec5ddbbe612f30f2b398cd596e6585b9e114e45f
  • Pointer size: 131 Bytes
  • Size of remote file: 134 kB
datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot270.jpg ADDED

Git LFS Details

  • SHA256: b4d238d8a052162da641b0d54506c85641c91f6f95cdf471e79147f4c373162d
  • Pointer size: 131 Bytes
  • Size of remote file: 115 kB
datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot315.jpg ADDED

Git LFS Details

  • SHA256: 2110adbf1d114c498c5d011adfbe779c813e894500ff429a5b365447a3d9d106
  • Pointer size: 131 Bytes
  • Size of remote file: 134 kB
datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot45.jpg ADDED

Git LFS Details

  • SHA256: bbf08e8eadcadeed24a6843cf79ee0edf1771d09c71b7e1d387a997ea1922cfb
  • Pointer size: 131 Bytes
  • Size of remote file: 133 kB
datasets/sacre_coeur/mapping_rot/02928139_3448003521_rot90.jpg ADDED

Git LFS Details

  • SHA256: ede5a1cf1b99a230b407e24e7bf1a7926cf684d889674d085b299f8937ee3ae3
  • Pointer size: 131 Bytes
  • Size of remote file: 115 kB
datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot135.jpg ADDED

Git LFS Details

  • SHA256: 5489c853477a1e0eab0dc7862261e5ff3bca8b18e0dc742fe8be04473e993bb2
  • Pointer size: 130 Bytes
  • Size of remote file: 82.3 kB
datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot180.jpg ADDED

Git LFS Details

  • SHA256: 2991086430d5880b01250023617c255dc165e14a00f199706445132ad7f3501e
  • Pointer size: 130 Bytes
  • Size of remote file: 79.4 kB
datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot225.jpg ADDED

Git LFS Details

  • SHA256: dcca8fbd0b68c41fa987982e56fee055997c09e6e88f7de8d46034a8683c931e
  • Pointer size: 130 Bytes
  • Size of remote file: 81.9 kB
datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot270.jpg ADDED

Git LFS Details

  • SHA256: fbd874af9c4d1406a5adfa10f9454b1444d550dbe21bd57619df906a66e79571
  • Pointer size: 130 Bytes
  • Size of remote file: 66.5 kB
datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot315.jpg ADDED

Git LFS Details

  • SHA256: e6fc41beb78ec8e5adef2e601a344cddfe5fe353b4893e186b6036452f8c8198
  • Pointer size: 130 Bytes
  • Size of remote file: 82 kB
datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot45.jpg ADDED

Git LFS Details

  • SHA256: cc55ac4f079176709f577564d390bf3e2c4e08f53378270465062d198699c100
  • Pointer size: 130 Bytes
  • Size of remote file: 81.7 kB
datasets/sacre_coeur/mapping_rot/03903474_1471484089_rot90.jpg ADDED

Git LFS Details

  • SHA256: f5ef044c01f3e94868480cab60841caa92a410c33643d9af6b60be14ee37d60f
  • Pointer size: 130 Bytes
  • Size of remote file: 66.6 kB
datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot135.jpg ADDED

Git LFS Details

  • SHA256: 7b5cd34c3b6ff6fed9c32fe94e9311d9fcd94e4b6ed23ff205fca44c570e1827
  • Pointer size: 130 Bytes
  • Size of remote file: 96.7 kB
datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot180.jpg ADDED

Git LFS Details

  • SHA256: 225c06d54c04d2ed14ec6d885a91760e9faaf298e0a42e776603d44759736b30
  • Pointer size: 131 Bytes
  • Size of remote file: 104 kB
datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot225.jpg ADDED

Git LFS Details

  • SHA256: 9bda2da8868f114170621d93595d1b4600dff8ddda6e8211842b5598ac866ed3
  • Pointer size: 131 Bytes
  • Size of remote file: 101 kB
datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot270.jpg ADDED

Git LFS Details

  • SHA256: de7d6445cadee22083af4a99b970674ee2eb4286162ec65e9e134cb29d1b2748
  • Pointer size: 130 Bytes
  • Size of remote file: 83.1 kB
datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot315.jpg ADDED

Git LFS Details

  • SHA256: f14f08b0d72e7c3d946a50df958db3aa4058d1f9e5acb3ebb3d39a53503b1126
  • Pointer size: 130 Bytes
  • Size of remote file: 96.8 kB
datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot45.jpg ADDED

Git LFS Details

  • SHA256: b5ec4c6fa41d84c07c8fffad7f19630fe2ddb88b042e1a80b470a3566320cb77
  • Pointer size: 131 Bytes
  • Size of remote file: 102 kB
datasets/sacre_coeur/mapping_rot/10265353_3838484249_rot90.jpg ADDED

Git LFS Details

  • SHA256: 095ca3d56fc0ce8ef5879a4dfcd4f2af000e7df41a602d546f164896e5add1b5
  • Pointer size: 130 Bytes
  • Size of remote file: 83 kB
datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot135.jpg ADDED

Git LFS Details

  • SHA256: fed7e7f7adc94c88b9755fce914bd745855392fdce1057360731cad09adc2c3a
  • Pointer size: 131 Bytes
  • Size of remote file: 120 kB
datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot180.jpg ADDED

Git LFS Details

  • SHA256: 0a8f76fdbfe1223bc2342ec915b129f480425d2e1fd19a794f6e991146199928
  • Pointer size: 131 Bytes
  • Size of remote file: 126 kB
datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot225.jpg ADDED

Git LFS Details

  • SHA256: 335726de47840b164cd71f68ad9caa30b496a52783d4669dc5fab45da8e0427f
  • Pointer size: 131 Bytes
  • Size of remote file: 112 kB
datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot270.jpg ADDED

Git LFS Details

  • SHA256: ffc1822c65765801d9320e0dff5fecc42a013c1d4ba50855314aed0789f1d8f2
  • Pointer size: 130 Bytes
  • Size of remote file: 87.7 kB
datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot315.jpg ADDED

Git LFS Details

  • SHA256: af42b452bca3f3e5305700f2a977a41286ffcc1ef8d4a992450c3e98cd1c1d05
  • Pointer size: 131 Bytes
  • Size of remote file: 120 kB
datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot45.jpg ADDED

Git LFS Details

  • SHA256: 2452d8839721d7c54755be96e75213277de99b9b9edc6c47b3d5bc94583b42c1
  • Pointer size: 131 Bytes
  • Size of remote file: 111 kB
datasets/sacre_coeur/mapping_rot/17295357_9106075285_rot90.jpg ADDED

Git LFS Details

  • SHA256: e7d580e865a744f52057137ca79848cc173be19aaa6db9dcaa60f9be46f4c465
  • Pointer size: 130 Bytes
  • Size of remote file: 87.5 kB
datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot135.jpg ADDED

Git LFS Details

  • SHA256: 55c35e80d3783c5a93a724997ae62613460dcda6a6672593a8e9af6cc40f43c0
  • Pointer size: 130 Bytes
  • Size of remote file: 98.4 kB
datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot180.jpg ADDED

Git LFS Details

  • SHA256: 23d8d3c4dcfea64e6779f8e216377a080abfdd4a3bc0bf554783c8b7f540d27f
  • Pointer size: 131 Bytes
  • Size of remote file: 102 kB
datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot225.jpg ADDED

Git LFS Details

  • SHA256: 516d60da5e943828a525407524cf9c2ee96f580afb713be63b5714e98be259b7
  • Pointer size: 130 Bytes
  • Size of remote file: 92.6 kB
datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot270.jpg ADDED

Git LFS Details

  • SHA256: 1b0cf682dbbdd398ff1aa94e0b3ca7e4dafac1f373bbc889645ee6e442b78284
  • Pointer size: 130 Bytes
  • Size of remote file: 79.1 kB
datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot315.jpg ADDED

Git LFS Details

  • SHA256: 88dd8ab393c2b7fd7f1dbbff1a212698dccee8e05f3f8b225fdd8f7ff110f5f1
  • Pointer size: 130 Bytes
  • Size of remote file: 98.6 kB
datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot45.jpg ADDED

Git LFS Details

  • SHA256: 693ef906b4a3cdedcf12f36ce309cc8b6de911cc2d06ec7752547119ffeee530
  • Pointer size: 130 Bytes
  • Size of remote file: 93.1 kB
datasets/sacre_coeur/mapping_rot/32809961_8274055477_rot90.jpg ADDED

Git LFS Details

  • SHA256: 06d0296ad6690beb85c52bf0df5a68b7fd6ffcf85072376a2090989d993dfbf8
  • Pointer size: 130 Bytes
  • Size of remote file: 79.7 kB
datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot135.jpg ADDED

Git LFS Details

  • SHA256: bfc70746d378f4df6befc38e3fc12a946b74f020ed84f2d14148132bbf6f90c7
  • Pointer size: 130 Bytes
  • Size of remote file: 73.6 kB
datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot180.jpg ADDED

Git LFS Details

  • SHA256: 56d78dbcbb813c47bd13a9dfbf00bb298c3fc63a5d3b807d53aae6b207360d70
  • Pointer size: 130 Bytes
  • Size of remote file: 79.4 kB
datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot225.jpg ADDED

Git LFS Details

  • SHA256: b97eed0c96feac3e037d1bc072dcb490c81cad37e9d90c459cb72a8ea98c6406
  • Pointer size: 130 Bytes
  • Size of remote file: 78.6 kB
datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot270.jpg ADDED

Git LFS Details

  • SHA256: 0da47e47bf521578a1c1a72dee34cfec13a597925ade92f5552c5278e79a7a14
  • Pointer size: 130 Bytes
  • Size of remote file: 62.1 kB
datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot315.jpg ADDED

Git LFS Details

  • SHA256: 29e6c31d2c3f255cd95fa119512305aafd60b7daf8472a73b263ed4dae7184ac
  • Pointer size: 130 Bytes
  • Size of remote file: 75.3 kB
datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot45.jpg ADDED

Git LFS Details

  • SHA256: af952a441862a0cadfc77c5f00b9195d0684e3888f63c5a3e8375eda36802957
  • Pointer size: 130 Bytes
  • Size of remote file: 78.3 kB
datasets/sacre_coeur/mapping_rot/44120379_8371960244_rot90.jpg ADDED

Git LFS Details

  • SHA256: 9c68e15b9a7820af38f0a0d914454bb6b7add78a0946fd83d909fde2ca56f721
  • Pointer size: 130 Bytes
  • Size of remote file: 62.8 kB
datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot135.jpg ADDED

Git LFS Details

  • SHA256: 3ccabe0811539e04ddb47879a1a864b0ccb0637c07de89e33b71df655fd08529
  • Pointer size: 131 Bytes
  • Size of remote file: 104 kB
datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot180.jpg ADDED

Git LFS Details

  • SHA256: f629597738b0cfbb567acdecfbe37b18b9cbbdaf435ebd59cd219c28db199b38
  • Pointer size: 131 Bytes
  • Size of remote file: 110 kB
datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot225.jpg ADDED

Git LFS Details

  • SHA256: e44cb9873856cd2c785905bc53ef5347ad375ed539b1b16434ceb1f38548db95
  • Pointer size: 131 Bytes
  • Size of remote file: 109 kB
datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot270.jpg ADDED

Git LFS Details

  • SHA256: c4c260b40e202d4c2144e4885eb61a52009ee2743c8d04cd01f1beb33105b4c0
  • Pointer size: 130 Bytes
  • Size of remote file: 95.3 kB
datasets/sacre_coeur/mapping_rot/51091044_3486849416_rot315.jpg ADDED

Git LFS Details

  • SHA256: c1c256473100905130d2f1d7e82cd2d951792fc5ff4180d2ba26edcc0e8d17f0
  • Pointer size: 131 Bytes
  • Size of remote file: 104 kB