Change Detection with Instance Segmentation¶
This notebook demonstrates the change detection functionality in GeoAI, which provides instance segmentation and confidence scoring for individual change objects.
The change detection functionality builds upon the torchange package developed by Dr. Zhuo Zheng. We have made it much easier to analyze remote sensing imagery and visualize the results.
Overview¶
The change detection system provides:
- Instance Segmentation: Each change object gets a unique ID
- Confidence Scores: Individual confidence values for each detected instance
- Proper GeoTIFF Output: Maintains spatial reference information
Key Features¶
- Instance-level change detection with unique IDs
- Confidence scoring for quality assessment
- Support for large GeoTIFF files
- Comprehensive analysis capabilities
Install packages¶
# %pip install geoai-py
Import libraries¶
import geoai
import os
import numpy as np
import matplotlib.pyplot as plt
from pathlib import Path
Setup¶
# Check if CUDA is available
device = geoai.get_device()
print(f"Using device: {device}")
# Set up paths
out_folder = "change_detection_results"
Path(out_folder).mkdir(exist_ok=True)
print(f"Working directory: {out_folder}")
Download sample data¶
We'll use NAIP imagery for Las Vegas to demonstrate change detection.
# Download NAIP imagery
naip_2019_url = "https://huggingface.co/datasets/giswqs/geospatial/resolve/main/las_vegas_naip_2019_a.tif"
naip_2022_url = "https://huggingface.co/datasets/giswqs/geospatial/resolve/main/las_vegas_naip_2022_a.tif"
naip_2019_path = geoai.download_file(naip_2019_url)
naip_2022_path = geoai.download_file(naip_2022_url)
print(f"Downloaded 2019 NAIP: {naip_2019_path}")
print(f"Downloaded 2022 NAIP: {naip_2022_path}")
Visualize sample data¶
# Check raster information
geoai.get_raster_info(naip_2019_path)
# View the images
geoai.view_raster(naip_2019_path)
geoai.view_raster(naip_2022_path)
Initialize Change Detection¶
Create the change detection system with optimal parameters.
# Initialize change detection
detector = geoai.ChangeDetection(sam_model_type="vit_h")
# Configure parameters (following the torchange example)
detector.set_hyperparameters(
change_confidence_threshold=145,
use_normalized_feature=True,
bitemporal_match=True,
)
detector.set_mask_generator_params(
points_per_side=32,
stability_score_thresh=0.95,
)
print("Change detection system initialized!")
Run Change Detection¶
Execute change detection with instance segmentation and confidence scoring.
# Run change detection
results = detector.detect_changes(
naip_2019_path,
naip_2022_path,
output_path=f"{out_folder}/binary_mask.tif",
export_probability=True,
probability_output_path=f"{out_folder}/probability_mask.tif",
export_instance_masks=True,
instance_masks_output_path=f"{out_folder}/instance_masks.tif",
return_detailed_results=True,
return_results=False,
)
print(f"Change detection completed!")
print(f"Total instances detected: {results['summary']['total_masks']}")
print(f"Image size: {results['summary']['original_shape']}")
Analyze Results¶
Display key statistics and quality metrics.
# Display statistics
if "statistics" in results and results["statistics"]:
print("Quality Statistics:")
for metric, stats in results["statistics"].items():
print(f" {metric}: mean={stats['mean']:.3f}, std={stats['std']:.3f}")
# Show top instances
if "masks" in results and len(results["masks"]) > 0:
print("\nTop 5 detected instances:")
for i, mask in enumerate(results["masks"][:5]):
print(
f" {i+1}. Instance {mask['mask_id']}: "
f"IoU={mask['iou_pred']:.3f}, "
f"Stability={mask['stability_score']:.3f}, "
f"Area={mask['area']} pixels"
)
Visualizations¶
Use the integrated visualization methods for comprehensive analysis.
# probability visualization
detector.visualize_results(
naip_2019_path,
naip_2022_path,
f"{out_folder}/binary_mask.tif",
f"{out_folder}/probability_mask.tif",
)
# Create split comparison visualization
detector.create_split_comparison(
naip_2019_path,
naip_2022_path,
f"{out_folder}/binary_mask.tif",
f"{out_folder}/probability_mask.tif",
f"{out_folder}/split_comparison.png",
)
# Analyze individual instances
instance_stats = detector.analyze_instances(
f"{out_folder}/instance_masks.tif",
f"{out_folder}/instance_masks_scores.tif",
f"{out_folder}/instance_analysis.png",
)
Comprehensive Analysis Report¶
Generate a detailed analysis report combining all metrics.
# Create comprehensive analysis report
detector.create_comprehensive_report(results, f"{out_folder}/comprehensive_report.png")
One-Click Complete Analysis¶
For ultimate simplicity, use the complete analysis method.
# Alternative: Run complete analysis in one step
# This method does everything - detection, file outputs, and all visualizations
complete_results = detector.run_complete_analysis(
naip_2019_path, naip_2022_path, "complete_analysis_results"
)
Summary¶
This notebook demonstrated the change detection functionality in GeoAI with integrated visualization methods:
Key Features Used:¶
- Change Detection: Instance segmentation with confidence scoring
- Integrated Visualizations: Built-in methods for comprehensive analysis
- Simplified API: Clean, streamlined interface following geoai patterns
- Complete Analysis: One-click method for full analysis workflow
Output Files Generated:¶
binary_mask.tif
: Traditional binary change detectionprobability_mask.tif
: Probability-weighted change detectioninstance_masks.tif
: Instance segmentation with unique IDsinstance_masks_scores.tif
: Confidence scores for each instanceenhanced_probability_results.png
: Comprehensive visualizationsplit_comparison.png
: Before/after split comparisoninstance_analysis.png
: Individual instance analysiscomprehensive_report.png
: Complete analysis report
Advantages Over Traditional Methods:¶
- Instance-Level Analysis: Each change object has unique ID and metrics
- Quality Assessment: Confidence scores for filtering and ranking
- Rich Visualizations: Multiple analysis perspectives in one package
- Simplified Workflow: Integrated methods reduce code complexity
- Flexible Usage: From simple detection to comprehensive analysis