Py学习  »  Python

Segment-geospatial: 地理空间图像分割开源Python工具包

GISer last • 2 月前 • 282 次点击  

点击下面卡片,快速关注本公众号

在地理空间分析领域,图像分割是一项至关重要的任务。它使我们能够从卫星或航空影像中识别和提取关键特征,进而获取关于空间分布、地物类型以及各类目标物体的详细信息。这些信息对于支持广泛领域的决策至关重要,例如农业、林业、环境监测等场景。

传统的图像分割方法主要依赖手动或半自动处理,这些方法既耗时又费力。近年来,深度学习模型的发展推动了分割过程的自动化。然而,这些模型通常需要大量的训练数据,并且计算成本高昂,这使得它们在许多应用场景中难以实际应用。

Meta AI研发的Segment Anything Model (SAM) 改变了这一现状。SAM是一种可提示的分割模型,具备卓越的零样本泛化能力,无需额外的训练即可应用于未知的物体和图像。该模型在包含1100万张图像和超过10亿个掩膜的数据集上进行了训练。用户可以使用现有的模型检查点分割任何图像中的任何物体,而无需进行额外的训练。自2023年4月发布以来,SAM已在包括医学影像在内的多个领域得到广泛应用。

然而,在地理空间领域,缺少基于SAM的Python包。segment-geospatial Python包就是为了填补这一空白而开发,并为地理空间数据分割提供低代码甚至无代码的解决方案。

segment-geospatial

segment-geospatial是一个旨在简化使用Segment Anything Model (SAM)分割地理空间数据的流程的开源Python包。该软件包充分利用了地理空间数据分析相关的的Python库,例如leafmap、ipywidgets、rasterio、geopandas和segment-anything-py,为用户提供了一个易于操作使用的图形化界面,用于分割遥感影像并将结果导出为包括矢量和栅格数据等各种格式。

1. 分割模式和主要功能

segment-geospatial提供以下分割模式:

  • 自动分割:无需任何用户输入,即可对图像进行自动分割。

  • 交互式GUI分割:通过图形用户界面 (GUI) 进行交互式分割,用户可以通过点击或绘制等方式引导分割。

  • 文本提示分割:基于文本提示 (由Grounding DINO模型驱动) 进行分割,用户可以通过自然语言描述来指定要分割的目标。

该软件包提供以下实用功能:

  • 遥感影像下载:支持从Tile Map Service (TMS) 服务器下载地图瓦片并创建GeoTIFF文件

  • GeoTIFF文件分割:使用Segment Anything Model (SAM) 和HQ-SAM分割GeoTIFF格式的地理空间影像文件。HQ-SAM是SAM的高质量版本,可以提供更精细的分割结果。

  • 文本提示分割遥感影像:通过文本提示,例如 "汽车"、"树木"、"建筑物" 等,引导 SAM 分割遥感影像中的特定地物目标。

  • 交互式前景和背景标记:在GUI界面中,用户可以通过交互式地添加前景和背景标记,来更精确地引导SAM进行分割。

  • 从矢量数据集加载现有标记:支持从常见的矢量数据集 (例如Shapefile, GeoJSON) 中加载已有的标记点或区域,并将其作为SAM的分割提示。

  • 保存分割结果为矢量格式:可以将分割结果保存为常见的矢量格式,例如 GeoPackage、Shapefile和GeoJSON,方便后续的GIS分析和应用。

  • 保存输入提示为GeoJSON文件:用户可以将输入的分割提示 (例如点、框、文本) 保存为GeoJSON文件,以便复用和共享。

  • 可视化交互式分割结果:在Jupyter环境中,可以交互式地可视化分割结果,方便用户评估分割效果和进行调整。

  • 时序遥感影像目标分割:支持对时序遥感影像进行目标分割,例如监测地物随时间的变化。 

2. 安装方法

segment-geospatial软件包可以通过两种方式安装:PyPI和conda-forge。

  • 使用PyPI安装

如果你的 Python 环境中已经安装了 pip 包管理器,可以直接在终端中运行以下命令进行安装:

1pip install segment-geospatial
  • 使用conda-forge安装

如果你使用Anaconda或Miniconda管理Python环境,建议使用conda安装,以获得更好的依赖管理和兼容性。

首先,创建一个新的 conda 环境(推荐):

1conda create -n geo python
2conda activate geo

然后,使用conda-forge和mamba (更快速的conda包管理器) 安装segment-geospatial及其依赖项:

1conda install -c conda-forge mamba
2mamba install -c conda-forge segment-geospatial

GPU 支持 (可选)

