{ "cells": [ { "cell_type": "markdown", "id": "a0f1b2c3", "metadata": {}, "source": [ "# Phase 1 — Pipeline Selection Analysis\n", "\n", "DCGAN at 64×64 used as a cheap proxy to compare data pipeline variants. Each experiment varies one factor:\n", "\n", "- **1A** — Resolution: 64×64 vs 128×128\n", "- **1B** — Face crop + alignment: Full image vs MTCNN-aligned\n", "- **1C** — Augmentation: H-flip only vs H-flip + rotation + color jitter\n", "- **1D** — Combined dataset: Aligned only vs aligned + raw mixed\n", "\n", "All runs used 50 epochs, batch size 64, lr=2e-4, latent_dim=100, ngf=ndf=64." ] }, { "cell_type": "code", "execution_count": 1, "id": "b1c2d3e4", "metadata": {}, "outputs": [], "source": [ "import json\n", "from pathlib import Path\n", "\n", "import matplotlib.pyplot as plt\n", "import matplotlib.image as mpimg\n", "import numpy as np\n", "import pandas as pd\n", "\n", "plt.rcParams.update({\"figure.dpi\": 120, \"font.size\": 10})\n", "\n", "OUTPUTS = Path(\"../outputs\")\n", "LOGS = OUTPUTS / \"logs\"\n", "SAMPLES = OUTPUTS / \"samples\"" ] }, { "cell_type": "markdown", "id": "c2d3e4f5", "metadata": {}, "source": [ "## 1. Load all experiment logs" ] }, { "cell_type": "code", "execution_count": 2, "id": "d3e4f5a6", "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Loaded 7 experiments:\n", " p1a_dcgan_128\n", " p1a_dcgan_64\n", " p1b_dcgan_aligned\n", " p1b_dcgan_full\n", " p1c_dcgan_full_aug\n", " p1c_dcgan_hflip\n", " p1d_dcgan_combined\n" ] } ], "source": [ "run_names = sorted(p.stem for p in LOGS.glob(\"p1*.json\"))\n", "runs = {}\n", "for name in run_names:\n", " with open(LOGS / f\"{name}.json\") as f:\n", " runs[name] = json.load(f)\n", "\n", "print(f\"Loaded {len(runs)} experiments:\")\n", "for name in run_names:\n", " print(f\" {name}\")" ] }, { "cell_type": "code", "execution_count": 3, "id": "e4f5a6b7", "metadata": {}, "outputs": [], "source": [ "# Parse metadata about each experiment\n", "experiment_groups = {\n", " \"1A — Resolution\": {\n", " \"p1a_dcgan_64\": \"64×64 (raw)\",\n", " \"p1a_dcgan_128\": \"128×128 (raw)\",\n", " },\n", " \"1B — Alignment\": {\n", " \"p1b_dcgan_full\": \"Full image (raw)\",\n", " \"p1b_dcgan_aligned\": \"MTCNN-aligned\",\n", " },\n", " \"1C — Augmentation\": {\n", " \"p1c_dcgan_hflip\": \"H-flip only\",\n", " \"p1c_dcgan_full_aug\": \"H-flip + rot + color\",\n", " },\n", " \"1D — Dataset mixing\": {\n", " \"p1b_dcgan_aligned\": \"Aligned only\",\n", " \"p1d_dcgan_combined\": \"Aligned + raw mixed\",\n", " },\n", "}" ] }, { "cell_type": "markdown", "id": "f5a6b7c8", "metadata": {}, "source": [ "## 2. FID Comparison Table" ] }, { "cell_type": "code", "execution_count": 4, "id": "a6b7c8d9", "metadata": {}, "outputs": [ { "data": { "text/html": [ "\n", "
| \n", " | Experiment | \n", "Data | \n", "Size | \n", "Augment | \n", "FID@25 | \n", "FID@50 | \n", "G loss (ep50) | \n", "D loss (ep50) | \n", "
|---|---|---|---|---|---|---|---|---|
| 4 | \n", "p1c_dcgan_full_aug | \n", "cropped/generator | \n", "64×64 | \n", "True | \n", "48.0 | \n", "33.4 | \n", "3.480 | \n", "0.412 | \n", "
| 5 | \n", "p1c_dcgan_hflip | \n", "cropped/generator | \n", "64×64 | \n", "False | \n", "48.9 | \n", "37.9 | \n", "3.739 | \n", "0.392 | \n", "
| 2 | \n", "p1b_dcgan_aligned | \n", "cropped/generator | \n", "64×64 | \n", "False | \n", "47.5 | \n", "42.0 | \n", "3.965 | \n", "0.312 | \n", "
| 1 | \n", "p1a_dcgan_64 | \n", "data | \n", "64×64 | \n", "False | \n", "120.9 | \n", "86.7 | \n", "4.019 | \n", "0.283 | \n", "
| 6 | \n", "p1d_dcgan_combined | \n", "['data', 'cropped/generator'] | \n", "64×64 | \n", "False | \n", "95.5 | \n", "87.4 | \n", "5.265 | \n", "0.198 | \n", "
| 3 | \n", "p1b_dcgan_full | \n", "data | \n", "64×64 | \n", "False | \n", "109.6 | \n", "89.0 | \n", "3.960 | \n", "0.370 | \n", "
| 0 | \n", "p1a_dcgan_128 | \n", "data | \n", "128×128 | \n", "False | \n", "143.1 | \n", "115.0 | \n", "5.013 | \n", "0.185 | \n", "