{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# 04 — Sestavení velké mapy\n", "\n", "Složíme otagované dlaždice (z notebooku 03) do velkých leteckých snímků HK pro **dvě vrstvy**:\n", "\n", "| Vrstva | Zdroj dlaždic | Výstup (preview) | Výstup (plný) |\n", "|--------|--------------|-----------------|--------------|\n", "| Finetuned model | `tiles_annotated_finetuned/` | `hk_finetuned_preview.jpg` | `hk_finetuned_full.jpg` |\n", "| Base model | `tiles_annotated_base/` | `hk_base_preview.jpg` | `hk_base_full.jpg` |\n", "\n", "Výsledná mapa: **74 × 69 dlaždic × 256 px = 18 944 × 17 664 px**" ] }, { "cell_type": "code", "execution_count": 1, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Mřížka: 74 × 69 dlaždic\n", "Výsledná mapa: 18944 × 17664 px\n", "Odhadovaná velikost jedné mapy (JPEG 88%): ~100 MB\n" ] } ], "source": [ "from pathlib import Path\n", "from PIL import Image\n", "import numpy as np\n", "import re\n", "from tqdm.notebook import tqdm\n", "import json\n", "\n", "ANNOTATED_DIR_FINETUNED = Path(\"output/tiles_annotated_finetuned\")\n", "ANNOTATED_DIR_BASE = Path(\"output/tiles_annotated_base\")\n", "\n", "for d in [ANNOTATED_DIR_FINETUNED, ANNOTATED_DIR_BASE]:\n", " assert d.exists(), f\"Nejprve spusť 03_inference_tiles.ipynb! (chybí {d})\"\n", "\n", "TILE_SIZE = 256\n", "PREVIEW_SCALE = 4\n", "\n", "# Rozsah mřížky odvoď z finetuned (obě mají stejné dlaždice)\n", "tile_files = sorted(ANNOTATED_DIR_FINETUNED.glob(\"18_*.jpg\"))\n", "xs, ys = [], []\n", "for f in tile_files:\n", " m = re.match(r\"18_(\\d+)_(\\d+)\\.jpg\", f.name)\n", " if m:\n", " xs.append(int(m.group(1)))\n", " ys.append(int(m.group(2)))\n", "\n", "x_min, x_max = min(xs), max(xs)\n", "y_min, y_max = min(ys), max(ys)\n", "cols = x_max - x_min + 1\n", "rows = y_max - y_min + 1\n", "W, H = cols * TILE_SIZE, rows * TILE_SIZE\n", "\n", "print(f\"Mřížka: {cols} × {rows} dlaždic\")\n", "print(f\"Výsledná mapa: {W} × {H} px\")\n", "print(f\"Odhadovaná velikost jedné mapy (JPEG 88%): ~{W*H*3/1e6/10:.0f} MB\")" ] }, { "cell_type": "code", "execution_count": 2, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "Dostupná RAM: 6.8 GB\n", "Potřeba pro jednu plnou mapu: 1.0 GB (dvě: 2.0 GB)\n", "RAM dostačuje — generuji plné mapy pro obě vrstvy\n" ] } ], "source": [ "import psutil\n", "\n", "ram_gb = psutil.virtual_memory().available / 1e9\n", "needed_gb = W * H * 3 / 1e9 # jedna mapa; dvě = 2×\n", "\n", "print(f\"Dostupná RAM: {ram_gb:.1f} GB\")\n", "print(f\"Potřeba pro jednu plnou mapu: {needed_gb:.1f} GB (dvě: {2*needed_gb:.1f} GB)\")\n", "\n", "BUILD_FULL = needed_gb <= ram_gb * 0.5 # nech puffer pro druhou mapu\n", "if BUILD_FULL:\n", " print(\"RAM dostačuje — generuji plné mapy pro obě vrstvy\")\n", "else:\n", " print(\"Nedostatek RAM — generuji pouze preview mapy\")" ] }, { "cell_type": "code", "execution_count": 3, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "a375151f0f8f4fd5ac94ecb5567c9849", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Preview finetuned: 0%| | 0/5106 [00:00 Image.Image:\n", " \"\"\"Složí všechny dlaždice z adresáře do jednoho canvasu.\n", "\n", " scale=1 → plné rozlišení, scale=4 → 1/4 (preview)\n", " Vrací canvas (Image) a uloží ho na output_path.\n", " \"\"\"\n", " ts = TILE_SIZE // scale\n", " pw, ph = W // scale, H // scale\n", " canvas = Image.new(\"RGB\", (pw, ph), (30, 30, 30))\n", " missing = 0\n", "\n", " for f in tqdm(sorted(annotated_dir.glob(\"18_*.jpg\")), desc=desc or str(annotated_dir)):\n", " m = re.match(r\"18_(\\d+)_(\\d+)\\.jpg\", f.name)\n", " if not m:\n", " continue\n", " xi = int(m.group(1)) - x_min\n", " yi = int(m.group(2)) - y_min\n", " try:\n", " tile = Image.open(f)\n", " if scale > 1:\n", " tile = tile.resize((ts, ts), Image.LANCZOS)\n", " canvas.paste(tile, (xi * ts, yi * ts))\n", " except Exception:\n", " missing += 1\n", "\n", " canvas.save(output_path, quality=88, optimize=True)\n", " print(f\"Uloženo: {output_path} ({pw}×{ph} px)\", end=\"\")\n", " if missing:\n", " print(f\" [{missing} chybějících dlaždic]\", end=\"\")\n", " print()\n", " return canvas\n", "\n", "\n", "# --- Preview mapy (vždy) ---\n", "preview_ft = assemble_map(ANNOTATED_DIR_FINETUNED, Path(\"output/hk_finetuned_preview.jpg\"),\n", " scale=PREVIEW_SCALE, desc=\"Preview finetuned\")\n", "preview_base = assemble_map(ANNOTATED_DIR_BASE, Path(\"output/hk_base_preview.jpg\"),\n", " scale=PREVIEW_SCALE, desc=\"Preview base\")" ] }, { "cell_type": "code", "execution_count": 4, "metadata": {}, "outputs": [ { "data": { "application/vnd.jupyter.widget-view+json": { "model_id": "348dac183a834470b930654ef862a4f2", "version_major": 2, "version_minor": 0 }, "text/plain": [ "Plná mapa finetuned: 0%| | 0/5106 [00:00" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "import matplotlib.pyplot as plt\n", "import matplotlib.patches as mpatches\n", "\n", "legend_elements = [\n", " mpatches.Patch(facecolor='#00DC00', edgecolor='white', label='car'),\n", " mpatches.Patch(facecolor='#FFDC00', edgecolor='white', label='van'),\n", " mpatches.Patch(facecolor='#DC0000', edgecolor='white', label='truck'),\n", " mpatches.Patch(facecolor='#0078FF', edgecolor='white', label='bus'),\n", "]\n", "\n", "fig, axes = plt.subplots(1, 2, figsize=(28, 13))\n", "pw = W // PREVIEW_SCALE\n", "ph = H // PREVIEW_SCALE\n", "\n", "for ax, img_path, title in zip(\n", " axes,\n", " [\"output/hk_finetuned_preview.jpg\", \"output/hk_base_preview.jpg\"],\n", " [\"Finetuned model\", \"Base model (před fine-tuningem)\"],\n", "):\n", " ax.imshow(Image.open(img_path))\n", " ax.set_title(f\"Hradec Králové — {title}\\n(preview {pw}×{ph} px)\", fontsize=13)\n", " ax.axis(\"off\")\n", " ax.legend(handles=legend_elements, loc=\"lower right\", fontsize=10,\n", " framealpha=0.8, title=\"Typy vozidel\")\n", "\n", "plt.tight_layout()\n", "plt.savefig(\"output/hk_map_comparison.png\", dpi=100, bbox_inches=\"tight\")\n", "plt.show()" ] }, { "cell_type": "code", "execution_count": 6, "metadata": {}, "outputs": [ { "name": "stdout", "output_type": "stream", "text": [ "====================================================\n", " SOUHRN — Hradec Králové \n", "====================================================\n", " Finetuned Base\n", "----------------------------------------------------\n", "Zpracované dlaždice: 5106 5106\n", "Dlaždice s vozidly: 2011 1711\n", "\n", "Detekovaná vozidla:\n", " car 13886 13433\n", " van 1 1214\n", " truck 98 283\n", " bus 8 404\n", "----------------------------------------------------\n", " CELKEM 13993 15334\n", "====================================================\n" ] } ], "source": [ "from collections import Counter\n", "\n", "CLASS_NAMES = [\"car\", \"van\", \"truck\", \"bus\"]\n", "\n", "\n", "def load_counts(json_path: str):\n", " with open(json_path) as f:\n", " data = json.load(f)\n", " counts = Counter()\n", " tiles_with = 0\n", " for dets in data.values():\n", " if dets:\n", " tiles_with += 1\n", " for d in dets:\n", " counts[CLASS_NAMES[d[\"cls\"]]] += 1\n", " return counts, tiles_with, len(data)\n", "\n", "\n", "counts_ft, tiles_ft, total = load_counts(\"output/detections_finetuned.json\")\n", "counts_base, tiles_base, _ = load_counts(\"output/detections_base.json\")\n", "\n", "print(\"=\" * 52)\n", "print(f\"{'SOUHRN — Hradec Králové':^52}\")\n", "print(\"=\" * 52)\n", "print(f\"{'':30s} {'Finetuned':>10} {'Base':>10}\")\n", "print(\"-\" * 52)\n", "print(f\"{'Zpracované dlaždice:':30s} {total:>10} {total:>10}\")\n", "print(f\"{'Dlaždice s vozidly:':30s} {tiles_ft:>10} {tiles_base:>10}\")\n", "print()\n", "print(\"Detekovaná vozidla:\")\n", "for cls in CLASS_NAMES:\n", " print(f\" {cls:28s} {counts_ft[cls]:>10} {counts_base[cls]:>10}\")\n", "print(\"-\" * 52)\n", "print(f\" {'CELKEM':28s} {sum(counts_ft.values()):>10} {sum(counts_base.values()):>10}\")\n", "print(\"=\" * 52)" ] }, { "cell_type": "code", "execution_count": 7, "metadata": {}, "outputs": [ { "data": { "image/png": "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HXphQNuFLliwwLyvPT2R18+jFzj0uKjIsaKhyJmZM2eaz6UhujS6bTWMJSQkmFK9Pn36mONMe4C3tnNRuk30u9CApPurhqDNmzfLSy+9JEuXLjXbUkNodacBWUOrhlINYLpPWMfjli1bzEUMiz6n23n37t1mu+qxqt+P7o+6zbTqv+4H+puk36l2BGj9Zlkq2xmd/sboMazHvR6j+v66X2mQ1otj1m9qRX5vKvL7WJReuNH31FJl3U56Uczel19+aS7q3HPPPWbf02NF1133N30f/X9Ap2vY1n1UP6Mus6L0Yq51EaPob/KTTz5pLrjo968XXXTb6rGsv0lbt26VZ555xjbvhg0bzG+HVk/X40XXSefXY0ZDutYIc3U/AeBhBQDgJRITEwv0Z2ngwIHFnpsyZYp57uyzzzaP3333XfO4T58+BUePHrXNt2PHjoJGjRoV+Pv7F/z999+26Z9//rmZPzY2tmD//v0Oy87JySnYu3ev7fF9991n5n3ggQcK8vPzbdPT0tIKunTpUhAYGFiwZ88e2/TRo0eb+XX9XaHrrq/74IMPHKZPmjTJTC+6zGXLltm2T0ZGhm26ruNNN91knps3b55t+ttvv22m6V9nRowYYZ5//fXXHaYnJSUVtGjRouCEE04oOHz4cLH1LbqdLrroIof5VqxYYaa3a9eu4ODBg7bpKSkpBaeeeqp57ocffrBNnzx5spn28ccfF1vHzp07m+194MABh+84NzfXYT7dBtddd51Zzk8//eTwXFRUlJk+dOhQh33l66+/drq/xcTEFISEhDhsY7V48WIz//jx423TdL8JDg42t3Xr1hVb/127dhX7PnTftF9H/Sx9+/Y1z61cubKgLNu2bTPznnfeecWee/HFF81zL730km2aq8eKM0888YRtG+bl5TlsW73Ze/DBB828Y8eOdZi+ZMkS235tv0/q8RgaGlpw4oknFvzzzz8Or/nwww/N/OPGjXOYbn0eb2J9v/369TPboOjtv//+c9g+3333XbHfPr3ptrZnHR+PP/64w/QzzjijoHbt2ma72tu6davZf/W3zp6z76o8vxW6nvqcrrc9a33/97//OewTb7zxhpl+4403uuX3pry/jyWx1ufJJ58s9tzw4cPNcxs3bjSP4+PjzeNhw4YVm/fIkSMF6enpZb6f9V2efPLJtu9e///S7aTT6tatW/DUU08Ve9327duLTdP/m84991zzPevxapk4caJ5jwULFhR7TdH/31zdTwB4BqEbgNdwdrJy5513Fpx11llmup6s/PLLL2bec845x0xbtWpVseU8+uij5rlp06bZpmlA0WnffvttqeugJ4/h4eFmHewDt2XRokVmORpuKhO69QRKXxMXF1fsOT2xa9CgQbFlDhkyxEyzP/myaLj18/MzJ5HlOZHet2+fORHT7ejMCy+8YF6rFyuKngRrSBwzZowtWBUNwFb4dRaiZ8+ebZ7TeexP/nTahRde6DDv5s2bSzwBdmbt2rVm/qlTpzoN3c5OavW5iIgIh2kzZsww8+vJuj1dD52+adMm2zQ9kddpelJdFuv7uPrqq0t8Trd7efTs2dOEZQ0s9rp161YQEBBgvl+Lq8dKUZ9++qnZtzp16lTsQoSzIBcdHW0ulFgh054G0qL75LPPPmumvffee07fX99XLw74Sugu6bZ+/foyQ7duO/sAa//cxRdfbJumF3iKHkf2rFCWkJDg0dCtF5uKBlENirpv6vdW0d+bivw+lkR/G/X/jqLhMjU1taBOnToFHTt2tE2zQveVV15ZUFH2F1Cc3S644ALbvlAeevzp6955551i3+/SpUtLfW1F9hMAnkH1cgBeR6vDafVZpe15tUqlVqPVzom07a7SKspazbVoFWBltZnTKngWrZaobdm0qmtptBqfVkHWdr/WOtjTHmjVH3/8UanPaLXRdNbLsbbl06qHRdtFauc72sbzrbfecrpMbSNZ3vXSathaXVqr0hdtq6m2bdtm/urytE2lPa2erVVCtQrjI488Uuy1+t2UVHXV2XejVZ71e9SqlFo92upk6oMPPjB/7auWW1U0tdqxVg/X9dPqp8cywDH//vtvsffVKrba5r4orW66cuVKh2lXX3212de0GrtVNV7brS5evNhU6dS2nhar7XdJ1aad0aYMztZDaRXR8tBtouut1e+1er/1nen6aLV1+466XD1W7P3222/mvfR40Cr9uv+VRqsLJyYmmm1k9dZtT5shFO3xXPdrpVV69dgv6siRI2a/sN83yku3p1WtujJ0Xy5vVWwdjrC0jtRKo8e9Vmcua9+wtpnul86OX+t3QP/aV/F2Nz129ffKnr+/v/nNtl9fV39vKvL7WBKt+q7NKObOnWuWa1VN1+rsuj72vy/t2rUzfT3o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iwAAAACUy2fGDRs2lIULFxabrtP0OXd68sknZebMmaYUXYcl08cahl988UXbPPr4hRdekFmzZsmqVavMMGZa9f3IkSO2eTRwb9q0yfS4rmOJ//DDD3LDDTfYnk9LS5MBAwZIVFSUrF27Vp566imZOnWqvPbaa279PKg+CNzOA3fskFjxD6zQoAgAAABAteTy2fFDDz0k119/vXz//ffSvXt3M03D7pIlS+T1119368r98ssvZlzw888/3zw+6aST5MMPP5TVq1fbSrm1vfnkyZPNfOq9996TyMhIWbBggVxxxRUmrOu6rVmzRrp06WLm0dA+ePBgefrpp6VZs2Yye/Zs09vyW2+9JYGBgXLaaafJhg0b5Nlnn3UI54AicBcicAMAAABuLum+5ppr5OeffzZVtefPn29uev+nn34yz7nTGWecId988438+eef5vHvv/9u3ue8884zjxMTE2Xv3r2mSrklLCzMXAzQzt2U/tUq5VbgVjp/rVq1zMUCa57evXubwG3R0vKtW7dKamqq03U7evSoKSG3v6H6I3AXInADAAAAZatQPVANtVo67Gn33nuvCbNt27aV2rVrmzbejz76qKkurjRwKy3ZtqePref0b+PGjR2e9/f3l4iICId5tN140WVYz+mQaUU9/vjjptQfNQeBuxCBGwAAAHBj6Nbgq6XZ1v3SWPO5w9y5c024nzNnjq3K9/jx402VcPse1avCpEmTZOLEibbHul20AzZUT/m5+ZKwKEEyUzIlbmichEZWTVDdsWaHJK5KlOju0RLVNcpnLxwAAAAANUW5zpa1pPe///4zJcZaVdvPz6/YPNq+WqdrabS73HXXXaa0W9tmq9jYWNmxY4cpZdbQ3aRJEzM9KSnJ9F5u0ccdO3Y093We5ORkh+Xm5uaaHs2t1+tffY0967E1T1F16tQxN9QM21dsl7CQMAI3gRsAAABwf+j+9ttvTXVs676z0O0JWVlZpu21Pa1mnp+fb+5rlXANxdru2wrZWuKsbbVvvvlm87hnz55y8OBB0yt5586dbZ9Bl2F1BKfz3H///ZKTkyMBAQFmmvZ03qZNG6dVy1HD5IgcPXRU4kZRwk0JNwAAAOCB0N2nTx/b/b59+x63bXzhhReaNtwtW7Y01cvXr19vehS/7rrrzPMa/rW6+SOPPCKnnHKKCeE6rrdWPx82bJiZp127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dAMAAAAA4CGEbgAAAAAAPITQDQAAAACAhxC6AQBAlenbt6+MHz++1HlOOukkef75522P/fz8ZMGCBcdh7QAAqDxCNwAAPkLDZmm3qVOniq+ZP3++PPzww1W9GgAAeIy/5xYNAADc6b///rPd//jjj2XKlCmydetW27T69ev73AaPiIio6lUAAMCjKOkGAMBHNGnSxHYLCwszpdt6PyQkRE499VRZsmSJw/xaBTs4OFjS09Pln3/+MfN/9NFHcsYZZ0jdunWlffv2smLFihLf77777pPu3bsXm96hQweZNm2auZ+fn2/uN2/eXOrUqSMdO3Z0WA8tfXdWKv/OO+84rV6enJwsF154odSrV0+io6Nl9uzZZW6Xe+65x3z+oKAgadWqlTzwwAOSk5NTzq0KAIBnEboBAPBxGqyvuOIKefvttx2m6+NLLrnEhHLLXXfdJXfccYesX79eevbsaQLugQMHnC535MiRsnr1avn7779t0zZt2iTx8fEyYsQI83jGjBnyzDPPyNNPP22mDxw4UIYMGSLbtm0zz995552mhN666Xwajrt06eL0Pa+55hrZtWuXfPfddzJv3jx55ZVXTBAvjX4+DfGbN2826/P666/Lc88958IWBADAcwjdAABUA9dff70sXbrUVgVdg+qXX34p1113ncN848aNk+HDh0u7du1k5syZpsT8zTffdLrM0047zZRqz5kzxzZNS5619Lt169bmsYZoLWnW0N+mTRt58sknTWm31fGZVnm3Sue1tH3y5MnmYoCWshf1559/yldffWVCc48ePaRz585m3Q4fPlzqZ9dlaum9drimFxE06M+dO7cCWxEAAPcjdAMAUA1069bNhOR3333XPP7ggw8kKipKevfu7TCflm5b/P39TYnzli1bSlyulnZbobugoEA+/PBDM02lpaXJv//+K7169XJ4jT4uusydO3fKsGHDTCC+7LLLnL6XvkbXScO2pW3bttKgQYNSP7u2b9f31GCvIV9DuL4fAADegNANAEA1Ku222kprafK1115r2k9XxpVXXmk6a1u3bp388ssvpur35Zdf7tIyMjMzTZVzDfxWW3B3WblypbkIMHjwYFm8eLGpNn///fdLdna2W98HAICKInQDAFBNjBo1Snbs2CEvvPCCad88evToYvP8+uuvtvu5ubmydu1aU9W8JNpBWp8+fUy1cr2de+650rhxY/NcaGioNGvWTH7++WeH1+jjmJgYW+m4rpd2uPb++++XehFAS7WtdbJo4D948GCJr9ELAVqir0FbS+1POeUUsw0AAPAWDBkGAEA1ER4eLhdffLHpLG3AgAEmMBf18ssvm2CqQVs7G0tNTS3W7rsoLUl+8MEHTelx0Q7K9L30uZNPPtm05dYS9g0bNth6Hdfey7/++mtZtmyZZGRkmJvStuTaQ7k9bRM+aNAgufHGG017c61qrj2bF53Pnn4WrUquvbJ37dpVvvjiC/nss89c2m4AAHgSJd0AAFQjY8aMMeG4pCD9xBNPmJt2kPbTTz/JokWLpFGjRqUuU3tA1x7Os7KyTLtse7fddptMnDjR9IgeGxtrhgvTZWoYVjokmQZt7eisadOmtpu2w3ZGQ7uWnmvpul5AuOGGG2wl685otfUJEyaYDuI09GvJtw4ZBgCAt/Ar0HpfAACgWtAq3BpCtYOzwMBA23TtOVzHvdY2zxpOAQDA8UH1cgAAqgEthdbhwrQUW6tn2wduAABQdaheDgBANTB9+nTTEZkOmzVp0qSqXh0AAPD/qF4OAAAAAICHUNINAAAAAICHELoBAAAAAPAQQjcAAAAAAB5C6AYAAAAAwEMI3QAAAAAAeAihGwAAAAAADyF0AwAAAADgIYRuAAAAAAA8hNANAAAAAIB4xv8B2t29+bPE2QEAAAAASUVORK5CYII=", "text/plain": [ "
" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Srovnávací sloupcový graf: finetuned vs base\n", "bar_colors = [\"#00DC00\", \"#FFDC00\", \"#DC0000\", \"#0078FF\"]\n", "x = np.arange(len(CLASS_NAMES))\n", "width = 0.35\n", "\n", "fig, ax = plt.subplots(figsize=(10, 6))\n", "\n", "bars_ft = ax.bar(x - width/2, [counts_ft[c] for c in CLASS_NAMES],\n", " width, label=\"Finetuned\", color=bar_colors, edgecolor=\"black\")\n", "bars_base = ax.bar(x + width/2, [counts_base[c] for c in CLASS_NAMES],\n", " width, label=\"Base\", color=bar_colors, edgecolor=\"black\", alpha=0.45, hatch=\"//\")\n", "\n", "for bar in list(bars_ft) + list(bars_base):\n", " h = bar.get_height()\n", " if h > 0:\n", " ax.text(bar.get_x() + bar.get_width() / 2, h + 5,\n", " str(h), ha=\"center\", va=\"bottom\", fontsize=10, fontweight=\"bold\")\n", "\n", "ax.set_xticks(x)\n", "ax.set_xticklabels(CLASS_NAMES)\n", "ax.set_title(\"Počet detekovaných vozidel — Finetuned vs Base\", fontsize=14)\n", "ax.set_ylabel(\"Počet vozidel\")\n", "ax.set_xlabel(\"Typ vozidla\")\n", "ax.legend(fontsize=12)\n", "plt.tight_layout()\n", "plt.savefig(\"output/vehicle_counts_comparison.png\", dpi=150, bbox_inches=\"tight\")\n", "plt.show()" ] } ], "metadata": { "kernelspec": { "display_name": ".venv (3.14.4)", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.14.4" } }, "nbformat": 4, "nbformat_minor": 4 }