如果你的系统配备了NVIDIA GPU,并且希望利用GPU加速分割过程,可能需要手动安装支持CUDA的PyTorch版本。可以使用以下命令强制安装GPU版本的PyTorch:

1mamba install -c conda-forge segment-geospatial "pytorch=*=cuda*"

其他依赖项

segment-geospatial还有一些可选的依赖项,用于支持更高级的功能,例如文本提示分割。 如果需要使用这些功能,可以运行以下命令安装这些依赖项:

1mamba install -c conda-forge groundingdino-py segment-anything-fast

3. 使用案例

segment-geospatial提供了丰富的示例和演示,帮助用户快速上手和了解软件包的功能。以下是一些典型的使用案例:

  • 遥感影像自动分割: 使用自动掩膜生成器,无需任何提示,即可快速分割遥感影像中的所有物体。

  • 基于文本提示的图像分割(text prompts): 输入文本提示分割卫星影像中的物体(如树木、游泳池)

  • 交互式图像分割: 通过在GUI界面中点击某类目标,交互式地分割图像中的目标

  • 批量文本提示分割: 批量处理多张遥感影像,并使用文本提示分割特定地物。


  • 结合ArcGIS Pro: 在ArcGIS Pro环境中使用segment-geospatial进行图像分割。

  • 1import os
    2import leafmap
    3from samgeo import SamGeo
    4
    5workspace = os.path.dirname(arcpy.env.workspace)
    6os.chdir(workspace)
    7arcpy.env.overwriteOutput = True
    8
    9sam = SamGeo(
    10 model_type="vit_h",
    11 sam_kwargs=None,
    12)
    13
    14image = "water.tif"
    15sam.generate(image, output="water_masks.tif", foreground=True, unique=True)
    16sam.show_masks(cmap="binary_r")
    17sam.show_anns(axis="off", alpha=1, output="water_annotations.tif")
    18m.addDataFromPath(os.path.join(workspace, "water.tif"))
    19m.addDataFromPath(os.path.join(workspace, "water_annotations.tif"))
    20in_raster = os.path.join(workspace, "water_masks.tif")
    21out_shp = os.path.join(workspace, "water_masks.shp")
    22arcpy.conversion.RasterToPolygon(in_raster, out_shp)
  • 卫星影像变化检测: 使用时序卫星影像,检测地物随时间的变化情况。


更多详细的使用案例和代码示例,请参考官方文档和示例 notebooks。

4. 与其他GIS软件集成

segment-geospatial软件包还可以与桌面GIS软件集成,例如QGIS和ArcGIS,扩展其在地理空间分析领域的应用范围。

  • QGIS: 可以结合QGIS的Geometric Attributes插件,实现更强大的地理空间分析功能。

  • ArcGIS: ArcGIS提供了Segment Anything Model (SAM) Toolbox和Resources for Unlocking the Power of Deep Learning Applications Using ArcGIS工具箱,方便用户在 ArcGIS环境中使用SAM进行图像分割。

5. 计算资源支持

Segment Anything Model (SAM)本身是一个计算密集型的模型,建议使用配备高性能GPU的计算机运行,以获得更流畅的体验和更快的处理速度。推荐至少配备8GB GPU显存的GPU。

如果你没有高性能GPU,也可以考虑以下方案:

  • Google Colab:利用Google Colab提供的免费GPU资源。

  • AWS Cloud Credit for Research::申请亚马逊AWS提供的科研云平台,利用AWS云平台上的GPU资源进行计算。

未来,segment-geospatial软件包将继续完善和发展,例如:

  • 支持更多类型的遥感数据:例如多光谱、高光谱数据。

  • 集成更多先进的分割算法:例如针对遥感影像特点优化的SAM变体。

  • 提供更丰富的地理空间分析功能:例如变化检测、目标追踪等。

segment-geospatial软件包的发布,为地理空间数据分割领域带来了新的可能性。它凭借用户友好的界面、高效的分割性能、灵活的分割模式和强大的扩展性,有望成为地理空间分析人员进行图像分割的得力助手。

References:

  • Wu, Q., & Osco, L. P. (2023). samgeo: A Python package for segmenting geospatial data with the Segment Anything Model (SAM). Journal of Open Source Software, 8(89), 5663. https://doi.org/10.21105/joss.05663

  • Osco, L. P., Wu, Q., de Lemos, E. L., Gonçalves, W. N., Ramos, A. P. M., Li, J., & Junior, J. M. (2023). The Segment Anything Model (SAM) for remote sensing applications: From zero to one shot. International Journal of Applied Earth Observation and Geoinformation, 124, 103540. https://doi.org/10.1016/j.jag.2023.103540


本公众号相关内容推荐


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/178576
 
282 次点击