geoai-py 0.14.0__tar.gz → 0.16.0__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. {geoai_py-0.14.0 → geoai_py-0.16.0}/.editorconfig +1 -0
  2. {geoai_py-0.14.0 → geoai_py-0.16.0}/.gitignore +3 -0
  3. {geoai_py-0.14.0 → geoai_py-0.16.0}/.pre-commit-config.yaml +1 -1
  4. geoai_py-0.16.0/CITATION.cff +11 -0
  5. {geoai_py-0.14.0 → geoai_py-0.16.0}/LICENSE +1 -2
  6. {geoai_py-0.14.0 → geoai_py-0.16.0}/PKG-INFO +9 -1
  7. {geoai_py-0.14.0 → geoai_py-0.16.0}/README.md +6 -0
  8. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/__init__.py +21 -1
  9. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/change_detection.py +16 -6
  10. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/geoai.py +3 -0
  11. geoai_py-0.16.0/geoai/timm_segment.py +1097 -0
  12. geoai_py-0.16.0/geoai/timm_train.py +658 -0
  13. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/train.py +796 -107
  14. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/utils.py +1427 -245
  15. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai_py.egg-info/PKG-INFO +9 -1
  16. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai_py.egg-info/SOURCES.txt +3 -0
  17. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai_py.egg-info/requires.txt +2 -0
  18. {geoai_py-0.14.0 → geoai_py-0.16.0}/mkdocs.yml +6 -0
  19. {geoai_py-0.14.0 → geoai_py-0.16.0}/pyproject.toml +4 -4
  20. {geoai_py-0.14.0 → geoai_py-0.16.0}/requirements.txt +1 -0
  21. {geoai_py-0.14.0 → geoai_py-0.16.0}/requirements_docs.txt +1 -1
  22. {geoai_py-0.14.0 → geoai_py-0.16.0}/.dockerignore +0 -0
  23. {geoai_py-0.14.0 → geoai_py-0.16.0}/Dockerfile +0 -0
  24. {geoai_py-0.14.0 → geoai_py-0.16.0}/MANIFEST.in +0 -0
  25. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/agents/__init__.py +0 -0
  26. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/agents/geo_agents.py +0 -0
  27. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/agents/map_tools.py +0 -0
  28. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/classify.py +0 -0
  29. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/detectron2.py +0 -0
  30. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/dinov3.py +0 -0
  31. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/download.py +0 -0
  32. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/extract.py +0 -0
  33. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/hf.py +0 -0
  34. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/map_widgets.py +0 -0
  35. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/sam.py +0 -0
  36. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/segment.py +0 -0
  37. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai/segmentation.py +0 -0
  38. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai_py.egg-info/dependency_links.txt +0 -0
  39. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai_py.egg-info/entry_points.txt +0 -0
  40. {geoai_py-0.14.0 → geoai_py-0.16.0}/geoai_py.egg-info/top_level.txt +0 -0
  41. {geoai_py-0.14.0 → geoai_py-0.16.0}/pytest.ini +0 -0
  42. {geoai_py-0.14.0 → geoai_py-0.16.0}/setup.cfg +0 -0
  43. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/__init__.py +0 -0
  44. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/create_test_data.py +0 -0
  45. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/test_classify.py +0 -0
  46. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/test_download.py +0 -0
  47. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/test_extract.py +0 -0
  48. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/test_fixtures.py +0 -0
  49. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/test_geoai.py +0 -0
  50. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/test_segment.py +0 -0
  51. {geoai_py-0.14.0 → geoai_py-0.16.0}/tests/test_utils.py +0 -0
@@ -1,5 +1,6 @@
1
1
  # http://editorconfig.org
2
2
 
3
+ # top-most EditorConfig file
3
4
  root = true
4
5
 
5
6
  [*]
@@ -7,6 +7,9 @@ private/
7
7
  tests/data/
8
8
  CLAUDE.md
9
9
  AI_AGENTS.md
10
+ docs/examples/timm_output/
11
+ docs/examples/timm_seg_output/
12
+ docs/examples/timm_buildings/
10
13
 
11
14
  # C extensions
12
15
  *.so
@@ -11,7 +11,7 @@ repos:
11
11
  - id: check-added-large-files
12
12
  args: ["--maxkb=500"]
13
13
 
