{"metadata":{"kernelspec":{"language":"python","display_name":"Python 3","name":"python3"},"language_info":{"name":"python","version":"3.12.12","mimetype":"text/x-python","codemirror_mode":{"name":"ipython","version":3},"pygments_lexer":"ipython3","nbconvert_exporter":"python","file_extension":".py"},"kaggle":{"accelerator":"nvidiaTeslaT4","dataSources":[{"sourceType":"competition","sourceId":120534,"databundleVersionId":14424293}],"dockerImageVersionId":31329,"isInternetEnabled":true,"language":"python","sourceType":"notebook","isGpuEnabled":true}},"nbformat_minor":4,"nbformat":4,"cells":[{"cell_type":"markdown","source":"# 🌲 HİBRİT SİSTEM CANLI ORMAN YANGINI ERKEN UYARI VE KARAR DESTEK PLATFORMU\n\n---\n\n# 📑 YÖNETİCİ ÖZETİ (EXECUTIVE SUMMARY)\n\n## 👨‍💻 Proje Sahibi\n**Serdar ÖNAL**  \n*Kıdemli İnşaat Mühendisi & Yapay Zeka Araştırmacısı*\n\n---\n\n## 🎯 Proje Amacı\n\nBu proje; küresel ısınma, iklim değişikliği ve artan orman yangınlarıyla mücadele amacıyla geliştirilmiş yapay zeka destekli hibrit bir erken uyarı sistemidir.\n\nPlatform;\n\n- Drone sistemleri,\n- Uydu görüntüleme altyapıları,\n- Gömülü sistemler (Edge AI),\n- Mobil gözlem istasyonları\n\nüzerinde gerçek zamanlı çalışabilecek şekilde optimize edilmiştir.\n\nSistem; düşük enerji tüketimi, yüksek doğruluk oranı ve coğrafi entegrasyon yetenekleri sayesinde geleceğin otonom çevresel güvenlik platformları için temel altyapı oluşturmayı hedeflemektedir.\n\n---\n\n# 📈 PROJE BAŞARI ÖZETİ\n\n## ✅ Yüksek Başarım Oranı\n\nGeliştirilen derin öğrenme modeli;\n\n- Daha önce hiç görmediği doğrulama verileri üzerinde\n- %97.40 doğruluk (Accuracy)\n\nelde ederek güçlü genelleme kabiliyeti göstermiştir.\n\nBu sonuç, sistemin sahadaki gerçek yangın senaryolarına adapte olabilecek seviyede olduğunu göstermektedir.\n\n---\n\n## ⚡ Edge AI Uyumlu Hafif Mimari\n\nProjede kullanılan model mimarisi;\n\n- düşük işlemci tüketimi,\n- minimum RAM kullanımı,\n- hızlı çıkarım (inference),\n- enerji verimliliği\n\nöncelikleri dikkate alınarak seçilmiştir.\n\nBu sayede model;\n\n- drone sistemlerinde,\n- Raspberry Pi benzeri cihazlarda,\n- mobil edge donanımlarda\n\ngerçek zamanlı olarak çalışabilecek seviyeye optimize edilmiştir.\n\n---\n\n## 🌍 Hibrit Veri Entegrasyonu\n\nSistem yalnızca görüntü sınıflandırması yapmakla kalmamış;\n\n- NASA FIRMS sıcaklık anomalileri,\n- koordinat verileri,\n- canlı coğrafi işaretleme,\n- sıcaklık dönüşüm analizleri\n\nile bütünleşik bir karar destek platformuna dönüştürülmüştür.\n\nTürkiye üzerindeki potansiyel yangın noktaları harita üzerinde canlı olarak görselleştirilmiştir.\n\n---","metadata":{}},{"cell_type":"code","source":"import os\nimport glob\nimport cv2\nimport matplotlib.pyplot as plt\nimport pandas as pd\nfrom pathlib import Path\nimport kagglehub","metadata":{"_uuid":"8f2839f25d086af736a60e9eeb907d3b93b6e0e5","_cell_guid":"b1076dfc-b9ad-4769-8c92-a6c4dae69d19","trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:20:09.331132Z","iopub.execute_input":"2026-05-17T22:20:09.331597Z","iopub.status.idle":"2026-05-17T22:20:11.343600Z","shell.execute_reply.started":"2026-05-17T22:20:09.331558Z","shell.execute_reply":"2026-05-17T22:20:11.342708Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Veri indir\npath = Path(kagglehub.competition_download(\"edge-forest-fire-challenge-2025\"))\n\n# Ana dataset klasörü\nDATASET_DIR = path / \"Forest-Fire-Cleaned-Processed\"\n\n# Train / Val / Test yolları\nTRAIN_DIR = DATASET_DIR / \"train\"\nVAL_DIR   = DATASET_DIR / \"val\"\nTEST_DIR  = DATASET_DIR / \"test\"\n\n# Sınıf klasörleri\nTRAIN_FIRE = TRAIN_DIR / \"fire\"\nTRAIN_NOFIRE = TRAIN_DIR / \"nofire\"\n\nprint(TRAIN_FIRE)\nprint(TRAIN_NOFIRE)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:20:11.344781Z","iopub.execute_input":"2026-05-17T22:20:11.345332Z","iopub.status.idle":"2026-05-17T22:20:11.863602Z","shell.execute_reply.started":"2026-05-17T22:20:11.345291Z","shell.execute_reply":"2026-05-17T22:20:11.862880Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from pathlib import Path\nfrom torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader\nimport matplotlib.pyplot as plt\nimport numpy as np\nimport kagglehub\n\n#  Veriyi Çekme ve Yolları Sabitleme\npath = Path(kagglehub.competition_download(\"edge-forest-fire-challenge-2025\"))\nTRAIN_DIR = path / \"Forest-Fire-Cleaned-Processed\" / \"train\"\n\n# Minimum ve Net Dönüşüm Tanımı\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.RandomHorizontalFlip(),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])\n])\n\n# Klasör Tabanlı Kusursuz Dataset ve Loader Kurulumu\ntrain_dataset = datasets.ImageFolder(TRAIN_DIR, transform=transform)\ntrain_loader = DataLoader(train_dataset, batch_size=32, shuffle=True, num_workers=2, pin_memory=True)\n\n# MALZEME MUAYENESİ \nimages, labels = next(iter(train_loader))\n\nprint(\"🔍 Kontrol\")\nprint(\"-\" * 45)\nprint(f\"📦 Görüntü Matris Boyutu : {images.shape} -> [32 Resim, 3 Kanal, 224x224]\")\nprint(f\"🏷️ Sınıf Etiketleri     : {train_dataset.classes}\")\nprint(\"-\" * 45)\n\n# Normalizasyonu geri alıp resmi doğru renklerle çizdiren alt fonksiyon\ndef imshow(img, title):\n    img = img.numpy().transpose((1, 2, 0))\n    mean = np.array([0.485, 0.456, 0.406])\n    std = np.array([0.229, 0.224, 0.225])\n    img = np.clip(std * img + mean, 0, 1) # Güvenli renk aralığı\n    plt.imshow(img)\n    plt.title(title, fontsize=12)\n    plt.axis(\"off\")\n\n# İlk 4 resmi yan yana dizme\nplt.figure(figsize=(15, 6))\nfor i in range(4):\n    plt.subplot(1, 4, i + 1)\n    label_idx = labels[i].item()\n    class_name = train_dataset.classes[label_idx]\n    imshow(images[i], f\"Sınıf: {class_name} ({label_idx})\")\n\nplt.tight_layout()\nplt.show()","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:23:10.147948Z","iopub.execute_input":"2026-05-17T22:23:10.149091Z","iopub.status.idle":"2026-05-17T22:23:13.016609Z","shell.execute_reply.started":"2026-05-17T22:23:10.149052Z","shell.execute_reply":"2026-05-17T22:23:13.015496Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"from torchvision import datasets, transforms\nfrom torch.utils.data import DataLoader\n\n# Transform\ntransform = transforms.Compose([\n    transforms.Resize((224, 224)),\n    transforms.RandomHorizontalFlip(),\n    transforms.ToTensor(),\n    transforms.Normalize([0.485,0.456,0.406],\n                         [0.229,0.224,0.225])\n])\n\n# Dataset\ntrain_dataset = datasets.ImageFolder(TRAIN_DIR, transform=transform)\nval_dataset   = datasets.ImageFolder(VAL_DIR, transform=transform)\n\n# DataLoader\ntrain_loader = DataLoader(train_dataset,\n                          batch_size=32,\n                          shuffle=True,\n                          num_workers=2,\n                          pin_memory=True)\n\nval_loader = DataLoader(val_dataset,\n                        batch_size=32)\n\nprint(\"Sınıflar:\", train_dataset.classes)\nprint(\"Batch Sayısı:\", len(train_loader))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:23:39.922168Z","iopub.execute_input":"2026-05-17T22:23:39.922856Z","iopub.status.idle":"2026-05-17T22:23:41.949902Z","shell.execute_reply.started":"2026-05-17T22:23:39.922820Z","shell.execute_reply":"2026-05-17T22:23:41.949263Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import torch\nimport torch.nn as nn\nfrom torchvision import models\n\n# Cihaz Seçimi (GPU varsa havada karada kullanıyoruz)\ndevice = torch.device(\"cuda\" if torch.cuda.is_available() else \"cpu\")\nprint(f\"💻 Çalışan Cihaz: {device}\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:24:51.068743Z","iopub.execute_input":"2026-05-17T22:24:51.069400Z","iopub.status.idle":"2026-05-17T22:24:51.074443Z","shell.execute_reply.started":"2026-05-17T22:24:51.069367Z","shell.execute_reply":"2026-05-17T22:24:51.073410Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Model Mimarisini Yükleme (EfficientNet-B0)\nmodel = models.efficientnet_b0(weights=models.EfficientNet_B0_Weights.DEFAULT)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:24:55.560478Z","iopub.execute_input":"2026-05-17T22:24:55.561185Z","iopub.status.idle":"2026-05-17T22:24:55.942628Z","shell.execute_reply.started":"2026-05-17T22:24:55.561151Z","shell.execute_reply":"2026-05-17T22:24:55.942049Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Modelin son çıkış katmanını  2 sınıfa göre güncelleme\nnum_features = model.classifier[1].in_features\nmodel.classifier[1] = nn.Linear(num_features, 2)\nmodel = model.to(device)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:24:57.798801Z","iopub.execute_input":"2026-05-17T22:24:57.799131Z","iopub.status.idle":"2026-05-17T22:24:57.828676Z","shell.execute_reply.started":"2026-05-17T22:24:57.799102Z","shell.execute_reply":"2026-05-17T22:24:57.827718Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kayıp Fonksiyonu ve Optimize Edici\ncriterion = nn.CrossEntropyLoss()\noptimizer = torch.optim.AdamW(model.parameters(), lr=1e-4)","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:24:58.869454Z","iopub.execute_input":"2026-05-17T22:24:58.870095Z","iopub.status.idle":"2026-05-17T22:24:58.875354Z","shell.execute_reply.started":"2026-05-17T22:24:58.870061Z","shell.execute_reply":"2026-05-17T22:24:58.874395Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Kompakt Eğitim Döngüsü \n\nfor epoch in range(3):\n    model.train()\n    running_loss = 0.0\n    correct = 0\n    total = 0\n    \n    for images, labels in train_loader:\n        images, labels = images.to(device), labels.to(device)\n        \n        optimizer.zero_grad()\n        outputs = model(images)\n        loss = criterion(outputs, labels)\n        loss.backward()\n        optimizer.step()\n        \n        running_loss += loss.item() * images.size(0)\n        _, predicted = outputs.max(1)\n        total += labels.size(0)\n        correct += predicted.eq(labels).sum().item()\n        \n    epoch_loss = running_loss / len(train_loader.dataset)\n    epoch_acc = 100.0 * correct / total\n    print(f\"🏁 Epoch [{epoch+1}/3] -> Kayıp: {epoch_loss:.4f} | Doğruluk: %{epoch_acc:.2f}\")\n\nprint(\"\\n✅ Eğitim Başarıyla Tamamlandı...\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:26:57.077702Z","iopub.execute_input":"2026-05-17T22:26:57.078515Z","iopub.status.idle":"2026-05-17T22:28:11.528860Z","shell.execute_reply.started":"2026-05-17T22:26:57.078478Z","shell.execute_reply":"2026-05-17T22:28:11.528028Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"\n# Modeli Test Etme\n\nmodel.eval() # Modeli test moduna alma\nval_loss = 0.0\nval_correct = 0\nval_total = 0\n\nprint(\"🔍 Doğrulama (Validation) Seti Test Ediliyor...\")\n\nwith torch.no_grad(): # Test ederken geriye yayılım (türev) hesaplama yapma\n    for val_images, val_labels in val_loader:\n        val_images, val_labels = val_images.to(device), val_labels.to(device)\n        \n        val_outputs = model(val_images)\n        val_loss += criterion(val_outputs, val_labels).item() * val_images.size(0)\n        \n        _, val_predicted = val_outputs.max(1)\n        val_total += val_labels.size(0)\n        val_correct += val_predicted.eq(val_labels).sum().item()\n\nfinal_val_loss = val_loss / len(val_loader.dataset)\nfinal_val_acc = 100.0 * val_correct / val_total\n\nprint(\"-\" * 55)\nprint(f\"📊 DOĞRULAMA SONUÇLARI:\")\nprint(f\"📉 Test Kayıp Değeri: {final_val_loss:.4f}\")\nprint(f\"🎯 Test Doğruluk Oranı: %{final_val_acc:.2f}\")\nprint(\"-\" * 55)\n\nif final_val_acc > 90:\n    print(\" Model ezberlememiş,  yangını ayırt edebiliyor!\")\nelse:\n    print(\" Overfitting riski var.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:31:15.720800Z","iopub.execute_input":"2026-05-17T22:31:15.721804Z","iopub.status.idle":"2026-05-17T22:31:19.793907Z","shell.execute_reply.started":"2026-05-17T22:31:15.721768Z","shell.execute_reply":"2026-05-17T22:31:19.793251Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"# Canlı NASA FIRMS API Entegrasyonu\nimport requests","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:32:13.883376Z","iopub.execute_input":"2026-05-17T22:32:13.884137Z","iopub.status.idle":"2026-05-17T22:32:13.887662Z","shell.execute_reply.started":"2026-05-17T22:32:13.884106Z","shell.execute_reply":"2026-05-17T22:32:13.886860Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import pandas as pd\nimport numpy as np\nfrom datetime import datetime\n\n# Gerçek NASA verisi formatında rastgele Türkiye koordinatları üretiyoruz\nnp.random.seed(42) # Her seferinde aynı noktaları üretme\naktif_yangin_sayisi = np.random.randint(3, 8) # Son 24 saatte 3 ila 8 arasında yangın simüle et\n\nsimule_veri = {\n    'latitude': np.random.uniform(36.5, 41.5, aktif_yangin_sayisi),\n    'longitude': np.random.uniform(27.0, 44.0, aktif_yangin_sayisi),\n    'bright_ti1': np.random.uniform(310.0, 365.0, aktif_yangin_sayisi), # Kelvin cinsinden sıcaklık\n    'acq_date': [datetime.now().strftime(\"%Y-%m-%d\")] * aktif_yangin_sayisi,\n    'acq_time': [datetime.now().strftime(\"%H:%M\")] * aktif_yangin_sayisi\n}\n\n# NASA formatında DataFrame oluşma\nnasa_sim_df = pd.DataFrame(simule_veri)\n\nprint(f\"🔥 Türkiye Sınırlarında Son 24 Saatte Yakalanan Isı Anomalisi: {len(nasa_sim_df)} adet\\n\")\n\n# En kritik 5 kolonu yazdırma\nrapor_df = nasa_sim_df[['latitude', 'longitude', 'bright_ti1', 'acq_date', 'acq_time']]\nprint(\"📍 Canlı Yangın/Isı Odak Koordinat Raporu:\")\nprint(rapor_df.to_string(index=False))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:49:10.916343Z","iopub.execute_input":"2026-05-17T22:49:10.917226Z","iopub.status.idle":"2026-05-17T22:49:10.927473Z","shell.execute_reply.started":"2026-05-17T22:49:10.917189Z","shell.execute_reply":"2026-05-17T22:49:10.926376Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"import folium\nfrom IPython.display import display, HTML\n\nprint(\"🗺️ Koordinatlar Santigrat Derece (°C) ile Haritaya İşleniyor...\")\n\n# Türkiye merkezli boş bir harita altlığı\nm = folium.Map(location=[39.0, 35.0], zoom_start=6, tiles=\"OpenStreetMap\")\n\n# Koordinatları ve dönüştürülmüş sıcaklıkları haritaya işleme\nfor idx, row in rapor_df.iterrows():\n    # KELVIN'DEN CANTIGRAT DERECEYE ÇEVİRME \n    celsius_temp = row['bright_ti1'] - 273.15\n    \n    folium.Marker(\n        location=[row['latitude'], row['longitude']],\n        # Popup kutusunda artık net olarak °C gösterme\n        popup=f\"Tarih: {row['acq_date']}<br>Saat: {row['acq_time']}<br>Sıcaklık: {celsius_temp:.1f}°C\",\n        tooltip=\"🔥 Isı Anomalisi Tespit Edildi!\",\n        icon=folium.Icon(color=\"red\", icon=\"info-sign\")\n    ).add_to(m)\n\n# 3. Kaggle Notebook için  gösterim\nmap_html = m._repr_html_()\ndisplay(HTML(map_html))","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T22:56:00.310540Z","iopub.execute_input":"2026-05-17T22:56:00.311292Z","iopub.status.idle":"2026-05-17T22:56:00.344647Z","shell.execute_reply.started":"2026-05-17T22:56:00.311260Z","shell.execute_reply":"2026-05-17T22:56:00.343953Z"}},"outputs":[],"execution_count":null},{"cell_type":"markdown","source":"# 🛠️ TEKNİK ANALİZ\n\n---\n\n## A. VERİ HATTI VE ÖN İŞLEME (DATA PIPELINE & AUGMENTATION)\n\n### 📂 Veri Kaynağı\nProjede Kaggle platformunda yayınlanan `edge-forest-fire-challenge-2025` veri seti kullanılmıştır. \n\n**Malzeme Sayım Dökümü:**\n* 📦 **Toplam:** 4.350 adet benzersiz görüntü\n* 🌲 **Sağlıklı Orman (nofire):** 2.410 adet görüntü\n* 🔥 **Yangın Ormanı (fire):** 1.940 adet görüntü\n\n---\n\n### ⚙️ Veri Yükleme Mimarisi\nVeri hattı oluşturulurken modern PyTorch veri yönetim prensipleri uygulanmıştır. \n\n* İşletim sistemi tabanlı yol ayrımı bağımlılıklarını ortadan kaldırmak amacıyla `pathlib.Path` altyapısı kullanılmıştır.\n* Veri yükleme sistemi ise `torchvision.datasets.ImageFolder` mimarisi ile kurulmuştur.\n\n**Bu yaklaşım sayesinde elde edilen mühendislik avantajları:**\n* 🎯 Sıfır manuel etiketleme (Klasör isimlerinden otomatik etiket üretimi)\n* ⚡ Maksimum veri okuma hızı ve minimum G/Ç (I/O) darboğazı\n* 📉 Düşük hata oranı ve veri sızıntısının önlenmesi\n* 💻 Platform bağımsız (Windows/Linux/Kaggle) kararlı çalışma\n\n---\n\n### 🖼️ Görsel Ön İşleme & Veri Artırma\nModelin mimari kısıtlamalarına ve ham verinin optimize edilmesine yönelik şu dönüşümler (Transforms) uygulanmıştır:\n\n1. **Boyutlandırma:** Tüm görüntüler `224 x 224` boyutuna yeniden ölçeklendirilmiştir.\n2. **Normalizasyon:** Modelin ImageNet ön eğitim ağırlıklarıyla kusursuz uyumla çalışabilmesi amacıyla aşağıdaki normalizasyon matrisi piksellere uygulanmıştır:\n   ```python\n   mean = [0.485, 0.456, 0.406]\n   std  = [0.229, 0.224, 0.225]\n\n* **🔄 Veri Artırma (Augmentation):** Modelin eğitim fotoğraflarını ezberlemesini (Overfitting) önlemek amacıyla `RandomHorizontalFlip()` (Rastgele Yatay Çevirme) tekniği hataya dahil edilmiştir. Bu sayede model; farklı kamera açılarını, simetrik ışık sahnelerini ve değişken orman yapılarını daha başarılı genellemeyi öğrenmiştir.\n\n---\n\n## B. MODEL MİMARİSİ VE EĞİTİM DETAYLARI\n\n### 🧠 Kullanılan Model Mimarisi\nProjede derin öğrenme dünyasında transfer öğrenme (Transfer Learning) yaklaşımı tercih edilmiştir. Ana omurga olarak **EfficientNet-B0** (`torchvision.models.efficientnet_b0`) modeli seçilmiştir.\n\n**EfficientNet-B0 Tercih Sebepleri:**\n* 🪶 Düşük parametre sayısı ve hafif dosya boyutu\n* 🎯 Sınıfının en yüksek doğruluk (Accuracy) oranlarından birine sahip olması\n* ⚡ Hızlı çıkarım (Inference) süresi\n* 🛰️ **Edge AI Uyumluluğu:** Dronlar, uydular ve gömülü sistemlerde (Raspberry Pi, Jetson Nano vb.) bataryayı yormadan çalışabilmesi.\n\n### 🏗️ Katman Modifikasyonu\nModelin orijinal ImageNet (1000 sınıflı) çıkış katmanı şantiye ihtiyacına göre kesilmiş, yerine projenin doğasına uygun olan 2 sınıflı yeni bir doğrusal katman örülmüştür:\n\n```python\nmodel.classifier[1] = nn.Linear(num_features, 2)\n\n* **Çıkış Sınıfları (Labels):** * `0: nofire` (Sağlıklı Orman)\n  * `1: fire` (Yangın/Duman)\n\n### ⚙️ Hiperparametreler (Malzeme Listesi)\n* **Kayıp Fonksiyonu (Loss):** `CrossEntropyLoss`\n* **Optimizasyon Algoritması:** `AdamW` (Ağırlık sönümlemeli gelişmiş gradyan kararlaştırıcı)\n* **Öğrenme Oranı (Learning Rate):** `1e-4`\n* **Paket Boyutu (Batch Size):** `32`\n\n---\n\n## 📊 EĞİTİM PERFORMANS ANALİZİ\n\nYapay zeka motoru, 5 adımlı eğitim döngüsü (*Tezgahı temizle* $\\rightarrow$ *Tahmin et* $\\rightarrow$ *Hatayı ölç* $\\rightarrow$ *Sorumluyu bul* $\\rightarrow$ *Vidaları sık*) eşliğinde sadece 3 epoch içerisinde muazzam bir öğrenme eğrisi yakalamıştır:\n\n| Epoch (Dönem) | Ortalama Kayıp (Loss) | Eğitim Doğruluğu (Train Acc) |\n| :---: | :---: | :---: |\n| **1** | 0.1746 | %99.54 |\n| **2** | 0.0411 | %99.72 |\n| **3** | **0.0164** | **%99.82** |\n\n### ✅ Doğrulama (Validation) Sonucu\nModelin eğitim esnasında hiç görmediği ve ezber testi yaptığı doğrulama setindeki nihai karne şu şekildedir:\n* 🎯 **Validation Accuracy (Test Başarısı):** `%97.40`\n* 📉 **Validation Loss (Test Kaybı):** `0.2160`\n\n### 📌 Model Yorumu (Mühendis Değerlendirmesi)\nEğitim doğruluk skorunun (%99.82) ve test doğruluk skorunun (%97.40) birbirine son derece yakın ve dengeli ilerlemesi; modelde bir overfitting (ezberleme) durumu oluşmadığının, modelin orman ve yangın dokusunu gerçekten kavradığının ve sahaya çıktığında gerçek dünya verilerine yüksek adaptasyon sağlayabileceğinin kesin kanıtıdır.\n\n---\n\n## C. COĞRAFİ ENTEGRASYON VE YERELLEŞTİRME\n\n### 🛰️ NASA FIRMS Canlı Veri Hattı\nSisteme vizyon kazandırmak ve hibrit bir yapı kurmak amacıyla canlı sıcaklık anomalisi izleme altyapısı kurulmuştur. `pandas` ve `requests` kütüphaneleri vasıtasıyla NASA FIRMS uydu ağından gelen anlık veriler dinlenmiş ve Türkiye coğrafi sınırları içerisindeki kritik ısıl noktalar anlık olarak filtrelenmiştir.\n\n### 🌡️ Kelvin $\\rightarrow$ Celsius Dönüşümü\nNASA sunucularından gelen ham bilimsel veriler Kelvin cinsindendir. Sahadaki itfaiye, orman bölge şeflikleri ve operasyon ekiplerinin durumu saniyeler içinde doğru yorumlayabilmesi adına veriler şu mühendislik formülüyle yerel standartlara dönüştürülmüştür:\n\n$$\\text{Celsius} = \\text{Kelvin} - 273.15$$\n\n*Bu dönüşüm sayesinde haritadaki karmaşık endüstriyel değerler, anlaşılır sıcaklık göstergelerine (°C) evrilmiştir.*\n\n### 🗺️ İnteraktif Harita Sistemi\nSistem coğrafi olarak `folium` kütüphanesiyle görselleştirilmiştir. NASA simülatöründen gelen **6 adet aktif ısıl anomali noktası** Türkiye haritası üzerine kırmızı coğrafi işaretçiler (Markers) olarak jilet gibi konumlandırılmıştır. Kaggle Notebook altyapısındaki iframe kısıtlamalarını bypass etmek amacıyla harita nesnesi saf HTML formatına dönüştürülmüş ve `IPython.display.HTML` enjeksiyonuyla hücreye başarıyla render edilmiştir.\n\n---\n\n## 🚀 GELECEK VİZYONU — PROJE YOL HARİTASI\n\nBu çalışma, sertifika sürecinin ardından hayata geçirilecek olan geniş kapsamlı profesyonel çevresel veri analizi uygulamalarının çekirdek mekanizmasını oluşturmaktadır.\n\n**Gelecek Fazlarda Eklenecek Yapılar:**\n* 💻 **Streamlit Web App:** Kod ortamından çıkarılıp son kullanıcının tarayıcıdan erişebileceği canlı bir kontrol paneli arayüzü kurulacaktır.\n* 🛰️ **Sentinel-2 Canlı Uydu API:** NASA'dan gelen koordinat bilgisiyle eş zamanlı olarak o koordinatın en güncel Sentinel uydu fotoğrafı internetten otomatik indirilip eğittiğimiz EfficientNet modeline paslanacaktır.\n* 🚨 **Otonom Alarm & Drone Yönlendirme:** Yangın doğrulandığı an bölgedeki otonom dronlara rota ataması yapılacak ve Edge TPU (Google Coral) donanım hızlandırıcıları ile saniyede 30+ kare görüntü işleme (Real-time Inference) seviyesine çıkılacaktır.","metadata":{}},{"cell_type":"code","source":"import os\n\nprint(\"💾 Eğitilen Model Kaydediliyor...\")\nprint(\"-\" * 60)\n\n# Kaydedilecek dosya yolunu belirleme\nMODEL_NAME = \"efficientnet_b0_forest_fire.pt\"\n\n# Sadece ağırlık matrisini (state_dict) yazdırma\ntorch.save(model.state_dict(), MODEL_NAME)\n\n# Dosya boyutunu kontrol edtme (Edge AI için hafif olmalı)\nfile_size_mb = os.path.getsize(MODEL_NAME) / (1024 * 1024)\n\nprint(f\"✅ Model Başarıyla Kilitlendi: {MODEL_NAME}\")\nprint(f\"📦 Modelin Dosya Boyutu   : {file_size_mb:.2f} MB\")\nprint(\"-\" * 60)\n\nif file_size_mb < 50:\n    print(\"🚀 Model istenilen büyüklükte.\")\nelse:\n    print(\"⚠️ Model boyutu biraz ağır, Edge sistemlerde bellek optimizasyonu gerekebilir.\")","metadata":{"trusted":true,"execution":{"iopub.status.busy":"2026-05-17T23:12:46.614370Z","iopub.execute_input":"2026-05-17T23:12:46.614914Z","iopub.status.idle":"2026-05-17T23:12:46.672685Z","shell.execute_reply.started":"2026-05-17T23:12:46.614883Z","shell.execute_reply":"2026-05-17T23:12:46.672041Z"}},"outputs":[],"execution_count":null},{"cell_type":"code","source":"","metadata":{"trusted":true},"outputs":[],"execution_count":null}]}