mapreader 1.6.3.post0.dev12__tar.gz → 1.6.3.post0.dev18__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (51) hide show
  1. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/PKG-INFO +4 -3
  2. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/_version.py +3 -3
  3. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/spot_text/dataclasses.py +5 -1
  4. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/spot_text/dptext_detr_runner.py +1 -1
  5. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/spot_text/runner_base.py +103 -3
  6. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader.egg-info/PKG-INFO +4 -3
  7. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader.egg-info/requires.txt +1 -1
  8. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/setup.py +1 -1
  9. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/LICENSE +0 -0
  10. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/README.md +0 -0
  11. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/__init__.py +0 -0
  12. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/__main__.py +0 -0
  13. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/annotate/__init__.py +0 -0
  14. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/annotate/annotator.py +0 -0
  15. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/classify/__init__.py +0 -0
  16. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/classify/classifier.py +0 -0
  17. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/classify/custom_models.py +0 -0
  18. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/classify/datasets.py +0 -0
  19. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/classify/load_annotations.py +0 -0
  20. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/download/__init__.py +0 -0
  21. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/download/data_structures.py +0 -0
  22. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/download/downloader.py +0 -0
  23. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/download/downloader_utils.py +0 -0
  24. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/download/sheet_downloader.py +0 -0
  25. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/download/tile_loading.py +0 -0
  26. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/download/tile_merging.py +0 -0
  27. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/load/__init__.py +0 -0
  28. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/load/geo_utils.py +0 -0
  29. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/load/images.py +0 -0
  30. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/load/loader.py +0 -0
  31. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/process/__init__.py +0 -0
  32. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/process/context_post_process.py +0 -0
  33. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/process/occlusion_analysis.py +0 -0
  34. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/process/process.py +0 -0
  35. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/spot_text/__init__.py +0 -0
  36. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/spot_text/deepsolo_runner.py +0 -0
  37. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/spot_text/maptext_runner.py +0 -0
  38. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/utils/__init__.py +0 -0
  39. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/utils/compute_and_save_stats.py +0 -0
  40. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/utils/load_frames.py +0 -0
  41. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader/utils/slice_parallel.py +0 -0
  42. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader.egg-info/SOURCES.txt +0 -0
  43. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader.egg-info/dependency_links.txt +0 -0
  44. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader.egg-info/entry_points.txt +0 -0
  45. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader.egg-info/not-zip-safe +0 -0
  46. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/mapreader.egg-info/top_level.txt +0 -0
  47. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/setup.cfg +0 -0
  48. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/tests/test_geo_pipeline.py +0 -0
  49. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/tests/test_import.py +0 -0
  50. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/tests/test_utils_load_frames.py +0 -0
  51. {mapreader-1.6.3.post0.dev12 → mapreader-1.6.3.post0.dev18}/versioneer.py +0 -0
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: mapreader
3
- Version: 1.6.3.post0.dev12
3
+ Version: 1.6.3.post0.dev18
4
4
  Summary: A computer vision pipeline for the semantic exploration of maps/images at scale
5
5
  Home-page: https://github.com/Living-with-machines/MapReader
6
6
  Download-URL: https://github.com/Living-with-machines/MapReader/archive/refs/heads/main.zip
@@ -66,7 +66,7 @@ Provides-Extra: dev
66
66
  Requires-Dist: pytest<9.0.0; extra == "dev"
67
67
  Requires-Dist: pytest-cov<6.0.0,>=4.1.0; extra == "dev"
68
68
  Requires-Dist: timm<1.0.0; extra == "dev"
69
- Requires-Dist: transformers<5.0.0; extra == "dev"
69
+ Requires-Dist: transformers!=4.50.0,<5.0.0; extra == "dev"
70
70
  Requires-Dist: black<25.0.0,>=23.7.0; extra == "dev"
71
71
  Requires-Dist: flake8<8.0.0,>=6.0.0; extra == "dev"
72
72
  Dynamic: author
@@ -77,6 +77,7 @@ Dynamic: download-url
77
77
  Dynamic: home-page
78
78
  Dynamic: keywords
79
79
  Dynamic: license
80
+ Dynamic: license-file
80
81
  Dynamic: platform
81
82
  Dynamic: provides-extra
82
83
  Dynamic: requires-dist
@@ -8,11 +8,11 @@ import json
8
8
 
9
9
  version_json = '''
10
10
  {
11
- "date": "2025-03-19T13:41:18+0000",
11
+ "date": "2025-03-22T19:46:10+0000",
12
12
  "dirty": false,
13
13
  "error": null,
14
- "full-revisionid": "1c28f2da2d218d619592f573c2c4148a3a801fbb",
15
- "version": "1.6.3.post0.dev12"
14
+ "full-revisionid": "65e309226586e0ca4d1ae9babee54ab766803f2f",
15
+ "version": "1.6.3.post0.dev18"
16
16
  }
17
17
  ''' # END VERSION_JSON
