English · 中文(繁體) · 中文 (简体) · 日本語 · 한국어 · Tiếng Việt · العربية · Français · Español · Deutsch · Русский
Un repositorio de investigación centrado en scripts (históricamente llamado inverse_metasurface) para el diseño inverso de metasuperficies en imagen espectral. El flujo de trabajo principal acopla:
- simulación RCWA basada en física (S4 + Lua)
- ensamblado de datos y vinculación de geometrías
- aprendizaje en tres etapas con PyTorch (
shape -> spectrum,spectrum -> shape, ajuste fino encadenado) - evaluación cuantitativa y cualitativa, con comprobaciones opcionales de consistencia red neuronal vs S4
| Elemento | Detalles |
|---|---|
| 🎯 Tarea principal | Inferir la geometría de metasuperficie con simetría C4 a partir de espectros objetivo de transmitancia |
| 🔬 Simulador | ../build/S4 invocado por lanzadores shell y scripts .lua |
| 🧠 Pipeline de aprendizaje | Etapa A shape -> spectra, Etapa B spectra -> shape, Etapa C spectra -> shape -> spectra |
| 📦 Contrato de datos | CSV fusionado (T@..., metadatos, vertices_str) -> NPZ comprimido (uids, spectra, shapes) |
| 🧪 Evaluación | Métricas MSE, visualizaciones por etapa, re-simulación opcional con S4 |
- Generar salidas de simulación en
results/y archivos de polígonos enshapes/. - Fusionar archivos CSV de S4 y adjuntar vértices de geometría.
- Normalizar nombres de columnas fusionadas para compatibilidad con entrenamiento.
- Preprocesar los CSV fusionados a tensores NPZ.
- Entrenar los modelos de las etapas A/B/C.
- Evaluar checkpoints y visualizar comportamiento.
- Opcionalmente comparar espectros de geometrías predichas contra nuevas ejecuciones S4.
.
├── README.md
├── how_to_run.md
├── commands.md
├── iccp.yaml
├── pip_requirements.txt
│
├── ms.sh
├── ms_final.sh
├── ms_resume.sh
├── ms_resume_allargs.sh
├── ms_resume_random_state.sh
│
├── metasurface_seed.lua
├── metasurface_final.lua
├── metasurface_seed_resume.lua
├── metasurface_allargs_resume.lua
├── metasurface_resume_random_state.lua
├── metasurface_fixed_shape_and_c_value.lua
│
├── merge_s4_data_full.py
├── three_stage_transmittance.py
├── three_stage_transmittance_evaluation.py
├── FilterShapeS4_Evaluator_Transmittance.py
│
├── partial_crys_data/
├── results/
├── shapes/
├── merged_csvs/
├── outputs_three_stage_*/
│
├── AVIRIS*/
├── noise_experiment*/
└── archived/
| Dependencia | Notas |
|---|---|
| Linux + Bash | Los scripts de lanzamiento apuntan a ejecución en shell |
| Python 3.9 | Coincide con iccp.yaml |
| Conda | Recomendado para reproducibilidad |
| Binario S4 | Esperado en ../build/S4 |
| GPU CUDA (opcional) | Acelera entrenamiento/evaluación |
git clone <your-repo-url> inverse_metasurface
cd inverse_metasurfaceconda env create -f iccp.yaml
conda activate iccpAlternativa (menos controlada):
pip install -r pip_requirements.txtls -l ../build/S4chmod +x ms.sh ms_final.sh ms_resume.sh ms_resume_allargs.sh ms_resume_random_state.shLanzador simple:
./ms.sh -ns 10000 -r 12345Lanzador parametrizado:
./ms_final.sh \
-ns 10000 \
-r 12345 \
-p myrun \
-g 80 \
-bo 0.35 \
-ro 0.30Lanzador orientado a reanudación:
./ms_resume_allargs.sh \
-ns 10000 \
-r 12345 \
-p myrun \
-g 80 \
-bo 0.35 \
-ro 0.30Notas:
- Los lanzadores ejecutan
NQ=1..4en paralelo. - Los scripts llaman a
../build/S4con-t 32.
python merge_s4_data_full.py --prefix myrun
# output: merged_s4_shapes_myrun.csvmerge_s4_data_full.py escribe folder_key y NQ, mientras que la ruta de entrenamiento espera prefix y nQ.
python -c "import pandas as pd; p='merged_s4_shapes_myrun.csv'; df=pd.read_csv(p); df=df.rename(columns={'folder_key':'prefix','NQ':'nQ'}); df.to_csv(p,index=False)"mkdir -p merged_csvs
mv merged_s4_shapes_myrun.csv merged_csvs/
python three_stage_transmittance.py \
--preprocess \
--input_folder merged_csvs \
--output_npz preprocessed_t_data.npzpython three_stage_transmittance.py \
--data_npz preprocessed_t_data.npz \
--num_epochs 100 \
--batch_size 1024Las salidas se escriben en:
outputs_three_stage_YYYYMMDD_HHMMSS/stageAoutputs_three_stage_YYYYMMDD_HHMMSS/stageBoutputs_three_stage_YYYYMMDD_HHMMSS/stageC
python three_stage_transmittance_evaluation.py \
--model_dir outputs_three_stage_YYYYMMDD_HHMMSS \
--data_npz preprocessed_t_data.npz \
--sample_count 8python FilterShapeS4_Evaluator_Transmittance.py \
--npz_file preprocessed_t_data.npz \
--spec2shape_ckpt outputs_three_stage_YYYYMMDD_HHMMSS/stageC/spec2shape_stageC.pt \
--shape2spec_ckpt outputs_three_stage_YYYYMMDD_HHMMSS/stageA/shape2spec_stageA.pt \
--n_samples 4| Flag | Significado | Valor por defecto |
|---|---|---|
-ns, --numshapes |
Número de geometrías a generar | 100000 |
-r, --seed |
Semilla aleatoria | 88888 |
-p, --prefix |
Prefijo/clave de reanudación | "" |
-g, --numg |
Parámetro de base/cuadrícula | 80 |
-bo, --baseouter |
Desplazamiento base del límite externo | 0.25 |
-ro, --randouter |
Desplazamiento aleatorio del límite externo | 0.20 |
| Flag | Significado | Valor por defecto |
|---|---|---|
--preprocess |
Ejecutar modo de preprocesamiento | False |
--input_folder |
Carpeta con archivos CSV fusionados | "" |
--output_npz |
Ruta del NPZ de salida | preprocessed_data.npz |
--data_npz |
Dataset NPZ para entrenamiento | "" |
--csv_file |
CSV de respaldo si no se usa NPZ | "" |
--test |
Modo prueba | False |
--num_epochs |
Número de épocas de entrenamiento | 10 |
--batch_size |
Tamaño de batch | 4096 |
| Flag | Significado | Valor por defecto |
|---|---|---|
--model_dir |
Directorio que contiene stageA/B/C |
requerido |
--data_npz |
NPZ de entrada | "" |
--csv_file |
CSV de entrada de respaldo | "" |
--output_dir |
Sobrescritura de directorio de salida | automático bajo model_dir |
--sample_count |
Número de muestras visualizadas | 4 |
--seed |
Semilla aleatoria | 23 |
--font_scale |
Escala de fuente en gráficas | 1.0 |
--batch_size |
Tamaño de batch de evaluación | 32 |
--plot_only |
Solo graficar curvas de entrenamiento | False |
| Flag | Significado | Valor por defecto |
|---|---|---|
--npz_file |
Archivo NPZ de entrada | preprocessed_t_data.npz |
--spec2shape_ckpt |
Ruta del checkpoint de Etapa C | outputs_three_stage_20250322_145925/stageC/spec2shape_stageC.pt |
--shape2spec_ckpt |
Ruta del checkpoint de Etapa A | outputs_three_stage_20250322_145925/stageA/shape2spec_stageA.pt |
--n_samples |
Número de muestras evaluadas | 4 |
--seed |
Semilla aleatoria | 23 |
--max_workers |
Hilos de trabajo S4 | 4 |
--out_folder |
Directorio de salida | marca de tiempo automática |
./ms_final.sh -ns 1000 -r 42 -p smoke -g 40 -bo 0.25 -ro 0.20
python merge_s4_data_full.py --prefix smoke
python -c "import pandas as pd; p='merged_s4_shapes_smoke.csv'; d=pd.read_csv(p).rename(columns={'folder_key':'prefix','NQ':'nQ'}); d.to_csv(p,index=False)"
mkdir -p merged_csvs && mv merged_s4_shapes_smoke.csv merged_csvs/
python three_stage_transmittance.py --preprocess --input_folder merged_csvs --output_npz smoke.npz
python three_stage_transmittance.py --data_npz smoke.npz --num_epochs 5 --batch_size 128La configuración actual de diseño inverso aprende a recuperar geometría con simetría C4 a partir de la transmitancia en distintos estados de cristalización. Actualmente, el pipeline de transmitancia asume:
- 11 filas de cristalización por muestra de geometría (agrupadas por
shape_uidúnico) - 100 bins de longitud de onda por estado de cristalización (columnas
T@...) - hasta 4 puntos de control Q1 codificados como tensor
4x3:(presence, x, y) - reconstrucción de polígonos bajo simetría C4 para visualización y comprobaciones de consistencia
El repositorio también contiene ramas exploratorias (AVIRIS*, noise_experiment*, archived/) además de la ruta principal de entrenamiento de transmitancia.
| Síntoma | Causa probable | Solución |
|---|---|---|
../build/S4: No such file or directory |
Falta el binario S4 en la ruta relativa esperada | Compilar o enlazar S4 en ../build/S4, o actualizar rutas de los lanzadores |
No transmission columns found |
El CSV no contiene columnas T@... |
Revisar de nuevo el formato de salida de la fusión |
Must specify either --data_npz or --csv_file |
Falta el argumento de datos para entrenamiento/evaluación | Proporcionar explícitamente una entrada |
No valid shapes => SHIFT->Q1->UpTo4 |
vertices_str inválido/vacío o el filtrado Q1 elimina todas las muestras |
Validar archivos de geometría y salida de fusión |
Salida de fusión vacía para --prefix |
El prefijo no coincide con archivos en results/ |
Verificar prefijo exacto de nombre de archivo y repetir la fusión |
| Falta checkpoint de evaluación | Faltan archivos de checkpoint stageA/B/C |
Verificar que --model_dir apunte a una carpeta de salida completa |
Las contribuciones son bienvenidas, especialmente en reproducibilidad, pruebas y calidad de documentación.
Proceso sugerido:
- Abrir un issue con el alcance y comportamiento esperado.
- Crear una rama enfocada.
- Enviar un pull request con comandos y salidas reproducibles.
- Mantener los cambios acotados a un flujo de trabajo cuando sea posible.
Actualmente no existe un archivo LICENSE en la raíz del repositorio en esta instantánea. Añade uno para definir términos de uso y redistribución.
Si usas este repositorio o construyes sobre este trabajo, por favor cita:
@article{chen2025inverse,
title={Inverse Design of Metasurface for Spectral Imaging},
author={Chen, Rongzhou and Nie, Haitao and Zhu, Shuo and Zhao, Yaping and Wang, Chutian and Lam, Edmund Y},
journal={arXiv preprint arXiv:2510.21924},
year={2025}
}