14
- - repo: https://github.com/psf/black
14
+ - repo: https://github.com/psf/black-pre-commit-mirror
15
15
  rev: 25.9.0
16
16
  hooks:
17
17
  - id: black-jupyter
@@ -0,0 +1,11 @@
1
+ cff-version: 1.1.0
2
+ message: "If you use this software, please cite it as below."
3
+ authors:
4
+ - family-names: Wu
5
+ given-names: Qiusheng
6
+ orcid: https://orcid.org/0000-0001-5437-4073
7
+ title: "GeoAI: A Python package for integrating artificial intelligence with geospatial data analysis and visualization"
8
+ version: 0.14.0
9
+ doi: 10.21105/joss.09025
10
+ date-released: 2025-10-05
11
+ url: "https://github.com/opengeos/goeai"
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2023, Qiusheng Wu
3
+ Copyright (c) 2023-2025, Qiusheng Wu
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -19,4 +19,3 @@ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
19
  LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
20
  OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21
21
  SOFTWARE.
22
-
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: geoai-py
3
- Version: 0.14.0
3
+ Version: 0.16.0
4
4
  Summary: A Python package for using Artificial Intelligence (AI) with geospatial data
5
5
  Author-email: Qiusheng Wu <giswqs@gmail.com>
6
6
  License: MIT License
@@ -38,6 +38,7 @@ Requires-Dist: rasterio
38
38
  Requires-Dist: rioxarray
39
39
  Requires-Dist: scikit-image
40
40
  Requires-Dist: scikit-learn
41
+ Requires-Dist: timm
41
42
  Requires-Dist: torch
42
43
  Requires-Dist: torchgeo
43
44
  Requires-Dist: torchinfo
@@ -46,6 +47,7 @@ Requires-Dist: transformers
46
47
  Provides-Extra: extra
47
48
  Requires-Dist: overturemaps; extra == "extra"
48
49
  Requires-Dist: torchange; extra == "extra"
50
+ Requires-Dist: lightly-train; extra == "extra"
49
51
  Provides-Extra: agents
50
52
  Requires-Dist: strands-agents; extra == "agents"
51
53
  Requires-Dist: strands-agents-tools; extra == "agents"
@@ -92,6 +94,12 @@ GeoAI addresses this need by providing a unified, user-friendly interface that a
92
94
 
93
95
  The package's design philosophy emphasizes simplicity without sacrificing functionality, enabling users to perform sophisticated analyses such as building footprint extraction from satellite imagery, land cover classification, and change detection with just a few lines of code. By integrating cutting-edge AI models and providing seamless access to major geospatial data sources, GeoAI significantly lowers the barrier to entry for geospatial AI applications while maintaining the flexibility needed for advanced research applications.
94
96
 