18
18
 
@@ -2,12 +2,13 @@ from __future__ import annotations
2
2
 
3
3
  from dataclasses import dataclass
4
4
 
5
- from shapely.geometry import Polygon
5
+ from shapely.geometry import LineString, Polygon
6
6
 
7
7
 
8
8
  @dataclass(frozen=True)
9
9
  class PatchPrediction:
10
10
  pixel_geometry: Polygon
11
+ pixel_line: LineString
11
12
  score: float
12
13
  text: str = None
13
14
 
@@ -15,6 +16,7 @@ class PatchPrediction:
15
16
  @dataclass(frozen=True)
16
17
  class ParentPrediction:
17
18
  pixel_geometry: Polygon
19
+ pixel_line: LineString
18
20
  score: float
19
21
  patch_id: str
20
22
  text: str = None
@@ -23,8 +25,10 @@ class ParentPrediction:
23
25
  @dataclass(frozen=True)
24
26
  class GeoPrediction:
25
27
  pixel_geometry: Polygon
28
+ pixel_line: LineString
26
29
  score: float
27
30
  patch_id: str
28
31
  geometry: Polygon
32
+ line: LineString
29
33
  crs: str
30
34
  text: str = None
@@ -124,5 +124,5 @@ class DPTextDETRRunner(DetRunner):
124
124
  score = f"{score:.2f}"
125
125
 
126
126
  self.patch_predictions[image_id].append(
127
- PatchPrediction(pixel_geometry=polygon, score=score)
127
+ PatchPrediction(pixel_geometry=polygon, pixel_line=None, score=score)
128
128
  )
@@ -325,6 +325,7 @@ class DetRunner:
325
325
  self.parent_predictions[parent_id] = []
326
326
 
327
327
  for instance in prediction:
328
+ # convert polygon
328
329
  polygon = instance.pixel_geometry
329
330
 
330
331
  xx, yy = (np.array(i) for i in polygon.exterior.xy)
@@ -332,9 +333,26 @@ class DetRunner:
332
333
  yy = yy + self.patch_df.loc[image_id, "pixel_bounds"][1] # add min_y
333
334
 
334
335
  parent_polygon = Polygon(zip(xx, yy)).buffer(0)
