opengeos / segment-geospatial

A Python package for segmenting geospatial data with the Segment Anything Model (SAM)
https://samgeo.gishub.org
MIT License
2.95k stars 302 forks source link

Exception: 'NoneType' object has no attribute 'crop' #191

Open hrezvan opened 1 year ago

hrezvan commented 1 year ago

I am trying to implement FastSAM in a for loop. I have a couple of bboxes in a list like below: bbox[4:7] [[58.925381, 31.177402, 58.940381, 31.167402], [58.940381, 31.167402, 58.955381, 31.157402], [58.955381, 31.157402, 58.970381, 31.147402]] in each loop I want to have a segmentation. every things is OK until the sixth loop which I get the Exception: 'NoneType' object has no attribute 'crop' error message for the tms_to_geotiff function. how can I solve this issue? BTW here is my for loop code:

for j in range(len(bbox)):
  tms_to_geotiff(output='Image.tif', bbox=bbox[j], zoom=19, source="Satellite", overwrite=True)
  sam.set_image('Image.tif')
  output_mask_name = 'mask_'+str(j)+'.tif'
  sam.everything_prompt(output=output_mask_name)
  output_geojson_name = 'mask_'+str(j)+'.geojson'
  sam.raster_to_vector(output_mask_name, output_geojson_name)

In addition to the for loop, sometimes when I want to segment objects according to the FastSAM notebook, I get this error.

giswqs commented 1 year ago

Please provide complete source code for debugging.

hrezvan commented 1 year ago

Please provide complete source code for debugging.

%pip install segment-geospatial segment-anything-fast

import leafmap
from samgeo import tms_to_geotiff
from samgeo.fast_sam import SamGeo
m = leafmap.Map(center=[27.371051, 62.359569], zoom=16, height="800px")
m.add_basemap("SATELLITE")
m
import numpy as np
x_range = np.arange(58.865381, 63.425381, 0.015)
y_range = np.arange(31.217403, 24.967403, -0.01)
x = x_range.tolist()
y = y_range.tolist()
bbox = []
for i in range(len(x)-1):
  for j in range(len(y)-1):
    box = [x[i], y[i], x[i+1], y[i+1]]
    bbox.append(box)
from samgeo.fast_sam import SamGeo
sam = SamGeo(model="FastSAM-x.pt")
for k in range(len(bbox)):
  tms_to_geotiff(output='Image.tif', bbox=bbox[k], zoom=16, source="Satellite", overwrite=True)
  sam.set_image('Image.tif')
  output_mask_name = 'mask_'+str(k)+'.tif'
  sam.everything_prompt(output=output_mask_name)
  output_geojson_name = 'mask_'+str(k)+'.geojson'
  sam.raster_to_vector(output_mask_name, output_geojson_name)
rsousa95 commented 10 months ago

I got the same issue. Did you manage to fix it?

hrezvan commented 10 months ago

unfortunately not!

krishnaglodha commented 5 months ago

You guys found any solution ?

chad-fisher commented 1 week ago

It's because the bounding box needed is not in the same form as expected. The x and y need to be switched!