DEVISE (Depth-Aware Vegetation Indexing System) is a comprehensive Python package for vegetation analysis that combines semantic segmentation with depth estimation to provide accurate vegetation indexing. The system leverages state-of-the-art deep learning models to identify and quantify vegetation coverage in images while incorporating depth information for enhanced analysis. Applied to 1,441,746 panoramas collected every 20 m along the road networks of 60 U.S. swing counties (2004-2024), DEVISE produces the first county-month panel of street-level greenness spanning two decades.
This package implements the methodology described in our research paper: "DEVISE: Depth-Aware Vegetation Indexing System"
Below are sample images processed using the DEVISE system:
# Clone the repository
git clone https://github.com/NNyarlathotep/DEVISE.git
cd devise-pkg
# Install the package
pip install -e .import devise
# Run the complete DEVISE pipeline
devise.run_complete_pipeline(
raw_folder="raw_images", # Input images
resized_folder="resized", # Preprocessed images
mask_folder="masks", # Segmentation masks
depth_mask_folder="depth_masks", # Depth data (.npy files)
depth_image_folder="depth_images", # Depth visualizations
result_folder="results", # Final combined results
gvi_db_path="gvi.db", # GVI database
depth_db_path="depth_gvi.db" # Depth-weighted GVI database
)import devise
# For faster processing without depth analysis
devise.quick_vegetation_analysis(
raw_folder="raw_images",
output_folder="output",
db_path="results.db"
)import devise
# Step-by-step processing with new function names
# 1. Vegetation segmentation and GVI calculation
devise.run_vegetation_analysis_pipeline(
"raw_images", "resized", "masks", "gvi.db"
)
# 2. Depth map generation
devise.generate_depth_maps_batch(
"resized", "depth_masks", "depth_images"
)
# 3. Depth-weighted GVI calculation
devise.compute_depth_weighted_gvi_batch(
"masks", "depth_masks", "depth_gvi.db"
)
# 4. Generate visualization overlays
devise.generate_visualization_batch(
"resized", "masks", "results"
)import devise
import numpy as np
# Process a single image with custom parameters
devise.create_vegetation_overlay(
image_path="image.jpg",
mask_npy_path="mask.npy",
output_path="result.jpg",
alpha=0.6 # Adjust transparency
)
# Estimate depth for a single image
devise.estimate_depth_for_image(
image_path="image.jpg",
depth_npy_output_path="depth.npy",
depth_vis_output_path="depth_vis.jpg"
)
# Calculate depth-weighted GVI for custom data
mask = np.load("vegetation_mask.npy")
depth = np.load("depth_map.npy")
tree_gvi = devise.calculate_depth_weighted_gvi(mask[:,:,0], depth)
grass_gvi = devise.calculate_depth_weighted_gvi(mask[:,:,1], depth)
plant_gvi = devise.calculate_depth_weighted_gvi(mask[:,:,2], depth)
# Database operations
conn = devise.initialize_gvi_database("custom.db")
devise.save_gvi_to_database(conn, "image_001", 0.65, 0.23, 0.12, 1.0)
conn.close()run_complete_pipeline(...)- Execute full DEVISE workflow with depth analysisquick_vegetation_analysis(...)- Fast vegetation analysis without depthrun_vegetation_analysis_pipeline(...)- Segmentation and GVI calculationgenerate_depth_maps_batch(...)- Batch depth estimationcompute_depth_weighted_gvi_batch(...)- Batch depth-weighted GVIgenerate_visualization_batch(...)- Batch visualization generation
segment_vegetation_and_calculate_gvi(...)- Segment single image and compute GVIcompute_vegetation_indices(...)- Calculate GVI from maskcalculate_depth_weighted_gvi(...)- Compute depth-weighted GVIcreate_vegetation_overlay(...)- Create visualization overlay
preprocess_image(...)- Remove borders and resize imageapply_vegetation_color_filter(...)- Apply HSV filteringestimate_depth_for_image(...)- Estimate depth for single image
initialize_gvi_database(...)- Create/connect to GVI databasesave_gvi_to_database(...)- Save GVI results to databaseinit_depth_gvi_db(...)- Initialize depth-weighted GVI databasesave_depth_gvi_results(...)- Save depth GVI results
devise/
├── combine.py # Image overlay and visualization generation
├── depth.py # Monocular depth estimation using DPT
├── depth_combine.py # Depth-weighted GVI calculation
├── pipeline.py # Main segmentation and GVI pipeline
├── print_gvi.py # Database query utilities for standard GVI
├── print_gvi_with_depth.py # Database query utilities for depth GVI
└── __init__.py # Package entry point with convenience functions
- Segmentation:
facebook/mask2former-swin-large-ade-semantic - Depth Estimation:
Intel/dpt-large
Both models are automatically downloaded from Hugging Face Hub on first use.
The system stores results in SQLite databases with the following structure:
CREATE TABLE gvi (
image_id TEXT PRIMARY KEY,
tree_gvi REAL, -- Green Vegetation Index for trees
grass_gvi REAL, -- Green Vegetation Index for grass
plant_gvi REAL, -- Green Vegetation Index for plants
total_gvi REAL -- Combined vegetation index
);- Segmentation masks:
.npyfiles with per-pixel class predictions (3 channels: trees, grass, plants) - Depth maps:
.npyfiles with normalized depth values [0, 1] - Visualizations:
.jpgoverlay images showing segmentation results - Databases:
.dbfiles with GVI measurements
- Python 3.12+
- PyTorch 1.9+
- Transformers 4.15+
- OpenCV 4.5+
- NumPy 1.21+
- Pillow 8.0+
This project is licensed under the MIT License - see the LICENSE file for details.
Cantay Caliskan Email: ccaliska@ur.rochester.edu
Zhizhuang Chen
Email: zchen141@u.rochester.edu
Junjie Zhao Email: jzhao58@u.rochester.edu
Linglan Yang Email: lyang49@u.rochester.edu
Mingzhen Zhang Email: mzhang96@u.rochester.edu






