Grasshopper(GH)で日射・影のシミュレーションを自動実行し、その結果をもとに機械学習で日射画像を予測するためのプロジェクトです。
シミュレーション結果は 70 x 70 = 4900 個のピクセル値として保存します。その画像データを Autoencoder で64次元の潜在表現に圧縮し、窓寸法・方角・季節などの入力条件から潜在表現を予測します。最後に Decoder で潜在表現を画像に戻すことで、GHで毎回シミュレーションを回さなくても、入力条件から日射・影の結果を高速に推定できるようにします。
GitHub の容量を軽くするため、以下のファイルやフォルダは .gitignore で除外しています。
lb_dataset/pixel_csv/lb_dataset_normal/pixel_csv_open/lb_dataset/latent.csvlb_dataset_normal/latent_normal.csvlb_dataset/ae_full_out/lb_dataset_normal/ae_full_out_normal/lb_dataset/latent_reg_out/lb_dataset_normal/latent_reg_out_normal_mlp/evaluation/evaluation_out*/lb_dataset/compare_out/lb_dataset/preview_png/
これらは、GHでシミュレーションを実行したり、Pythonスクリプトで学習・評価を実行したりすると再生成されます。
EnvSimML/
├── 20251128_修論用モデル_格子有.gh
├── 20251128_修論用モデル_格子無.gh
├── README.md
├── requirements.txt
├── evaluation/
│ ├── app.py
│ ├── compare_gt_pred_images.py
│ ├── evaluation.py
│ ├── evaluation_ssim.py
│ ├── evaluation_normal.py
│ └── evaluation_normal_ssim.py
├── lb_dataset/
│ ├── meta.csv
│ ├── train_ae_weighted_full.py
│ ├── make_latent_csv.py
│ ├── train_latent_regressor.py
│ └── predict_image_from_inputs.py
└── lb_dataset_normal/
├── meta_open.csv
├── train_ae_weighted_normal.py
├── make_latent_normal.py
├── train_latent_regressor_normal_mlp.py
└── app_normal.py
このプロジェクトでは、格子あり条件と格子なし条件を分けて扱います。
-
lb_dataset- 格子あり条件のデータセットです。
- GHで生成した
meta.csvとpixel_csv/を使います。 - Pythonで学習すると
latent.csv、ae_full_out/、latent_reg_out/などが作られます。
-
lb_dataset_normal- 格子なし条件のデータセットです。
- GHで生成した
meta_open.csvとpixel_csv_open/を使います。 - Pythonで学習すると
latent_normal.csv、ae_full_out_normal/、latent_reg_out_normal_mlp/などが作られます。
現在のGitHubリポジトリには、容量の大きいピクセルCSVや学習済みモデルは含めていません。
まず Grasshopper の .gh ファイルを使って、入力条件を変化させながら日射シミュレーションを自動実行します。
-
20251128_修論用モデル_格子有.gh- 格子あり条件のシミュレーションに使います。
- 出力先は
lb_dataset/を想定しています。
-
20251128_修論用モデル_格子無.gh- 格子なし条件のシミュレーションに使います。
- 出力先は
lb_dataset_normal/を想定しています。
GHでは、窓の幅、窓の高さ、方角、季節、腰壁高さ、分割数、格子厚などの入力条件を変化させ、その条件ごとのシミュレーション結果を保存します。
格子あり条件では、主に以下が作成されます。
lb_dataset/
├── meta.csv
└── pixel_csv/
├── case_000000.csv
├── case_000001.csv
└── ...
格子なし条件では、主に以下が作成されます。
lb_dataset_normal/
├── meta_open.csv
└── pixel_csv_open/
├── case_000000.csv
├── case_000001.csv
└── ...
meta.csv や meta_open.csv には、各ケースの入力条件と case_id が保存されます。pixel_csv/ や pixel_csv_open/ には、各 case_id に対応する 4900 ピクセルの日射結果がCSVとして保存されます。
Python 3.10 以上を推奨します。macOS などで python コマンドが見つからない場合は、python3 に置き換えてください。
python -m venv .venv
source .venv/bin/activate
pip install -r requirements.txtWindows の場合:
.venv\Scripts\activate
pip install -r requirements.txt格子あり条件では lb_dataset/ を使います。
python lb_dataset/train_ae_weighted_full.pyこのスクリプトは lb_dataset/meta.csv と lb_dataset/pixel_csv/ を読み込み、画像を潜在表現に圧縮・復元する Autoencoder を学習します。
実行後に作成される主なファイル:
lb_dataset/ae_full_out/
├── ae_weights.pt
├── case_000000_GT_REC.png
├── case_000001_GT_REC.png
└── ...
ae_weights.pt は Autoencoder の学習済み重みです。以降の潜在変数作成や画像復元で使います。
python lb_dataset/make_latent_csv.pyこのスクリプトは、学習済み Autoencoder の Encoder を使って、各ケースの画像を64次元の潜在変数に変換します。
実行後に作成されるファイル:
lb_dataset/latent.csv
latent.csv には、case_id と z00 から z63 までの潜在変数が保存されます。
python lb_dataset/train_latent_regressor.pyこのスクリプトは meta.csv と latent.csv を結合し、入力条件から64次元の潜在変数を予測する MLP 回帰モデルを学習します。
実行後に作成される主なファイル:
lb_dataset/latent_reg_out/
├── latent_regressor.pkl
├── metrics.txt
└── pred_latent_sample.csv
latent_regressor.pkl は、入力条件を受け取って潜在変数を予測する学習済みモデルです。Streamlitアプリや評価スクリプトで使います。
格子なし条件では lb_dataset_normal/ を使います。事前にGHで meta_open.csv と pixel_csv_open/ を作成しておく必要があります。
python lb_dataset_normal/train_ae_weighted_normal.py実行後に作成される主なファイル:
lb_dataset_normal/ae_full_out_normal/
├── ae_weights.pt
├── ae_config.json
├── case_000000_GT_REC.png
└── ...
python lb_dataset_normal/make_latent_normal.py実行後に作成されるファイル:
lb_dataset_normal/latent_normal.csv
python lb_dataset_normal/train_latent_regressor_normal_mlp.py実行後に作成される主なファイル:
lb_dataset_normal/latent_reg_out_normal_mlp/
├── latent_regressor.pkl
├── metrics.txt
└── pred_latent_sample.csv
評価用スクリプトは evaluation/ にまとめています。
格子ありデータの評価:
python evaluation/evaluation.py
python evaluation/evaluation_ssim.py作成される主なファイル:
evaluation/evaluation_out/metrics.txt
evaluation/evaluation_out_ssim/metrics.txt
evaluation/evaluation_out_ssim/ssim_per_case.csv
格子なしデータの評価:
python evaluation/evaluation_normal.py
python evaluation/evaluation_normal_ssim.py作成される主なファイル:
evaluation/evaluation_out_normal/metrics.txt
evaluation/evaluation_out_normal_ssim/metrics.txt
evaluation/evaluation_out_normal_ssim/ssim_per_case.csv
格子あり・格子なしの予測画像を比較する場合:
python evaluation/compare_gt_pred_images.py作成される主なファイル:
lb_dataset/compare_out/
├── grid_00_case_XXXXXX_GT_PRED.png
├── normal_00_case_XXXXXX_GT_PRED.png
└── ...
学習後は、Streamlitアプリで入力条件から日射画像を予測できます。
格子ありモデル:
streamlit run evaluation/app.py格子なしモデル:
streamlit run lb_dataset_normal/app_normal.pyアプリを動かすには、以下の学習済みファイルが必要です。
lb_dataset/ae_full_out/ae_weights.pt
lb_dataset/latent_reg_out/latent_regressor.pkl
または格子なしの場合:
lb_dataset_normal/ae_full_out_normal/ae_weights.pt
lb_dataset_normal/latent_reg_out_normal_mlp/latent_regressor.pkl
GHシミュレーション
↓
meta.csv / pixel_csv/
↓
train_ae_weighted_full.py
↓
ae_weights.pt
↓
make_latent_csv.py
↓
latent.csv
↓
train_latent_regressor.py
↓
latent_regressor.pkl
↓
evaluation.py / app.py
↓
評価結果または予測画像
格子なしの場合は、meta.csv を meta_open.csv、pixel_csv/ を pixel_csv_open/、latent.csv を latent_normal.csv に読み替えてください。
| 操作 | 入力 | 出力 |
|---|---|---|
| GHで格子ありシミュレーション | .gh ファイル |
lb_dataset/meta.csv, lb_dataset/pixel_csv/ |
| GHで格子なしシミュレーション | .gh ファイル |
lb_dataset_normal/meta_open.csv, lb_dataset_normal/pixel_csv_open/ |
| Autoencoder学習 | meta.csv, pixel_csv/ |
ae_weights.pt, 再構成PNG |
| 潜在変数作成 | ae_weights.pt, pixel_csv/ |
latent.csv または latent_normal.csv |
| 回帰モデル学習 | meta.csv, latent.csv |
latent_regressor.pkl, metrics.txt |
| 評価 | latent_regressor.pkl, ae_weights.pt, 正解CSV |
evaluation_out*/metrics.txt, ssim_per_case.csv |
| アプリ推論 | latent_regressor.pkl, ae_weights.pt |
入力条件に対する予測画像 |
pixel_csv/、pixel_csv_open/、ae_weights.pt、latent_regressor.pkl、評価画像などは容量が大きくなりやすいため、GitHubには含めていません。別の環境で実行する場合は、GHでデータを再生成するか、必要な生成物を別途共有してください。