krupal02's picture
Deploy Multi-Hazard Warning System - MTL model for wildfire risk + AQI forecasting
d5b0af1
Raw
History Blame Contribute Delete
5.75 kB
"""
config.py — Single source of truth for all hyperparameters, paths, and API keys.
All configurable values live here. Import this module anywhere you need
a path, a training parameter, or an API endpoint.
"""
import os
from pathlib import Path
from dotenv import load_dotenv
# ---------------------------------------------------------------------------
# Load .env file (if present) for API keys
# ---------------------------------------------------------------------------
load_dotenv()
# ---------------------------------------------------------------------------
# Project Root — resolved relative to this file's location
# ---------------------------------------------------------------------------
PROJECT_ROOT = Path(__file__).resolve().parents[2] # multi-hazard-warning-system/
# ---------------------------------------------------------------------------
# Directory Structure
# ---------------------------------------------------------------------------
DATA_DIR = PROJECT_ROOT / "data"
RAW_DIR = DATA_DIR / "raw"
FIRMS_RAW_DIR = RAW_DIR / "firms"
WEATHER_RAW_DIR = RAW_DIR / "weather"
AQI_RAW_DIR = RAW_DIR / "aqi"
PROCESSED_DIR = DATA_DIR / "processed"
IMAGE_PATCHES_DIR = PROCESSED_DIR / "image_patches"
TIMESERIES_DIR = PROCESSED_DIR / "timeseries"
SPLITS_DIR = DATA_DIR / "splits"
CHECKPOINTS_DIR = PROJECT_ROOT / "checkpoints"
OUTPUTS_DIR = PROJECT_ROOT / "outputs"
NOTEBOOKS_DIR = PROJECT_ROOT / "notebooks"
# Auto-create directories
for _dir in [
FIRMS_RAW_DIR, WEATHER_RAW_DIR, AQI_RAW_DIR,
IMAGE_PATCHES_DIR, TIMESERIES_DIR, SPLITS_DIR,
CHECKPOINTS_DIR, OUTPUTS_DIR, NOTEBOOKS_DIR,
]:
_dir.mkdir(parents=True, exist_ok=True)
# ---------------------------------------------------------------------------
# API Keys & Endpoints
# ---------------------------------------------------------------------------
NASA_FIRMS_API_KEY = os.getenv("NASA_FIRMS_API_KEY", "")
OPENAQ_API_KEY = os.getenv("OPENAQ_API_KEY", "")
FIRMS_BASE_URL = "https://firms.modaps.eosdis.nasa.gov/api/area/csv"
OPEN_METEO_URL = "https://archive-api.open-meteo.com/v1/archive"
OPENAQ_BASE_URL = "https://api.openaq.org/v2"
# ---------------------------------------------------------------------------
# Geographic Defaults (California wildfire region)
# ---------------------------------------------------------------------------
DEFAULT_LATITUDE = 37.5
DEFAULT_LONGITUDE = -120.3
DEFAULT_BBOX = "-122.0,36.0,-118.0,39.0" # west, south, east, north
PATCH_SIZE = 128 # spatial resolution of image patches
# ---------------------------------------------------------------------------
# Data Pipeline
# ---------------------------------------------------------------------------
TIMESERIES_WINDOW = 7 # days of weather/AQI history per sample
TIMESERIES_FEATURES = 6 # temp, humidity, wind_speed, wind_dir, precip, PM2.5
IMAGE_CHANNELS = 4 # RGB + Near-Infrared
FIRE_CONFIDENCE_THRESHOLD = 80 # minimum FIRMS confidence score
NUM_SYNTHETIC_SAMPLES = 500 # fallback sample count when APIs are unavailable
# ---------------------------------------------------------------------------
# Model Architecture
# ---------------------------------------------------------------------------
CNN_FEATURE_DIM = 2048 # ResNet-50 output features
LSTM_HIDDEN_SIZE = 128 # per-direction hidden size
LSTM_NUM_LAYERS = 2
LSTM_BIDIRECTIONAL = True
LSTM_FEATURE_DIM = LSTM_HIDDEN_SIZE * (2 if LSTM_BIDIRECTIONAL else 1) # 256
FUSION_DIM = CNN_FEATURE_DIM + LSTM_FEATURE_DIM # 2304
SHARED_FC_DIMS = [512, 256]
DROPOUT_RATE = 0.3
# Task 1: Wildfire Risk Heatmap
HEATMAP_SIZE = (PATCH_SIZE, PATCH_SIZE) # 128×128
# Task 2: AQI Forecast
AQI_FORECAST_HOURS = 72 # predict 72 hourly values (24–72 hrs)
# ---------------------------------------------------------------------------
# Training Hyperparameters
# ---------------------------------------------------------------------------
BATCH_SIZE = 16
LEARNING_RATE = 1e-4
WEIGHT_DECAY = 1e-5
NUM_EPOCHS = 50
EARLY_STOP_PATIENCE = 10
LAMBDA_AQI = 0.5 # weighting factor for AQI loss in combined loss
TRAIN_RATIO = 0.70
VAL_RATIO = 0.15
TEST_RATIO = 0.15
# ---------------------------------------------------------------------------
# Device
# ---------------------------------------------------------------------------
import torch
DEVICE = "cpu" # HF Spaces free tier: CPU only
# ---------------------------------------------------------------------------
# Weights & Biases
# ---------------------------------------------------------------------------
WANDB_PROJECT = "multi-hazard-mtl"
WANDB_ENTITY = os.getenv("WANDB_ENTITY", None)
USE_WANDB = False # Disabled for deployment
# ---------------------------------------------------------------------------
# Checkpoint naming
# ---------------------------------------------------------------------------
BEST_MODEL_NAME = "best_mtl_model.pth"
BEST_MODEL_PATH = CHECKPOINTS_DIR / BEST_MODEL_NAME
# ---------------------------------------------------------------------------
# Inference
# ---------------------------------------------------------------------------
RISK_THRESHOLDS = {
"Low": (0.0, 0.25),
"Medium": (0.25, 0.50),
"High": (0.50, 0.75),
"Extreme": (0.75, 1.0),
}
# AQI categories (WHO / US EPA aligned)
AQI_CATEGORIES = {
"Good": (0, 50),
"Moderate": (51, 100),
"Unhealthy (Sensitive)": (101, 150),
"Unhealthy": (151, 200),
"Very Unhealthy": (201, 300),
"Hazardous": (301, 500),
}