SAM-Geo是一个用于地理空间数据的Python 包,可在 PyPI 和 conda-forge 上使用。本节教程是SAM-Geo官网的一个教程,根据输入提示范围创建mask遮罩。后面还有一种基于提示词创建的方式,如只输出房屋、道路、树木等,下一期我们专门写一篇。
输入提示是指提供给模型以指导其生成或决策过程的信息或指令。在使用 Segment Anything Model (SAM) 生成对象掩码的上下文中,输入提示可以是单个点或多个点,用于指定要为其生成掩码的对象或区域。
安装和导入库
pip install segment-geospatial leafmap localtileserver
import os
import leafmap
from samgeo import SamGeo, tms_to_geotiff
m = leafmap.Map(center=[10.029939778759502, 105.76756428014754], zoom=17, height="600px", width="800px")
m.add_basemap("SATELLITE")
m
要在地图上选择感兴趣的区域,您可以平移和缩放到所需位置。然后,使用绘图工具在地图上创建多边形或矩形。
if m.user_roi is not None:
bbox = m.user_roi_bounds()
bbox
else:
bbox = [105.764, 10.0274, 105.7715, 10.0329]
image = "ctu.tif"
tms_to_geotiff(output=image, bbox=bbox, zoom=16, source="Satellite", overwrite=True)
要使用您自己的图像,您可以选择取消注释并运行以下单元格。这将允许您将自定义图像合并到流程中。
# image = '/path/to/your/own/image.tif'
要在地图上展示下载的图像,您可以直接在地图界面中显示它。这使您能够将下载的图像与其他地图元素或图层一起可视化。
要初始化 SAM 类,您需要执行以下步骤:
指定模型检查点的文件路径:如果您有要使用的特定模型检查点,请提供该检查点的文件路径。如果未指定检查点,模型将下载到工作目录。
设置 automatic=False:要禁用 SamAutomaticMaskGenerator 并启用 SamPredictor,请将自动参数设置为 False。此配置更改允许您更好地控制掩码生成过程。
sam = SamGeo(
model_type="vit_h",
checkpoint="sam_vit_h_4b8939.pth",
automatic=False,
sam_kwargs=None,
)
要指定要分割的图像,您需要提供要分割的图像的路径或引用。这可以通过指示图像的文件路径或将图像对象直接传递给分割函数来实现。
sam.set_image(image)
对于使用输入点的图像分割,您可以灵活地使用单个点来分割对象。该点可以定义为表示 (col, row) 或 (lon, lat) 坐标的元组 (x, y)。或者,您可以使用矢量数据集的文件路径指定点。
如果输入的点不是(col, row)格式,可以提供point_crs参数自动将点转换为对应的图像列坐标和行坐标。这确保了点与图像正确对齐以进行准确分割。
单点输入:
point_coords = [[105.76755698844329, 10.029964842544715]]
sam.predict(point_coords, point_labels=1, point_crs="EPSG:4326", output="mask1.tif")
m.add_raster("mask1.tif", layer_name="Mask1", nodata=0, cmap="Blues", opacity=1)
m
point_coords = [[105.76755698844329, 10.029964842544715], [105.76807137023872, 10.02981441080665], [105.76721100868511, 10.029391083681455]]
sam.predict(point_coords, point_labels=1, point_crs="EPSG:4326", output="mask2.tif")
m.add_raster("mask2.tif", layer_name="Mask2", nodata=0, cmap="Greens", opacity=1)
m
显示交互地图:打开支持交互的地图界面。这可以使用合适的库或工具来实现。
使用标记工具:利用地图界面提供的标记工具在地图上绘制点。这些点用作分割感兴趣对象的标记。
分割对象:在地图上绘制点后,单击“分割”按钮启动分割过程。幕后的算法或模型将使用这些点作为输入来分割所需的对象。生成的分割将自动添加到地图中。
重置点和结果:如果需要,点击“重置”按钮清除绘制的点和分割结果。这使您可以重新开始并执行新的细分。
m = sam.show_map()
m