File size: 2,516 Bytes
59ebac7
 
 
25c63a5
e945b1f
14effdf
59ebac7
 
e945b1f
73bb7b5
7d6e00c
 
59ebac7
e945b1f
73bb7b5
 
 
 
 
e945b1f
 
73bb7b5
 
 
 
 
 
 
e945b1f
73bb7b5
 
 
 
7d6e00c
73bb7b5
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# Press the green button in the gutter to run the script.
import json

from src import app_logger
from src.utilities.constants import ROOT, MODEL_NAME, ZOOM, SOURCE_TYPE
from src.utilities.type_hints import input_floatlist, input_floatlist2


def samgeo_fast_predict(bbox: input_floatlist, zoom: float = ZOOM, model_name: str = MODEL_NAME, root_folder: str = ROOT, source_type: str = SOURCE_TYPE) -> dict:
    import tempfile
    from samgeo import tms_to_geotiff
    from samgeo.fast_sam import SamGeo

    with tempfile.NamedTemporaryFile(prefix=f"{source_type}_", suffix=".tif", dir=root_folder) as image_input_tmp:
        app_logger.info(f"start tms_to_geotiff using bbox:{bbox}, type:{type(bbox)}, download image to {image_input_tmp.name} ...")
        for coord in bbox:
            app_logger.info(f"coord:{coord}, type:{type(coord)}.")

        # bbox: image input coordinate
        tms_to_geotiff(output=image_input_tmp.name, bbox=bbox, zoom=zoom, source=source_type, overwrite=True)
        app_logger.info(f"geotiff created, start to initialize SamGeo instance (read model {model_name} from {root_folder})...")

        predictor = SamGeo(
            model_type=model_name,
            checkpoint_dir=root_folder,
            automatic=False,
            sam_kwargs=None,
        )
        app_logger.info(f"initialized SamGeo instance, start to use SamGeo.set_image({image_input_tmp.name})...")
        predictor.set_image(image_input_tmp.name)

        with tempfile.NamedTemporaryFile(prefix="output_", suffix=".tif", dir=root_folder) as image_output_tmp:
            app_logger.info(f"done set_image, start prediction using {image_output_tmp.name} as output...")
            predictor.everything_prompt(output=image_output_tmp.name)

            # geotiff to geojson
            with tempfile.NamedTemporaryFile(prefix="feats_", suffix=".geojson", dir=root_folder) as vector_tmp:
                app_logger.info(f"done prediction, start conversion SamGeo.tiff_to_geojson({image_output_tmp.name}) => {vector_tmp.name}.")
                predictor.tiff_to_geojson(image_output_tmp.name, vector_tmp.name, bidx=1)

                app_logger.info(f"start reading geojson {vector_tmp.name}...")
                with open(vector_tmp.name) as out_gdf:
                    out_gdf_str = out_gdf.read()
                    out_gdf_json = json.loads(out_gdf_str)
                    app_logger.info(f"geojson {vector_tmp.name} string has length: {len(out_gdf_str)}.")
                    return out_gdf_json