336
+
337
+ # convert line
338
+ if instance.pixel_line is not None:
339
+ line = instance.pixel_line
340
+ xx, yy = (np.array(i) for i in line.xy)
341
+ xx = (
342
+ xx + self.patch_df.loc[image_id, "pixel_bounds"][0]
343
+ ) # add min_x
344
+ yy = (
345
+ yy + self.patch_df.loc[image_id, "pixel_bounds"][1]
346
+ ) # add min_y
347
+
348
+ parent_line = LineString(zip(xx, yy))
349
+ else:
350
+ parent_line = None
351
+
335
352
  self.parent_predictions[parent_id].append(
336
353
  ParentPrediction(
337
354
  pixel_geometry=parent_polygon,
355
+ pixel_line=parent_line,
338
356
  score=instance.score,
339
357
  text=instance.text,
340
358
  patch_id=image_id,
@@ -446,6 +464,7 @@ class DetRunner:
446
464
  self.geo_predictions[parent_id] = []
447
465
 
448
466
  for instance in prediction:
467
+ # convert polygon
449
468
  polygon = instance.pixel_geometry
450
469
 
451
470
  xx, yy = (np.array(i) for i in polygon.exterior.xy)
@@ -461,13 +480,32 @@ class DetRunner:
461
480
  parent_polygon_geo = Polygon(zip(xx, yy)).buffer(0)
462
481
  crs = self.parent_df.loc[parent_id, "crs"]
463
482
 
483
+ # convert line
484
+ if instance.pixel_line is not None:
485
+ line = instance.pixel_line
486
+
487
+ xx, yy = (np.array(i) for i in line.xy)
488
+ xx = (
489
+ xx * self.parent_df.loc[parent_id, "dlon"]
490
+ + self.parent_df.loc[parent_id, "coordinates"][0]
491
+ )
492
+ yy = (
493
+ self.parent_df.loc[parent_id, "coordinates"][3]
494
+ - yy * self.parent_df.loc[parent_id, "dlat"]
495
+ )
496
+ parent_line_geo = LineString(zip(xx, yy))
497
+ else:
498
+ parent_line_geo = None
499
+
464
500
  self.geo_predictions[parent_id].append(
465
501
  GeoPrediction(
466
502
  pixel_geometry=instance.pixel_geometry,
503
+ pixel_line=instance.pixel_line,
467
504
  score=instance.score,
468
505
  text=instance.text,
469
506
  patch_id=instance.patch_id,
470
507
  geometry=parent_polygon_geo,
508
+ line=parent_line_geo,
471
509
  crs=crs,
472
510
  )
473
511
  )
@@ -711,6 +749,17 @@ class DetRunner:
711
749
  lambda x: from_wkt(x)
712
750
  )
713
751
 
752
+ # convert lines to shapely geometry
753
+ # if line and pixel_line are not in the columns, add them as None values
754
+ if "line" in preds_df.columns:
755
+ preds_df["line"] = preds_df["line"].apply(lambda x: from_wkt(x))
756
+ else:
757
+ preds_df["line"] = None
758
+ if "pixel_line" in preds_df.columns:
759
+ preds_df["pixel_line"] = preds_df["pixel_line"].apply(lambda x: from_wkt(x))
760
+ else:
761
+ preds_df["pixel_line"] = None
762
+
714
763
  self.geo_predictions = {}
715
764
  self.parent_predictions = {}
716
765
 
@@ -724,16 +773,19 @@ class DetRunner:
724
773
  self.geo_predictions[image_id].append(
725
774
  GeoPrediction(
726
775
  pixel_geometry=v.pixel_geometry,
776
+ pixel_line=v.pixel_line,
727
777
  score=v.score,
728
778
  text=v.text if "text" in v.index else None,
729
779
  patch_id=v.patch_id,
730
780
  geometry=v.geometry,
781
+ line=v.line,
731
782
  crs=v.crs,
732
783
  )
733
784
  )
734
785
  self.parent_predictions[image_id].append(
735
786
  ParentPrediction(
736
787
  pixel_geometry=v.pixel_geometry,
788
+ pixel_line=v.pixel_line,
737
789
  score=v.score,
738
790
  text=v.text if "text" in v.index else None,
739
791
  patch_id=v.patch_id,
@@ -747,6 +799,7 @@ class DetRunner:
747
799
  if instance.patch_id not in self.patch_predictions.keys():
748
800
  self.patch_predictions[instance.patch_id] = []
749
801
 
802
+ # convert polygon
750
803
  polygon = instance.pixel_geometry
751
804
 
752
805
  xx, yy = (np.array(i) for i in polygon.exterior.xy)
@@ -756,11 +809,27 @@ class DetRunner:
756
809
  yy = (
757
810
  yy - self.patch_df.loc[instance.patch_id, "pixel_bounds"][1]
758
811
  ) # add min_y
759
-
760
812
  patch_polygon = Polygon(zip(xx, yy)).buffer(0)
813
+
814
+ # convert line
815
+ if instance.pixel_line is not None:
816
+ line = instance.pixel_line
817
+
818
+ xx, yy = (np.array(i) for i in line.xy)
819
+ xx = (
820
+ xx - self.patch_df.loc[instance.patch_id, "pixel_bounds"][0]
821
+ ) # add min_x
822
+ yy = (
823
+ yy - self.patch_df.loc[instance.patch_id, "pixel_bounds"][1]
824
+ ) # add min_y
825
+ patch_line = LineString(zip(xx, yy))
826
+ else:
827
+ patch_line = None
828
+
761
829
  self.patch_predictions[instance.patch_id].append(
762
830
  PatchPrediction(
763
831
  pixel_geometry=patch_polygon,
832
+ pixel_line=patch_line,
764
833
  score=instance.score,
765
834
  text=instance.text,
766
835
  )
@@ -789,6 +858,15 @@ class DetRunner:
789
858
  lambda x: from_wkt(x)
790
859
  )
791
860
 
861
+ # convert lines to shapely geometry
862
+ # if line and pixel_line are not in the columns, add them as None values
863
+ if "pixel_line" in patch_preds.columns:
864
+ patch_preds["pixel_line"] = patch_preds["pixel_line"].apply(
865
+ lambda x: from_wkt(x)
866
+ )
867
+ else:
868
+ patch_preds["pixel_line"] = None
869
+
792
870
  self.patch_predictions = {} # reset patch predictions
793
871
 
794
872
  for image_id in patch_preds["image_id"].unique():
@@ -796,9 +874,12 @@ class DetRunner:
796
874
  self.patch_predictions[image_id] = []
797
875
 
798
876
  for _, v in patch_preds[patch_preds["image_id"] == image_id].iterrows():
877
+ if not hasattr(v, "pixel_line"):
878
+ v.pixel_line = None
799
879
  self.patch_predictions[image_id].append(
800
880
  PatchPrediction(
801
881
  pixel_geometry=v.pixel_geometry,
882
+ pixel_line=v.pixel_line,
802
883
  score=v.score,
803
884
  text=v.text if "text" in v.index else None,
804
885
  )
@@ -879,7 +960,9 @@ class DetRecRunner(DetRunner):
879
960
  score = f"{score:.2f}"
880
961
 
881
962
  self.patch_predictions[image_id].append(
882
- PatchPrediction(pixel_geometry=polygon, score=score, text=text)
963
+ PatchPrediction(
964
+ pixel_geometry=polygon, pixel_line=line, score=score, text=text
965
+ )
883
966
  )
884
967
 
885
968
  def search_predictions(
@@ -1009,6 +1092,7 @@ class DetRecRunner(DetRunner):
1009
1092
  geo_search_results[parent_id] = []
1010
1093
 
1011
1094
  for instance in prediction:
1095
+ # convert polygon
1012
1096
  polygon = instance.pixel_geometry
1013
1097
 
1014
1098
  xx, yy = (np.array(i) for i in polygon.exterior.xy)
@@ -1021,16 +1105,32 @@ class DetRecRunner(DetRunner):
1021
1105
  - yy * self.parent_df.loc[parent_id, "dlat"]
1022
1106
  )
1023
1107
 
1108
+ parent_polygon_geo = Polygon(zip(xx, yy)).buffer(0)
1024
1109
  crs = self.parent_df.loc[parent_id, "crs"]
1025
1110
 
1026
- parent_polygon_geo = Polygon(zip(xx, yy)).buffer(0)
1111
+ # convert line
1112
+ line = instance.pixel_line
1113
+
1114
+ xx, yy = (np.array(i) for i in line.xy)
1115
+ xx = (
1116
+ xx * self.parent_df.loc[parent_id, "dlon"]
1117
+ + self.parent_df.loc[parent_id, "coordinates"][0]
1118
+ )
1119
+ yy = (
1120
+ self.parent_df.loc[parent_id, "coordinates"][3]
1121
+ - yy * self.parent_df.loc[parent_id, "dlat"]
1122
+ )
1123
+ parent_line_geo = LineString(zip(xx, yy))
1124
+
1027
1125
  geo_search_results[parent_id].append(
1028
1126
  GeoPrediction(
1029
1127
  pixel_geometry=instance.pixel_geometry,
1128
+ pixel_line=instance.pixel_line,
1030
1129
  score=instance.score,
1031
1130
  text=instance.score,
1032
1131
  patch_id=instance.patch_id,
1033
1132
  geometry=parent_polygon_geo,
1133
+ line=parent_line_geo,
1034
1134
  crs=crs,
1035
1135
  )
1036
1136
  )
@@ -1,6 +1,6 @@
1
- Metadata-Version: 2.2
1
+ Metadata-Version: 2.4
2
2
  Name: mapreader
3
- Version: 1.6.3.post0.dev12
3
+ Version: 1.6.3.post0.dev18
4
4
  Summary: A computer vision pipeline for the semantic exploration of maps/images at scale
5
5
  Home-page: https://github.com/Living-with-machines/MapReader
6
6
  Download-URL: https://github.com/Living-with-machines/MapReader/archive/refs/heads/main.zip
@@ -66,7 +66,7 @@ Provides-Extra: dev
66
66
  Requires-Dist: pytest<9.0.0; extra == "dev"
67
67
  Requires-Dist: pytest-cov<6.0.0,>=4.1.0; extra == "dev"
68
68
  Requires-Dist: timm<1.0.0; extra == "dev"
69
- Requires-Dist: transformers<5.0.0; extra == "dev"
69
+ Requires-Dist: transformers!=4.50.0,<5.0.0; extra == "dev"
70
70
  Requires-Dist: black<25.0.0,>=23.7.0; extra == "dev"
71
71
  Requires-Dist: flake8<8.0.0,>=6.0.0; extra == "dev"
72
72
  Dynamic: author
@@ -77,6 +77,7 @@ Dynamic: download-url
77
77
  Dynamic: home-page
78
78
  Dynamic: keywords
79
79
  Dynamic: license
80
+ Dynamic: license-file
80
81
  Dynamic: platform
81
82
  Dynamic: provides-extra
82
83
  Dynamic: requires-dist
@@ -38,6 +38,6 @@ xyzservices==2024.9.0
38
38
  pytest<9.0.0
39
39
  pytest-cov<6.0.0,>=4.1.0
40
40
  timm<1.0.0
41
- transformers<5.0.0
41
+ transformers!=4.50.0,<5.0.0
42
42
  black<25.0.0,>=23.7.0
43
43
  flake8<8.0.0,>=6.0.0
@@ -69,7 +69,7 @@ setuptools.setup(
69
69
  "pytest<9.0.0",
70
70
  "pytest-cov>=4.1.0,<6.0.0",
71
71
  "timm<1.0.0",
72
- "transformers<5.0.0",
72
+ "transformers<5.0.0, !=4.50.0",
73
73
  "black>=23.7.0,<25.0.0",
74
74
  "flake8>=6.0.0,<8.0.0",
75
75
  ],