Spaces:
Sleeping
Sleeping
DynamicPacific
commited on
Commit
·
dbdc03c
1
Parent(s):
961360f
Revert to original GeoTIFF-only implementation
Browse files- Removed multi-format image support (PNG, JPG, etc.)
- Restored original process_geotiff_file function
- Restored GeoTIFF-only file input
- Restored original advanced_extraction.py implementation
- Back to simple, working GeoTIFF tree detection
- app.py +25 -45
- utils/advanced_extraction.py +1 -1
app.py
CHANGED
@@ -154,59 +154,44 @@ def create_split_view_map(geojson_data, bounds):
|
|
154 |
m = folium.Map(location=[40.7, -74.0], zoom_start=10)
|
155 |
return m
|
156 |
|
157 |
-
def
|
158 |
-
"""Process uploaded
|
159 |
-
if
|
160 |
-
return None, "Please upload
|
161 |
|
162 |
try:
|
163 |
# Create unique ID
|
164 |
unique_id = str(uuid.uuid4().hex)[:8]
|
165 |
|
166 |
# Handle file upload
|
167 |
-
if hasattr(
|
168 |
-
filename = os.path.basename(
|
169 |
else:
|
170 |
-
filename = os.path.basename(
|
171 |
|
172 |
# Save uploaded file
|
173 |
-
|
174 |
|
175 |
-
if hasattr(
|
176 |
-
file_content =
|
177 |
-
with open(
|
178 |
f.write(file_content)
|
179 |
else:
|
180 |
-
shutil.copy(
|
181 |
|
182 |
-
logger.info(f"File saved to {
|
183 |
|
184 |
-
#
|
185 |
-
|
186 |
-
|
187 |
-
|
188 |
-
|
189 |
-
logger.info("Extracting tree features from GeoTIFF...")
|
190 |
-
geojson_data = extract_features_from_geotiff(image_path, TEMP_DIRS['processed'], "trees")
|
191 |
-
else:
|
192 |
-
# Use general image processing for other formats
|
193 |
-
from utils.geospatial import process_image_to_geojson
|
194 |
-
from utils.image_processing import process_image
|
195 |
-
|
196 |
-
logger.info("Processing regular image for tree detection...")
|
197 |
-
processed_image_path = process_image(image_path, TEMP_DIRS['processed'])
|
198 |
-
geojson_data = process_image_to_geojson(processed_image_path, feature_type="trees", original_file_path=image_path)
|
199 |
|
200 |
if not geojson_data or not geojson_data.get('features'):
|
201 |
return None, "No trees detected in the image"
|
202 |
|
203 |
# Get bounds and create map
|
204 |
-
|
205 |
-
bounds = get_bounds_from_geotiff(image_path)
|
206 |
-
else:
|
207 |
-
# For regular images, use default bounds or extract from metadata
|
208 |
-
bounds = get_bounds_from_geotiff(image_path) # This will use defaults for non-GeoTIFF files
|
209 |
-
|
210 |
map_obj = create_split_view_map(geojson_data, bounds)
|
211 |
|
212 |
if map_obj:
|
@@ -304,7 +289,7 @@ def create_gradio_interface():
|
|
304 |
gr.HTML("""
|
305 |
<div style="text-align: center; padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; margin-bottom: 20px;">
|
306 |
<h1 style="color: white; margin: 0; font-size: 2.5em;">🌲 ForestAI</h1>
|
307 |
-
<p style="color: white; margin: 10px 0 0 0; font-size: 1.2em;">Tree Detection from Satellite
|
308 |
</div>
|
309 |
""")
|
310 |
|
@@ -313,8 +298,8 @@ def create_gradio_interface():
|
|
313 |
gr.Markdown("### Upload GeoTIFF File")
|
314 |
|
315 |
file_input = gr.File(
|
316 |
-
label="Select
|
317 |
-
file_types=[".tif", ".tiff"
|
318 |
type="filepath"
|
319 |
)
|
320 |
|
@@ -359,7 +344,7 @@ def create_gradio_interface():
|
|
359 |
display:flex; align-items:center; justify-content:center;
|
360 |
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);">
|
361 |
<div style="text-align:center; color:#666;">
|
362 |
-
<h3>🌲 Upload
|
363 |
<p>Interactive map will appear here</p>
|
364 |
</div>
|
365 |
</div>
|
@@ -369,7 +354,7 @@ def create_gradio_interface():
|
|
369 |
|
370 |
# Event handlers
|
371 |
analyze_btn.click(
|
372 |
-
fn=
|
373 |
inputs=[file_input],
|
374 |
outputs=[map_output, status_output],
|
375 |
show_progress=True
|
@@ -385,16 +370,11 @@ def create_gradio_interface():
|
|
385 |
# Simple instructions
|
386 |
gr.Markdown("""
|
387 |
### How to Use:
|
388 |
-
1. **Upload**
|
389 |
2. **Click** "Detect Trees" to analyze your uploaded image
|
390 |
3. **Explore** the interactive map with detected tree areas
|
391 |
4. **Use** the split-view slider to compare base map and satellite imagery
|
392 |
|
393 |
-
### Supported Formats:
|
394 |
-
- **GeoTIFF (.tif, .tiff)**: Best for satellite imagery with geographic data
|
395 |
-
- **Regular Images (.png, .jpg, .jpeg, .bmp, .gif)**: For general image analysis
|
396 |
-
- **Processing**: GeoTIFF files use advanced NDVI analysis, other formats use general image processing
|
397 |
-
|
398 |
### Map Controls:
|
399 |
- **Split View**: Drag the vertical slider to compare layers
|
400 |
- **Zoom**: Scroll to zoom in/out, drag to pan
|
|
|
154 |
m = folium.Map(location=[40.7, -74.0], zoom_start=10)
|
155 |
return m
|
156 |
|
157 |
+
def process_geotiff_file(geotiff_file):
|
158 |
+
"""Process uploaded GeoTIFF file for tree detection."""
|
159 |
+
if geotiff_file is None:
|
160 |
+
return None, "Please upload a GeoTIFF file or use the example file"
|
161 |
|
162 |
try:
|
163 |
# Create unique ID
|
164 |
unique_id = str(uuid.uuid4().hex)[:8]
|
165 |
|
166 |
# Handle file upload
|
167 |
+
if hasattr(geotiff_file, 'name'):
|
168 |
+
filename = os.path.basename(geotiff_file.name)
|
169 |
else:
|
170 |
+
filename = os.path.basename(geotiff_file)
|
171 |
|
172 |
# Save uploaded file
|
173 |
+
geotiff_path = os.path.join(TEMP_DIRS['uploads'], f"{unique_id}_{filename}")
|
174 |
|
175 |
+
if hasattr(geotiff_file, 'read'):
|
176 |
+
file_content = geotiff_file.read()
|
177 |
+
with open(geotiff_path, "wb") as f:
|
178 |
f.write(file_content)
|
179 |
else:
|
180 |
+
shutil.copy(geotiff_file, geotiff_path)
|
181 |
|
182 |
+
logger.info(f"File saved to {geotiff_path}")
|
183 |
|
184 |
+
# Import and extract features
|
185 |
+
from utils.advanced_extraction import extract_features_from_geotiff
|
186 |
+
|
187 |
+
logger.info("Extracting tree features...")
|
188 |
+
geojson_data = extract_features_from_geotiff(geotiff_path, TEMP_DIRS['processed'], "trees")
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
189 |
|
190 |
if not geojson_data or not geojson_data.get('features'):
|
191 |
return None, "No trees detected in the image"
|
192 |
|
193 |
# Get bounds and create map
|
194 |
+
bounds = get_bounds_from_geotiff(geotiff_path)
|
|
|
|
|
|
|
|
|
|
|
195 |
map_obj = create_split_view_map(geojson_data, bounds)
|
196 |
|
197 |
if map_obj:
|
|
|
289 |
gr.HTML("""
|
290 |
<div style="text-align: center; padding: 20px; background: linear-gradient(135deg, #667eea 0%, #764ba2 100%); border-radius: 10px; margin-bottom: 20px;">
|
291 |
<h1 style="color: white; margin: 0; font-size: 2.5em;">🌲 ForestAI</h1>
|
292 |
+
<p style="color: white; margin: 10px 0 0 0; font-size: 1.2em;">Tree Detection from Satellite Imagery</p>
|
293 |
</div>
|
294 |
""")
|
295 |
|
|
|
298 |
gr.Markdown("### Upload GeoTIFF File")
|
299 |
|
300 |
file_input = gr.File(
|
301 |
+
label="Select GeoTIFF File",
|
302 |
+
file_types=[".tif", ".tiff"],
|
303 |
type="filepath"
|
304 |
)
|
305 |
|
|
|
344 |
display:flex; align-items:center; justify-content:center;
|
345 |
background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);">
|
346 |
<div style="text-align:center; color:#666;">
|
347 |
+
<h3>🌲 Upload a GeoTIFF file or use example to see detected trees</h3>
|
348 |
<p>Interactive map will appear here</p>
|
349 |
</div>
|
350 |
</div>
|
|
|
354 |
|
355 |
# Event handlers
|
356 |
analyze_btn.click(
|
357 |
+
fn=process_geotiff_file,
|
358 |
inputs=[file_input],
|
359 |
outputs=[map_output, status_output],
|
360 |
show_progress=True
|
|
|
370 |
# Simple instructions
|
371 |
gr.Markdown("""
|
372 |
### How to Use:
|
373 |
+
1. **Upload** a GeoTIFF satellite image file OR click "Use Example File" to try with the included sample
|
374 |
2. **Click** "Detect Trees" to analyze your uploaded image
|
375 |
3. **Explore** the interactive map with detected tree areas
|
376 |
4. **Use** the split-view slider to compare base map and satellite imagery
|
377 |
|
|
|
|
|
|
|
|
|
|
|
378 |
### Map Controls:
|
379 |
- **Split View**: Drag the vertical slider to compare layers
|
380 |
- **Zoom**: Scroll to zoom in/out, drag to pan
|
utils/advanced_extraction.py
CHANGED
@@ -83,4 +83,4 @@ def extract_features_from_geotiff(image_path, output_folder, feature_type="trees
|
|
83 |
|
84 |
except Exception as e:
|
85 |
logging.error(f"Error extracting features: {str(e)}")
|
86 |
-
return {"type": "FeatureCollection", "features": []}
|
|
|
83 |
|
84 |
except Exception as e:
|
85 |
logging.error(f"Error extracting features: {str(e)}")
|
86 |
+
return {"type": "FeatureCollection", "features": []}
|