97
+ ## Citations
98
+
99
+ If you find GeoAI useful in your research, please consider citing the following paper to support my work. Thank you for your support.
100
+
101
+ - Wu, Q. (2025). GeoAI: A Python package for integrating artificial intelligence with geospatial data analysis and visualization. _Journal of Open Source Software_, 9025. [https://doi.org/10.21105/joss.09025](https://github.com/openjournals/joss-papers/blob/joss.09025/joss.09025/10.21105.joss.09025.pdf) (Under Review)
102
+
95
103
  ## 🚀 Key Features
96
104
 
97
105
  ### 📊 Advanced Geospatial Data Visualization
@@ -36,6 +36,12 @@ GeoAI addresses this need by providing a unified, user-friendly interface that a
36
36
 
37
37
  The package's design philosophy emphasizes simplicity without sacrificing functionality, enabling users to perform sophisticated analyses such as building footprint extraction from satellite imagery, land cover classification, and change detection with just a few lines of code. By integrating cutting-edge AI models and providing seamless access to major geospatial data sources, GeoAI significantly lowers the barrier to entry for geospatial AI applications while maintaining the flexibility needed for advanced research applications.
38
38
 
39
+ ## Citations
40
+
41
+ If you find GeoAI useful in your research, please consider citing the following paper to support my work. Thank you for your support.
42
+
43
+ - Wu, Q. (2025). GeoAI: A Python package for integrating artificial intelligence with geospatial data analysis and visualization. _Journal of Open Source Software_, 9025. [https://doi.org/10.21105/joss.09025](https://github.com/openjournals/joss-papers/blob/joss.09025/joss.09025/10.21105.joss.09025.pdf) (Under Review)
44
+
39
45
  ## 🚀 Key Features
40
46
 
41
47
  ### 📊 Advanced Geospatial Data Visualization
@@ -2,7 +2,7 @@
2
2
 
3
3
  __author__ = """Qiusheng Wu"""
4
4
  __email__ = "giswqs@gmail.com"
5
- __version__ = "0.14.0"
5
+ __version__ = "0.16.0"
6
6
 
7
7
 
8
8
  import os
@@ -101,3 +101,23 @@ def set_proj_lib_path(verbose=False):
101
101
 
102
102
  from .dinov3 import DINOv3GeoProcessor, analyze_image_patches, create_similarity_map
103
103
  from .geoai import *
104
+
105
+ from .timm_train import (
106
+ get_timm_model,
107
+ modify_first_conv_for_channels,
108
+ TimmClassifier,
109
+ RemoteSensingDataset,
110
+ train_timm_classifier,
111
+ predict_with_timm,
112
+ list_timm_models,
113
+ )
114
+
115
+ from .timm_segment import (
116
+ TimmSegmentationModel,
117
+ SegmentationDataset,
118
+ train_timm_segmentation,
119
+ predict_segmentation,
120
+ train_timm_segmentation_model,
121
+ timm_semantic_segmentation,
122
+ push_timm_model_to_hub,
123
+ )
@@ -561,7 +561,15 @@ class ChangeDetection:
561
561
 
562
562
  return fig
563
563
 
564
- def visualize_results(self, image1_path, image2_path, binary_path, prob_path):
564
+ def visualize_results(
565
+ self,
566
+ image1_path,
567
+ image2_path,
568
+ binary_path,
569
+ prob_path,
570
+ title1="Earlier Image",
571
+ title2="Later Image",
572
+ ):
565
573
  """Create enhanced visualization with probability analysis."""
566
574
 
567
575
  # Load data
@@ -594,11 +602,11 @@ class ChangeDetection:
594
602
 
595
603
  # Row 1: Original and overlays
596
604
  axes[0, 0].imshow(img1_crop)
597
- axes[0, 0].set_title("2019 Image", fontweight="bold")
605
+ axes[0, 0].set_title(title1, fontweight="bold")
598
606
  axes[0, 0].axis("off")
599
607
 
600
608
  axes[0, 1].imshow(img2_crop)
601
- axes[0, 1].set_title("2022 Image", fontweight="bold")
609
+ axes[0, 1].set_title(title2, fontweight="bold")
602
610
  axes[0, 1].axis("off")
603
611
 
604
612
  # Binary overlay
@@ -708,6 +716,8 @@ class ChangeDetection:
708
716
  image2_path,
709
717
  binary_path,
710
718
  prob_path,
719
+ title1="Earlier Image",
720
+ title2="Later Image",
711
721
  output_path="split_comparison.png",
712
722
  ):
713
723
  """Create a split comparison visualization showing before/after with change overlay."""
@@ -742,7 +752,7 @@ class ChangeDetection:
742
752
  # Create split comparison
743
753
  fig, ax = plt.subplots(1, 1, figsize=(15, 10))
744
754
 
745
- # Create combined image - left half is 2019, right half is 2022
755
+ # Create combined image - left half is earlier, right half is later
746
756
  combined_img = np.zeros_like(img1)
747
757
  combined_img[:, : w // 2] = img1[:, : w // 2]
748
758
  combined_img[:, w // 2 :] = img2[:, w // 2 :]
@@ -763,7 +773,7 @@ class ChangeDetection:
763
773
  ax.text(
764
774
  w // 4,
765
775
  50,
766
- "2019",
776
+ title1,
767
777
  fontsize=20,
768
778
  color="white",
769
779
  ha="center",
@@ -772,7 +782,7 @@ class ChangeDetection:
772
782
  ax.text(
773
783
  3 * w // 4,
774
784
  50,
775
- "2022",
785
+ title2,
776
786
  fontsize=20,
777
787
  color="white",
778
788
  ha="center",
@@ -32,6 +32,9 @@ from .train import (
32
32
  instance_segmentation,
33
33
  instance_segmentation_batch,
34
34
  instance_segmentation_inference_on_geotiff,
35
+ lightly_embed_images,
36
+ lightly_train_model,
37
+ load_lightly_pretrained_model,
35
38
  object_detection,
36
39
  object_detection_batch,
37
40
  semantic_segmentation,