Geoglyph_SAM2 / main.py
JuanHernandez-uc
add SAM2 segmentation
7129113
Raw
History Blame Contribute Delete
3.25 kB
# main.py
# Application entrypoint — dual-mode: API server or CLI inference on a crop GeoTIFF.
import argparse
import json
import logging
import os
import sys
# Ensure the project root is on sys.path so `src` can be imported.
sys.path.insert(0, os.path.dirname(os.path.abspath(__file__)))
from src.logger import setup_logging
setup_logging()
logger = logging.getLogger("boot")
def main():
parser = argparse.ArgumentParser(
description="GeoGlyph SAM2 — API server and CLI for geoglyph detection.",
)
# ---------------------------------------------------------------------
# CLI mode
# ---------------------------------------------------------------------
parser.add_argument(
"--cli",
action="store_true",
help="Run a single inference from the command line instead of starting the API server.",
)
parser.add_argument(
"--crop",
type=str,
help="Path to a small georeferenced GeoTIFF crop. Required for --cli.",
)
parser.add_argument(
"--output",
type=str,
help="Output GeoPackage path. Required for --cli.",
)
parser.add_argument(
"--device",
type=str,
default=None,
choices=["cuda", "cpu"],
help="Inference device: cuda | cpu. Auto-detected by default.",
)
# ---------------------------------------------------------------------
# API mode
# ---------------------------------------------------------------------
parser.add_argument(
"--host",
type=str,
default="0.0.0.0",
help="API server host. Default: 0.0.0.0.",
)
parser.add_argument(
"--port",
type=int,
default=8000,
help="API server port. Default: 8000.",
)
args = parser.parse_args()
if args.cli:
if not args.crop or not args.output:
logger.error("--crop and --output are required in CLI mode.")
sys.exit(1)
from src.infer import run_geoglyph_sam2_on_crop
try:
logger.info(
"CLI inference | crop=%s output=%s device=%s",
args.crop,
args.output,
args.device,
)
result = run_geoglyph_sam2_on_crop(
crop_tif_path=args.crop,
output_gpkg=args.output,
device=args.device,
)
logger.info(
"CLI completed | n_masks=%d output=%s",
result["n_masks"],
result["output_gpkg"],
)
print(json.dumps(result, indent=2))
except Exception as exc:
logger.error("CLI inference failed: %s", exc, exc_info=True)
sys.exit(1)
else:
import uvicorn
logger.info("Starting GeoGlyph SAM2 API on %s:%d", args.host, args.port)
uvicorn.run(
"src.api:app",
host=args.host,
port=args.port,
reload=False,
)
if __name__ == "__main__":
main()
"""
python main.py --cli ^
--crop "C:\path\to\sam2_crop.tif" ^
--output "C:\path\to\sam2_result.gpkg" ^
--device cpu
python main.py --host 0.0.0.0 --port 8000
"""