Gaston
up hugging
b2293d5
Raw
History Blame Contribute Delete
9.37 kB
"""
===================================================================
CONFIG.PY - Configuración Global
===================================================================
Este archivo centraliza todos los parámetros configurables de la
aplicación, facilitando el mantenimiento y la experimentación.
Secciones:
1. Configuración de modelos
2. Configuración de imágenes
3. Parámetros de visualización
4. Parámetros de generación de features
5. Configuración de UI
===================================================================
"""
from pathlib import Path
from typing import Dict, List, Tuple
# ===================================================================
# 1. CONFIGURACIÓN DE MODELOS
# ===================================================================
# Modelos disponibles en la aplicación
AVAILABLE_MODELS = {
'alexnet': {
'name': 'AlexNet',
'description': 'Red clásica de ImageNet (8 capas)',
'size': '~244 MB',
'layers': ['features.0', 'features.3', 'features.6', 'features.8', 'features.10']
},
'resnet18': {
'name': 'ResNet-18',
'description': 'Red residual de 18 capas',
'size': '~44 MB',
'layers': ['layer1.0.conv1', 'layer2.0.conv1', 'layer3.0.conv1', 'layer4.0.conv1']
},
'vgg16': {
'name': 'VGG-16',
'description': 'Red profunda uniforme (16 capas)',
'size': '~528 MB',
'layers': ['features.0', 'features.5', 'features.10', 'features.17', 'features.24']
}
}
# Modelo por defecto al iniciar la app
DEFAULT_MODEL = 'alexnet'
# Device
DEFAULT_DEVICE = 'cpu' # Cambiar a 'cuda' si hay GPU disponible
# ===================================================================
# 2. CONFIGURACIÓN DE IMÁGENES
# ===================================================================
# Tamaño de entrada para los modelos (ImageNet standard)
IMAGE_SIZE: Tuple[int, int] = (224, 224)
# Tamaño máximo de archivo permitido (en MB)
MAX_UPLOAD_SIZE_MB = 10
# Formatos soportados
SUPPORTED_FORMATS = ['jpg', 'jpeg', 'png', 'bmp']
# Normalización ImageNet (mean y std por canal RGB)
IMAGENET_MEAN = [0.485, 0.456, 0.406]
IMAGENET_STD = [0.229, 0.224, 0.225]
# ===================================================================
# 3. PARÁMETROS DE VISUALIZACIÓN
# ===================================================================
# Mapas de calor
HEATMAP_COLORMAP = 'jet' # Opciones: 'jet', 'hot', 'viridis', 'plasma'
HEATMAP_ALPHA = 0.5 # Transparencia del overlay (0.0 - 1.0)
HEATMAP_INTERPOLATION = 'bilinear' # Interpolación al redimensionar
# ROI (Region of Interest)
ROI_SIZE: Tuple[int, int] = (64, 64) # Tamaño del recorte de máxima activación
ROI_BORDER_COLOR = 'red' # Color del borde del ROI
ROI_BORDER_WIDTH = 2 # Grosor del borde en píxeles
ROI_MARKER_SIZE = 100 # Tamaño de la estrella marcadora
# Figuras matplotlib
FIGURE_DPI = 100
FIGURE_STYLE = 'default' # Estilo de matplotlib
# ===================================================================
# 4. PARÁMETROS DE GENERACIÓN DE FEATURES (Gradient Ascent)
# ===================================================================
# Optimización
FEATURE_ITERATIONS = 500 # Número de iteraciones
FEATURE_LR = 0.1 # Learning rate
FEATURE_OPTIMIZER = 'adam' # Tipo de optimizador
# Regularización
L2_DECAY = 1e-4 # Peso de regularización L2 (controla intensidad)
TV_WEIGHT = 1e-2 # Peso de Total Variation (controla suavidad)
# Transformaciones aleatorias (data augmentation)
JITTER = 4 # Píxeles de traslación aleatoria
ROTATION_RANGE = 5.0 # Rango de rotación en grados
SCALE_RANGE = (0.95, 1.05) # Rango de escala (min, max)
# Blur periódico
BLUR_FREQUENCY = 4 # Cada cuántas iteraciones aplicar blur
BLUR_KERNEL_SIZE = 3 # Tamaño del kernel de blur
# Progress reporting
VERBOSE_FREQUENCY = 100 # Cada cuántas iteraciones mostrar progreso
# ===================================================================
# 5. CONFIGURACIÓN DE UI (Streamlit)
# ===================================================================
# Ranking de neuronas
MAX_NEURONS_DISPLAY = 10 # Top-K neuronas a mostrar en el ranking
DEFAULT_NEURON_INDEX = 0 # Neurona seleccionada por defecto
# Layout
PAGE_TITLE = "🎨 Neural Feature Visualization Dashboard"
PAGE_ICON = "🧠"
LAYOUT = "wide" # 'centered' o 'wide'
# Sidebar
SIDEBAR_STATE = "expanded" # 'expanded' o 'collapsed'
# Tabs
TAB_NAMES = [
"📤 Carga de Imagen",
"🔥 Mapa de Calor",
"🔬 Comparación Real vs Ideal"
]
# Colores para alertas
COLOR_SUCCESS = "#28a745"
COLOR_INFO = "#17a2b8"
COLOR_WARNING = "#ffc107"
COLOR_ERROR = "#dc3545"
# ===================================================================
# 6. PATHS Y DIRECTORIOS
# ===================================================================
# Directorio base del proyecto
BASE_DIR = Path(__file__).parent
# Directorio para assets
ASSETS_DIR = BASE_DIR / "assets"
SAMPLE_IMAGES_DIR = ASSETS_DIR / "sample_images"
# Crear directorios si no existen
ASSETS_DIR.mkdir(exist_ok=True)
SAMPLE_IMAGES_DIR.mkdir(exist_ok=True)
# ===================================================================
# 7. MENSAJES Y TEXTOS
# ===================================================================
WELCOME_MESSAGE = """
Bienvenido al **Neural Feature Visualization Dashboard** 🧠
Esta herramienta te permite:
- 📸 Cargar imágenes y analizar cómo las ve una red neuronal
- 🔥 Visualizar mapas de activación de neuronas específicas
- 🎨 Generar patrones sintéticos que maximizan activaciones
- 🔬 Comparar regiones reales vs patrones ideales
- En capas profundas se vuelve un poco complejo interpretar el filtro sobre la imgen, ¡pero es fascinante!
**¡Comienza subiendo una imagen o usando una de muestra!**
"""
HELP_MODEL_SELECTION = """
**Selección de Modelo:**
- **AlexNet**: Clásica, rápida, buena para comenzar
- **ResNet-18**: Más moderna, usa skip connections
- **VGG-16**: Más profunda, mejor accuracy pero más lenta
"""
HELP_LAYER_SELECTION = """
**Selección de Capa:**
- **Capas tempranas** (conv1, conv2): Detectan bordes, colores, texturas simples
- **Capas medias** (conv3, conv4): Detectan partes de objetos
- **Capas profundas** (conv5): Detectan objetos completos y conceptos abstractos
"""
HELP_NEURON_ACTIVATION = """
**Activación de Neurona:**
La activación indica qué tan "emocionada" está la neurona con la entrada.
- **Alta activación**: La neurona detectó su patrón preferido
- **Baja activación**: El patrón no está presente
"""
HELP_SYNTHETIC_GENERATION = """
**Generación Sintética:**
Usa **Gradient Ascent** para crear una imagen que maximiza la activación de la neurona.
Esto nos muestra qué patrón "busca" la neurona idealmente.
⚠️ La generación puede tardar 10-30 segundos dependiendo de tu hardware.
"""
# ===================================================================
# 8. CONFIGURACIÓN AVANZADA (OPCIONAL)
# ===================================================================
# Cache
ENABLE_MODEL_CACHE = True # Mantener modelos en memoria
ENABLE_ACTIVATION_CACHE = True # Cachear activaciones
# Logging
LOG_LEVEL = "INFO" # DEBUG, INFO, WARNING, ERROR
ENABLE_PROFILING = False # Perfilar performance
# Experimental
ENABLE_GPU_IF_AVAILABLE = True # Detectar y usar GPU automáticamente
ENABLE_MIXED_PRECISION = False # FP16 para mayor velocidad (requiere GPU)
# ===================================================================
# 9. FUNCIONES DE UTILIDAD
# ===================================================================
def get_model_info(model_name: str) -> Dict:
"""
Retorna información sobre un modelo específico.
Args:
model_name: Nombre del modelo (ej: 'alexnet')
Returns:
Diccionario con información del modelo
"""
return AVAILABLE_MODELS.get(model_name, {})
def get_default_layers(model_name: str) -> List[str]:
"""
Retorna las capas por defecto para un modelo.
Args:
model_name: Nombre del modelo
Returns:
Lista de nombres de capas
"""
model_info = get_model_info(model_name)
return model_info.get('layers', [])
def validate_config():
"""
Valida que la configuración sea coherente.
Lanza excepciones si hay problemas.
"""
assert HEATMAP_ALPHA >= 0.0 and HEATMAP_ALPHA <= 1.0, \
"HEATMAP_ALPHA debe estar entre 0.0 y 1.0"
assert FEATURE_ITERATIONS > 0, \
"FEATURE_ITERATIONS debe ser positivo"
assert L2_DECAY >= 0 and TV_WEIGHT >= 0, \
"Pesos de regularización deben ser no-negativos"
assert DEFAULT_MODEL in AVAILABLE_MODELS, \
f"DEFAULT_MODEL '{DEFAULT_MODEL}' no está en AVAILABLE_MODELS"
print("✅ Configuración validada correctamente")
# Validar configuración al importar el módulo
if __name__ != "__main__":
validate_config()