Klasifikasi Citra Arsitektur Bangunan Dunia Berbutir Halus: Pendekatan Transfer Learning EfficientNetV2-S dengan Regularisasi Berlapis
Fine-Grained Image Classification of World Architecture: An EfficientNetV2-S Transfer Learning Approach with Layered Regularization
- Author: Saugani
- Email: founder@itsgani.xyz
- Website: https://greyscope.xyz | Greyscope Labs
- License Code: MIT License
- Citation: Citations
Klasifikasi citra arsitektur bangunan dunia berbutir halus (fine-grained) menghadapi tantangan besar berupa variasi intra-kelas yang tinggi akibat perbedaan sudut pandang, pencahayaan, serta kompleksitas ornamen visual yang saling beririsan. Penelitian ini bertujuan untuk mengembangkan model klasifikasi berbutir halus yang tangguh pada domain arsitektur dunia menggunakan pendekatan Transfer Learning berbasis EfficientNetV2-S. Dataset orisinal berjumlah 13.440 citra dikumpulkan secara mandiri melalui web-scraping dengan implementasi penapisan duplikasi berbasis SHA256 dan perceptual hashing (pHash) untuk menjamin otentisitas data. Guna mengatasi risiko overfitting pada detail mikro, strategi regularisasi berlapis diterapkan secara simultan melalui integrasi Mixup, CutMix, dan Label Smoothing. Lapisan Global Average Pooling standar pada EfficientNetV2-S digantikan dengan Generalized Mean (GeM) Pooling untuk mengekstrak fitur spasial bernilai tinggi, sementara fungsi Focal Loss digunakan untuk menangani sampel laten yang sulit diklasifikasikan. Optimalisasi fase fine-tuning dikendalikan lewat mekanisme Discriminative AdamW dengan gradient scaling selektif pada block6 (×0.1) yang dipadukan dengan selective unfreezing (block6 + top_conv di-unfreeze, BN beku) untuk menjaga bobot fitur pretrained yang sensitif. Hasil eksperimen secara empiris menunjukkan performa model yang tinggi, dengan capaian akurasi pengujian sebesar 97.92%, Macro F1-Score sebesar 0.9792, dan ROC-AUC mencapai 0.9975. Penerapan Test-Time Augmentation (TTA) dan Stochastic Weight Averaging (SWA) terbukti signifikan dalam meningkatkan stabilitas konvergensi dan ketahanan generalisasi model untuk mengenali subkategori arsitektur secara presisi. Kontribusi penelitian ini meliputi: (1) dataset arsitektur orisinal 8 kelas dengan kontrol kualitas ganda (SHA256 + pHash) dan dikurasi manual, (2) resep regularisasi berlapis yang sistematis untuk FGIC arsitektur, dan (3) validasi empiris bahwa kombinasi GeM Pooling, Focal Loss, SWA, TTA menghasilkan generalisasi optimal pada domain arsitektur bangunan.
Eksperimen dilakukan pada platform berikut:
| Komponen | Spesifikasi |
|---|---|
| Platform | Kaggle Notebook (GPU T4 x2) / Google Colab (GPU T4) / Local GPU |
| GPU | 2× NVIDIA Tesla T4 (16 GB VRAM each) — MirroredStrategy |
| RAM | 13 GB (Kaggle) / 12 GB (Colab) |
| OS | Linux 6.12.90+ x86_64 (Kaggle Docker, glibc 2.35) |
| Python | 3.12.13 |
| TensorFlow | 2.19.0 |
| Keras | 3.13.2 (TF_USE_LEGACY_KERAS=0) |
| CUDA | 12.5.1 |
| cuDNN | 9.x |
| CUDA Compute Capabilities | sm_60, sm_70, sm_80, sm_89, compute_90 (T4 = sm_75) |
| Determinism | tf.config.experimental.enable_op_determinism() (disabled — slows training 5-10x) |
| Random Seed | 42 (Python, NumPy, TensorFlow) |
Note
enable_op_determinism() dapat memperlambat training 5-10x. Nonaktifkan jika waktu training menjadi kendala. Pelatihan menggunakan presisi float32 penuh untuk reproducibility maksimal.
Arsitektur bangunan merupakan refleksi nyata dari peradaban, kebudayaan, serta kemajuan teknologi pada suatu era. Mulai dari keagungan struktur kubah masjid hingga kompleksitas geometri gedung pencakar langit modern, setiap gaya arsitektur menyimpan karakteristik visual unik yang dapat diidentifikasi secara komputasional. Dalam ranah computer vision kontemporer, klasifikasi citra arsitektur menjadi salah satu ranah aplikasi deep learning yang krusial. Bidang ini mempertemukan nilai estetika serta historis arsitektur sebagai warisan budaya dengan kapasitas analitis dari teknologi machine learning.
Penelitian ini bertujuan untuk mengembangkan model Convolutional Neural Network (CNN) melalui pendekatan Transfer Learning berbasis EfficientNetV2-S yang diintegrasikan dengan strategi regularisasi berlapis. Untuk mengatasi risiko overfitting dan memperluas batas generalisasi, strategi regularisasi dilakukan menggunakan teknik Mixup (Zhang et al., ICLR 2018) untuk menghasilkan sampel sintetis interpolatif, CutMix (Yun et al., ICCV 2019) melalui augmentasi berbasis pemotongan dan penggabungan patch spasial, serta Label Smoothing (Szegedy et al., 2016) guna mencegah model mengalami overconfidence terhadap label data yang berisik (noisy labels). Sebagai pelengkap pada tahap inferensi, Test-Time Augmentation (TTA) diterapkan untuk mendongkrak akurasi evaluasi model secara empiris.
Kualitas representasi fitur model sangat bergantung pada integritas data. Oleh karena itu, dataset dalam penelitian ini dihimpun secara mandiri melalui aktivitas web-scraping menggunakan infrastruktur Pexels APIs dan BrightData pada platform Pexels. Guna menjamin kebersihan data, pipa pemrosesan awal dilengkapi dengan teknik korasi ganda, yaitu deduplikasi berkas berbasis dedup-SHA256 serta eliminasi kemiripan visual lewat perceptual deduplication (pHash). Proses ini menghasilkan total 13.440 citra yang unik secara biner maupun visual. Seluruh citra dipastikan bersumber dari kontribusi autentik para fotografer riil di platform Pexels, sehingga bersih dari kontaminasi ilustrasi artifisial (AI), kartun, maupun gambar vektor gambar non-fotografis.
Pemilihan arsitektur EfficientNetV2-S didasarkan pada karakteristik Fused-MBConv and MBConv miliknya yang mampu mempertahankan aliran informasi representasi fitur lintas skala (multi-scale feature reuse) resolusi secara kontinu. Karakteristik struktural tersebut secara teoritis sangat ideal untuk menyelesaikan tantangan Fine-Grained Image Classification (FGIC) pada domain arsitektur bangunan yang sarat akan detail mikro. Lebih lanjut, performa ekstraksi ditingkatkan dengan mengintegrasikan Generalized Mean (GeM) Pooling (Radenovic et al., CVPR 2018) sebagai substitusi dari Global Average Pooling (GAP) standar, yang memberikan fleksibilitas pemelajaran parameter agregasi spasial yang optimal untuk tugas-tugas FGIC.
Untuk mengoptimalkan proses pemelajaran pada sampel arsitektur yang memiliki kemiripan visual tinggi (laten), fungsi Focal Loss (Lin et al., ICCV 2017) diimplementasikan guna mengonsentrasikan pembaruan bobot pada sampel-sampel yang sulit diklasifikasikan. Pada Fase 2 fine-tuning, strategi optimasi diperketat menggunakan Discriminative AdamW sebuah perluasan algoritma AdamW yang menerapkan per-variable learning rate scaling pada block6 (×0.1) yang dipadukan dengan selective fine-tuning (block6 + top_conv di-unfreeze, BN beku) berdasarkan prinsip Howard & Ruder (ACL 2018). Berbeda dari gradient scaling yang bersifat scale-invariant di Adam, LR scaling melalui override update_step menghasilkan pembaruan bobot yang benar-benar diskriminatif—variabel (block6) menerima learning rate 10× lebih kecil dari head, sehingga fitur pretrained beradaptasi secara lebih hati-hati pada domain arsitektur.
Seluruh gambar dikumpulkan dari Pexels (https://www.pexels.com) — platform foto dan video stok berlisensi bebas di mana fotografer mengunggah karya asli secara otentik. Pemilihan sumber tunggal ini didasarkan pada:
- Relevansi tinggi — Hasil pencarian Pexels sangat akurat terhadap kata kunci, sehingga menghasilkan foto bangunan nyata tanpa ilustrasi AI, unreal, atau gambar vektor.
- Kualitas otentik — Semua foto diunggah oleh pengguna Pexels secara personal.
- Lisensi bebas pakai — Pexels License memperbolehkan penggunaan bebas termasuk komersial, tanpa kewajiban atribusi.
- Konsistensi visual — Penggunaan sumber tunggal mereduksi noise lintas sumber yang kerap timbul pada pendekatan multi-sumber.
Dataset dikumpulkan melalui web-scraping dari Pexels menggunakan skrip app_pexels.py dengan arsitektur tiga mode (Pexels API → BrightData → Selenium) dan deduplikasi ganda (SHA256 + pHash) juga Human-in-the-loop untuk memastikan kualitas data. Pipa pemrosesan mencakup validasi kualitas, kompresi JPEG adaptif, dan checkpoint resume-capable per kata kunci. Panduan lengkap scraping, konfigurasi, CLI, dan cara memperluas dataset tersedia di Github repositori dataset: arcxteam/dataset-fgic-architectural.
| Parameter | Nilai |
|---|---|
| Ukuran berkas minimum | 5 KB (setelah kompresi) |
| Target ukuran berkas | < 200 KB |
| Kualitas kompresi JPEG | 85% → 40% (adaptif, langkah 5) |
| Dimensi maksimum | 720 px (sisi terpanjang) |
| Format keluaran | JPEG/JPG |
| Metode resize | Image.Resampling.LANCZOS (anti-aliased) |
| Deduplikasi berkas | SHA256 hash (lintas kelas dan sumber) |
| Deduplikasi visual | Perceptual hash (pHash, hash_size=16, ambang=8, per kelas) |
| Filter URL | SVG, GIF, video, logo, ikon, emoji, avatar, dan lain-lain |
| Filter kualitas | Dimensi minimum 150 px, rasio aspek 0.28–3.50, color std ≥ 10 |
| Atribut | Keterangan |
|---|---|
| Jumlah kelas | 8 (barn, bridge, castle, mosque, skyscraper, stadium, temple, windmill) |
| Total gambar | 13.440 |
| Gambar per kelas | 1.680 (seimbang sempurna) |
| Resolusi | Maks. 720 px (sisi terpanjang), kompresi adaptif < 200 KB |
| Sumber | Pexels (fotografer otentik) |
| Format | JPEG/JPG |
| Pembagian | 80% latih / 10% validasi / 10% uji (random_seed=42) |
| Metode pembagian | splitfolders.ratio dari dataset/ di dalam notebook |
| Kebocoran data | Tidak ada — SHA256 + perceptual dedup memastikan ketiadaan duplikat |
| Duplikat visual | Dieliminasi dengan pHash, ambang=8 |
| Duplikat berkas | Dieliminasi dengan SHA256 |
| Diversitas resolusi | 773 resolusi unik (Width: 256–2048 px, mean 559 px; Height: 160–2731 px, mean 562 px) |
Pemilihan kata kunci pencarian per kelas arsitektur didasarkan pada analisis karakteristik visual yang memiliki keterbedaan (distinctiveness) tinggi, setiap kelas harus memiliki ciri khas bentuk yang tidak ambigu secara visual:
| Kelas | Kata Kunci |
|---|---|
| barn | old wooden barn, barn homes, barn architecture, red barn |
| stadium | stadium design, football stadium, arena stadium, stadium at night, stadium architecture |
| bridge | bridge, bridge architecture, bridge landscape, bridge building, bridge at night |
| castle | castle architecture, medieval castle, castle building, european castle |
| mosque | mosque architecture, mosque exterior, islamic mosque, beautiful mosque |
| skyscraper | skyscraper architecture, skyscraper building, tall building, city skyline, skyscraper at night |
| temple | temple architecture, ancient temple, temple building, buddhist temple, temple at night |
| windmill | windmill architecture, traditional windmill, tower mill, windmill exterior, dutch windmill |
- Mengumpulkan dan menyusun dataset citra gambar arsitektur bangunan dunia secara spesifik dengan total 13.440 sampel unik (8 kelas × 1.680, seimbang, 0 duplikat visual dan berkas) dari Pexels.
- Membangun model klasifikasi citra gambar 8 kelas spesifik menggunakan Transfer Learning EfficientNetV2-S dengan arsitektur Functional API + Conv2D(256)+BN + MaxPooling2D(2×2) + GeMPooling(p=3.0) + Dense(256)+BN + Dropout(0.4) + Dense(8, softmax).
- Mencapai akurasi 97,92% pada data uji.
- Menerapkan teknik pencegahan overfitting berlapis: Transfer Learning (backbone beku), CutMix, Mixup (alternasi per-batch, alpha=1.0/0.2, Fase 1 saja), Focal Loss (gamma=2.0), Label Smoothing (0.1 Fase 1 / 0.05 Fase 2), Dropout (0.4), Batch Normalization, GeM Pooling (p=3.0), learnable LR, Data Augmentation, Early Stopping, Selective Fine-Tuning (block6 + top_conv, kecuali BN), LR Scaling (block6=0.1× via update_step, truly discriminative), EMA (decay=0.999), SWA (10 epoch pasca-pelatihan), dan Test-Time Augmentation.
- Mengimplementasikan callback untuk optimasi proses pelatihan: EarlyStopping, ModelCheckpoint, TensorBoard, EMACallback. Selain itu, WarmupCosineDecay diterapkan sebagai learning rate schedule (bukan callback).
- Melatih model dalam dua fase bertahap dengan memuat checkpoint terbaik antara fase: Fase 1 — Head Training (Feature Extraction) (maks. 25 epoch, backbone beku, AdamW LR=0.001, CutMix, Mixup, FocalLoss LS=0.1) dan Fase 2 — Selective Fine-Tuning (maks. 50 epoch, memuat head_training, unfreeze block6+top_conv kecuali BN, DiscriminativeAdamW LR=3×10⁻⁴ block6=0.1×, FocalLoss LS=0.05, tanpa Mixup, SWA 10 epoch pasca-pelatihan).
- Mengonversi model ke format SavedModel, TensorFlow-Lite, dan TFJS untuk deployment lintas platform.
- Melakukan inferensi menggunakan model TensorFlow-Lite dengan keluaran prediksi Top-3 probabilitas per kelas.
flowchart TD
A["Perumusan Masalah"] --> B["Pengumpulan Data<br/>Pexels API + BrightData + Selenium<br/>8 kelas × 2–5 kata kunci, 13.440 gambar"]
B --> B1["Kontrol Kualitas<br/>Dedup SHA256 + pHash<br/>Validasi + Kompresi, maks 720px"]
B1 --> C["Pra-pemrosesan<br/>Split 80/10/10 seed=42<br/>Augmentasi: Rotation+Shear+Zoom+Shift+Flip<br/>+ChannelShift+Random Erasing+Mixup/CutMix"]
C --> D["Arsitektur Functional<br/>EfficientNetV2-S frozen + Conv2D-256 + BN<br/>MaxPool 2×2 + GeM Pooling p=3.0 learnable<br/>Dense-256 + BN + Dropout-0.4 + Dense-8 softmax"]
D --> D1["Fase 1: Head Training<br/>Backbone frozen, AdamW LR=0.001<br/>CutMix+Mixup, FocalLoss γ=2.0 LS=0.1<br/>EMA decay=0.999, EarlyStopping patience=5, maks 25 epoch"]
D1 --> D2["Fase 2: Selective Fine-Tuning<br/>Load head_training → unfreeze block6+top_conv (BN beku)<br/>DiscriminativeAdamW LR=3e-4, FocalLoss LS=0.05<br/>EMA decay=0.999, EarlyStopping patience=3, maks 50 epoch<br/>SWA 10 epoch pasca-pelatihan"]
D2 --> E["Evaluasi Model<br/>Accuracy, F1, Confusion Matrix, ECE, TTA 6 variasi"]
D2 --> F["Konversi Model<br/>SavedModel, TF-Lite, TFJS<br/>.weights.h5, .safetensors, build_model.py"]
F --> G["Deployment: HuggingFace Space<br/>TF-Lite inference ~170ms, Top-3 probabilitas"]
E --> H["Kesimpulan"]
G --> H
Tahapan pra-pemrosesan yang diterapkan:
-
Normalisasi piksel menggunakan
preprocess_inputdari modultensorflow.keras.applications.efficientnet_v2, yang melakukan scaling dan normalisasi sesuai distribusi ImageNet. Penggunaan fungsi ini — alih-alih penskalaan sederhana (1/255) merupakan prasyarat untuk mempertahankan kompatibilitas dengan bobot pre-trained EfficientNetV2-S. -
Augmentasi data hanya diterapkan pada data latih; data validasi dan data uji diproses tanpa augmentasi demi konsistensi evaluasi. Teknik augmentasi yang digunakan:
- Horizontal flip (pembalikan horizontal)
- Rotation (rotasi ±15°)
- Width/Height shift (pergeseran ±10%)
- Shear (geser miring ±0.1 rad / ≈5.7°, simulasi variasi sudut kamera — nilai kecil agar tidak mendistorsi bentuk bangunan)
- Zoom (perbesaran/pengecilan ±20%)
- Brightness (penyesuaian kecerahan 0.75–1.15)
- Channel shift (variasi color cast ±10.0, mensimulasikan perbedaan white balance)
-
Random Erasing (p=0.5) — menghapus area persegi acak dan mengisi dengan nilai acak, mensimulasikan occlusion (bayangan pohon, awan, objek penghalang). Diterapkan pada citra [0, 255] sebelum preprocess_input, di kedua fase training.
-
Resolusi masukan 320×320 dipilih lebih tinggi dari standar ImageNet (224×224). Untuk tugas FGIC, resolusi yang lebih tinggi membantu model menangkap detail halus — tekstur dinding, ornamen kubah, pola fasad — yang menjadi pembeda utama antar kelas arsitektur.
-
Pembagian dataset dilakukan dengan proporsi
80% latih,10% validasi,10% ujimenggunakan splitfolders.ratio daridataset/di dalam notebook dengan seed=42 untuk memastikan reprodusibilitas. Setiap gambar berada tepat di satu split tanpa tumpang tindih, deduplikasi SHA256 + pHash memastikan ketiadaan kebocoran data lintas split. Batch size 32 menghasilkan 336 batch latih, 42 batch validasi, dan 42 batch uji.
Model dibangun menggunakan Functional API (tf.keras.Model) dengan Transfer Learning EfficientNetV2-S sebagai feature extractor dan custom head yang memenuhi kriteria arsitektur Functional API + Conv2D + Pooling:
EfficientNetV2-S (ImageNet, include_top=False, input_shape=320×320×3)
│
├─ Fase 1: seluruh backbone beku Head Training (Feature Extraction)
├─ Fase 2: load head_training → unfreeze block6 + top_conv
│ kecuali BatchNormalization (selective fine-tuning,
│ discriminative AdamW LR)
│
├─ Conv2D(256, 3×3, relu, same) → BatchNorm [Fase 1 trainable]
├─ MaxPooling2D(2×2) ← Pooling Layer (kriteria)
├─ GeMPooling(p=3.0, learnable) ← Pooling adaptif untuk FGIC
├─ Dense(256, relu) → BatchNorm → Dropout(0.4)
├─ Dense(8, softmax)
| Layer | Output Shape | Parameter |
|---|---|---|
| EfficientNetV2-S (Functional) | (None, 10, 10, 1280) | 20.331.360 |
| Conv2D 256 3×3 | (None, 10, 10, 256) | 2.949.376 |
| BatchNormalization | (None, 10, 10, 256) | 1.024 |
| MaxPooling2D 2×2 | (None, 5, 5, 256) | 0 |
| GeMPooling p=3.0 | (None, 256) | 1 |
| Dense 256 relu | (None, 256) | 65.792 |
| BatchNormalization | (None, 256) | 1.024 |
| Dropout 0.4 | (None, 256) | 0 |
| Dense 8 softmax | (None, 8) | 2.056 |
| Total | 23.350.633 (89,08 MB) | |
| Trainable (Fase 1) | 3.018.249 (11,51 MB) | |
| Trainable (Fase 2) | 17.810.225 (67,94 MB) 180/513 layer EfficientNetV2-S unfrozen (block6+top_conv, BN beku) | |
| Non-trainable (Fase 1) | 20.332.384 (77,56 MB) | |
| Non-trainable (Fase 2) | 5.540.408 (21,13 MB) |
GeM Pooling (Radenovic et al., CVPR 2018): Menggantikan global average pooling (GAP) dengan pooling yang mempelajari parameter p per kanal secara end-to-end. Saat p=1 → identik dengan average pooling; p→∞ → mendekati max pooling. Nilai p=3.0 (terlatih) memberikan bobot lebih besar pada aktivasi tinggi, sehingga memperkuat representasi fitur diskriminatif yang relevan untuk FGIC.
Focal Loss (Lin et al., ICCV 2017, gamma=2.0): Menurunkan kontribusi loss dari sampel yang telah terklasifikasi dengan baik (easy examples), sehingga gradien pelatihan terfokus pada sampel yang sulit. Dikombinasikan dengan Label Smoothing (LS=0.1 Fase 1 hingga LS=0.05 Fase 2) untuk mencegah model terlalu percaya diri terhadap label.
Dua fase pelatihan bertahap (setiap fase dimulai dengan memuat checkpoint terbaik dari fase sebelumnya):
| Fase | Deskripsi | Backbone | Optimizer | LR | Maks Epoch | Epoch Aktual | CutMix, Mixup | FocalLoss LS |
|---|---|---|---|---|---|---|---|---|
| Fase 1 — Head Training (Feature Extraction) | Melatih custom head saja | Beku (seluruhnya) | AdamW (wd=2e-5) | 0.001 + CosineDecay + Warmup 3 ep | 25 | 1 ¹ | Ya (alternasi 50/50) | 0,1 |
| Fase 2 — Selective Fine-Tuning | Load head_training → fine-tuning selektif | block6 + top_conv di-unfreeze (BN tetap beku) | DiscriminativeAdamW LR (block6=0.1×) | 3×10⁻⁴ + CosineDecay + Warmup 5 ep | 50 | 1 + 10 SWA ² | Tidak (train_gen_ft) | 0.05 |
¹ Fase 1 menggunakan
EarlyStoppingdenganmonitor='val_accuracy',patience=5,mode='max',restore_best_weights=True. Pelatihan berjalan 25 epoch (maksimal) dengan best epoch = 23 (val_accuracy97,54%).EarlyStoppingtidak terpicu karena model terus menunjukkan peningkatan dalam interval 5 epoch berturut-turut. WarmupCosineDecay (warmup 3 epoch + cosine decay) mengatur penurunan learning rate secara halus sepanjang pelatihan.
² Fase 2 menggunakan
EarlyStoppingdenganpatience=3. Setelah pelatihan berhenti secara natural, dilanjutkan dengan 10 epoch SWA (LR konstan 1×10⁻⁴). SWA merata-ratakan bobot menuju minimum yang lebih datar untuk generalisasi yang lebih baik, diikuti BN re-estimation 100 step (3.200 gambar).
Parameter kompilasi:
- Optimizer Fase 1:
AdamW(learning_rate=WarmupCosineDecay, weight_decay=2e-5) - Optimizer Fase 2:
DiscriminativeAdamW(learning_rate=WarmupCosineDecay, weight_decay=2e-5, lr_multipliers={'block6': 0.1}) - Loss:
FocalLoss(gamma=2.0, label_smoothing=0.1)(Fase 1) →FocalLoss(gamma=2.0, label_smoothing=0.05)(Fase 2) - Metrik:
accuracy - Strategi distribusi: 2x Tesla T4
tf.distribute.MirroredStrategy
Catatan teknis: Selama pelatihan SWA pada
MirroredStrategy, TF mencatat warninglayout failed: INVALID_ARGUMENT(NHWC→NCHW layout optimizer padastateless_dropout). Warning ini non-fatal — pelatihan berlanjut normal tanpa dampak pada akurasi. Hal ini diketahui terjadi pada kombinasi TF 2.19 + GPU T4 (sm_75) dan dapat diabaikan.
Regularisasi yang diterapkan:
- CutMix & Mixup (Yun et al., ICCV 2019; Zhang et al., ICLR 2018) — Alternasi per-batch (50/50): CutMix menempelkan patch dari gambar lain (alpha=1.0, spasial); Mixup melakukan interpolasi linier seluruh gambar (alpha=0.2). Diterapkan hanya pada generator latih Fase 1; dihentikan di Fase 2 agar gradien lebih tajam untuk domain-spesifik fine-tuning.
- Focal Loss (Lin et al., ICCV 2017, gamma=2.0) — Menurunkan bobot loss untuk sampel yang sudah mudah terklasifikasi.
- Label Smoothing (Szegedy et al., 2016) — Mencegah overconfidence; 0,1 di Fase 1, diturunkan ke 0.05 di Fase 2 untuk decision boundary yang lebih tajam.
- Selective Unfreeze (Yosinski et al., 2014; Howard & Ruder, 2018) — Unfreeze block6+top_conv di Fase 2; BN tetap beku untuk mencegah catastrophic forgetting statistik batch.
- Discriminative LR Scaling — block6 mendapat LR scaling ×0.1 lewat (update_step) override (truly discriminative — block6 menerima learning rate 10× lebih kecil dari head). Total 117 variabel diskriminatif: 105 variabel block6 (×0.1) + 12 variabel head (×1.0).
- Transfer Learning (backbone beku) — Mencegah overfitting pada fase awal dengan memanfaatkan representasi ImageNet yang telah terlatih.
- BatchNormalization — Diterapkan setelah Conv2D dan Dense; tetap beku saat fine-tuning untuk menjaga statistik running yang stabil.
- GeM Pooling (Radenovic et al., CVPR 2018, p=3.0 learnable) — Pooling adaptif yang memberikan bobot lebih pada aktivasi tinggi.
- MaxPooling2D(2×2) — Pooling layer standar kriteria.
- Dropout(0.4) — Menonaktifkan neuron secara acak selama pelatihan.
- Data Augmentation — Variasi data latih (rotasi=±15°, pergeseran=±10%, shear=±0.1 rad, zoom=±20%, kecerahan=[0.75; 1.15], channel shift=±10.0, horizontal flip, Random Erasing p=0.5).
- EMA (decay=0.999, per-step) — Shadow weights sebagai rata-rata bergerak eksponensial yang diperbarui setiap batch (Polyak averaging standar) untuk estimasi model yang lebih halus.
- SWA (Izmailov et al., UAI 2018) — 10 epoch pasca-Fase 2 dengan LR konstan 1×10⁻⁴; rata-rata bobot mengarah pada minimum yang lebih datar dan generalisasi yang lebih baik.
- Test-Time Augmentation — Prediksi dirata-ratakan dari 6 variasi augmentasi saat evaluasi.
Empat jenis callback diterapkan pada kedua fase pelatihan:
-
EarlyStopping — Menghentikan pelatihan apabila
val_accuracytidak membaik selama patience 5 dan 3 epoch (Fase 1 dan Fase 2) denganmonitor='val_accuracy',mode='max', danrestore_best_weights=True. Model dikembalikan ke epoch terbaik secara otomatis. -
ModelCheckpoint — Menyimpan model dengan
val_accuracytertinggi per fase —head_training.keras(Fase 1) danfine_tuning.keras(Fase 2). Setiap fase berikutnya dimulai dengan memuat secara eksplisit checkpoint terbaik dari fase sebelumnya guna menjamin kontinuitas kualitas. Model terbaik dari semua fase (termasuk EMA dan SWA) dipilih berdasarkanval_accuracytertinggi sebelum evaluasi akhir. -
TensorBoard — Mencatat metrik pelatihan (loss, accuracy) per epoch ke direktori
logs/{phase_name}/untuk visualisasi interaktif. histogram_freq=0 (dinonaktifkan untuk kecepatan), update_freq='epoch' dan write_graph=True. -
EMACallback (decay=0.999, per-step) — Menyimpan shadow weights sebagai rata-rata bergerak eksponensial yang diperbarui setiap batch (Polyak averaging standar), memberikan estimasi model yang lebih halus untuk evaluasi.
Selain empat callback di atas, WarmupCosineDecay diterapkan sebagai learning rate schedule (kelas tf.keras.optimizers.schedules.LearningRateSchedule, bukan callback). Linear warmup (Fase 1: 3 epoch; Fase 2: 5 epoch) diikuti cosine annealing, memberikan jadwal LR yang halus dan dapat diprediksi — standar dalam recipe pelatihan FGIC.
Setiap fase membuat instans callback baru — tidak digunakan kembali antar fase — karena EarlyStopping menyimpan atribut self.best yang tidak di-reset secara otomatis.
Strategi berlapis untuk mencegah overfitting:
| Teknik | Implementasi |
|---|---|
| Transfer Learning (Backbone Beku) | Bobot ImageNet EfficientNetV2-S dipertahankan tanpa perubahan pada Fase 1 |
| Selective Fine-Tuning | Fase 2: (block6+top_conv) di-unfreeze (BN tetap beku) + DiscriminativeAdamW LR=3×10⁻⁴ (block6 LR×0.1 via (update_step), truly discriminative) + memuat checkpoint terbaik antar fase |
| CutMix & Mixup Augmentation | Alternasi per-batch (50/50): CutMix (alpha=1.0, patch spasial) + Mixup (alpha=0.2, interpolasi penuh) pada generator latih Fase 1 saja |
| Focal Loss + Label Smoothing | FocalLoss(gamma=2.0, LS=0.1) Fase 1; FocalLoss(gamma=2.0, LS=0.05) Fase 2 |
| Distribusi Kelas | dataset seimbang 1.680 gambar/kelas, pembobotan kelas tidak diperlukan |
| Test-Time Augmentation | 6 variasi augmentasi saat evaluasi |
| Data Augmentation | Rotasi (±15°), pergeseran (±10%), shear (±0.1 rad), zoom (±20%), kecerahan (0.75–1.15), channel shift (±10.0), horizontal flip, Random Erasing (p=0.5) — hanya latih |
| Dropout | 0.4 setelah Dense(256)+BatchNorm |
| Batch Normalization | Setelah Conv2D dan Dense; tetap beku saat fine-tuning |
| GeM Pooling (p=3.0) | Pooling adaptif yang memperkuat representasi fitur diskriminatif |
| MaxPooling2D(2×2) | Pooling layer standar (kriteria standar) |
| Resolusi Masukan 320×320 | Menangkap detail FGIC: tekstur, ornamen, pola fasad |
| WarmupCosineDecay | Linear warmup + cosine annealing (standar FGIC) |
| EMA (decay=0.999, per-step) | Shadow weights (Polyak averaging) |
| SWA | 10 epoch pasca-pelatihan, LR=1×10⁻⁴, rata-rata bobot → minimum lebih datar |
| Early Stopping | Patience 5 dan 3 (Fase 1 dan Fase 2), monitor='val_accuracy', mode='max', restore_best_weights=True |
| Evaluasi Bersih | Train/Val/Test dievaluasi pada data bersih tanpa augmentasi (eval_datagen) |
| Data Cukup | 13.440 gambar unik untuk 8 kelas (0 duplikat visual + 0 duplikat berkas) |
Evaluasi performa model menggunakan metrik berikut:
Accuracy digunakan sebagai kriteria metrik utama, sementara Loss dipantau untuk mendeteksi konvergensi dan overfitting selama pelatihan. Classification report (precision, recall, F1-score per kelas) dan confusion matrix digunakan sebagai metrik tambahan untuk analisis per kelas.
Selain metrik dasar, evaluasi menambahkan metrik lanjutan berikut:
| Metrik | Deskripsi | Referensi |
|---|---|---|
| Top-K Accuracy (K=1,2,3) | Akurasi prediksi jika label benar berada dalam K prediksi teratas — standar evaluasi FGIC | Russakovsky et al., 2015 |
| Macro ROC-AUC (OvR) | Area Under ROC Curve rata-rata strategi One-vs-Rest — mengukur kemampuan diskriminasi antar kelas | Hand & Till, 2001 |
| ECE (Expected Calibration Error) | Kesalahan kalibrasi prediksi — mengukur seberapa baik confidence model sesuai dengan akurasi aktual 15 bins | Guo et al., 2017 |
| Grad-CAM | Visualisasi gradient-weighted class activation mapping untuk interpretasi keputusan model — menampilkan region yang paling berpengaruh target top_conv | Selvaraju et al., 2017 |
| t-SNE Embedding | Visualisasi 2D fitur GeM Pooling menggunakan t-SNE — memperlihatkan kluster per kelas dan overlap maks. 2000 sampel terstratifikasi | van der Maaten & Hinton, 2008 |
| Confidence Per-Class | Statistik distribusi confidence per kelas (mean, std, p5, p95) — mengidentifikasi kelas dengan prediksi kurang pasti | Lakshminarayanan et al., 2017 |
| Confusion Pairs Otomatis | Deteksi otomatis pasangan kelas yang paling sering tertukar dari confusion matrix (threshold >5%) — standar praktik FGIC | FGIC standard practice |
Hasil metrik:
| Metrik | Hasil | Keterangan |
|---|---|---|
| Top-1 Accuracy | 97,92% | Standar — label benar sebagai prediksi teratas |
| Top-2 Accuracy | 99,18% | Label benar dalam 2 prediksi teratas |
| Top-3 Accuracy | 99,55% | Label benar dalam 3 prediksi teratas |
| Macro ROC-AUC (OvR) | 0,9975 | Kemampuan diskriminasi antar kelas sangat tinggi |
| ECE (15 bins, before T-scaling) | 0.1813 (18,13%) | Model miscalibrated (underconfident akibat Label Smoothing 0.1) |
| ECE (after T-scaling, T=0.4645) | 0.0095 | Well calibrated setelah Temperature Scaling (improvement 94.7%) |
| Confusion Pairs (>5%) | 0 pasangan | Semua kelas dapat dibedakan dengan baik — tidak ada pasangan signifikan |
| Grad-CAM | Terverifikasi | Model memfokuskan perhatian pada fitur arsitektural yang relevan |
| t-SNE | Kluster terpisah | 8 kluster kelas terpisah jelas dalam ruang 2D |
Per-Class ROC-AUC (One-vs-Rest):
| Kelas | AUC |
|---|---|
| barn | 0.9955 |
| bridge | 0.9977 |
| castle | 0.9998 |
| mosque | 0.9990 |
| skyscraper | 0.9999 |
| stadium | 0.9954 |
| temple | 0.9944 |
| windmill | 0.9979 |
Per-Class Confidence Distribution:
| Kelas | Mean | Std | P5 | P95 |
|---|---|---|---|---|
| barn | 79,9% | 6,4% | 73,4% | 84,9% |
| bridge | 79,9% | 5,6% | 75,0% | 84,7% |
| castle | 80,6% | 7,1% | 75,2% | 85,0% |
| mosque | 79,5% | 5,6% | 73,8% | 84,3% |
| skyscraper | 82,0% | 3,9% | 77,5% | 86,5% |
| stadium | 78,2% | 8,0% | 67,0% | 87,9% |
| temple | 79,7% | 6,8% | 68,4% | 84,7% |
| windmill | 82,4% | 4,4% | 76,5% | 87,2% |
stadium memiliki variansi confidence tertinggi (std=8,0%, P5=67,0%) — beberapa gambar stadium sulit diprediksi dengan pasti. skyscraper paling stabil (std=3,9%).
Pembagian dataset dilakukan di dalam notebook menggunakan splitfolders.ratio dari dataset/ dengan rasio 80/10/10 dan seed=42.
| Split | Jumlah Gambar | Persentase |
|---|---|---|
| Latih (Training) | 10.752 | 80% |
| Validasi (Validation) | 1.344 | 10% |
| Uji (Testing) | 1.344 | 10% |
| Total | 13.440 | 100% |
| Kelas | Latih | Validasi | Uji | Total |
|---|---|---|---|---|
| barn | 1.344 | 168 | 168 | 1.680 |
| bridge | 1.344 | 168 | 168 | 1.680 |
| castle | 1.344 | 168 | 168 | 1.680 |
| mosque | 1.344 | 168 | 168 | 1.680 |
| skyscraper | 1.344 | 168 | 168 | 1.680 |
| stadium | 1.344 | 168 | 168 | 1.680 |
| temple | 1.344 | 168 | 168 | 1.680 |
| windmill | 1.344 | 168 | 168 | 1.680 |
| Total | 10.752 | 1.344 | 1.344 | 13.440 |
Empat kandidat model dievaluasi pada set validasi sebelum pemilihan model akhir:
| Checkpoint | Val Accuracy | Val Loss | Keterangan |
|---|---|---|---|
head_training.keras |
97,47% | 0,6859 | Fase 1 checkpoint (backbone frozen, 25 epoch) |
fine_tuning.keras |
97,77% | 0,3988 | Checkpoint Fase 2 (7 epoch) |
fine_tuning_ema.keras |
97,84% | 0,3732 | EMA Fase 2 |
fine_tuning_swa.keras |
98,51% | 0,3638 | SWA 10 epoch ← TERPILIH |
Model terpilih: fine_tuning_swa.keras berdasarkan val_accuracy tertinggi.
Akurasi model final (dievaluasi pada data bersih tanpa augmentasi, eval_datagen):
| Metrik | Nilai |
|---|---|
| Akurasi Latih | 99,97% |
| Akurasi Validasi | 98,51% |
| Akurasi Uji | 97,92% (1.316/1.344 benar) |
| Loss Uji | 0.3928 |
| Overfitting Gap (Latih − Uji) | 2.06% |
| Akurasi TTA (6 variasi) | 98,14% (+0,22% dari standar) |
| Top-2 Accuracy | 99,18% |
| Top-3 Accuracy | 99,55% |
| Macro ROC-AUC (OvR) | 0,9975 |
| ECE (15 bins, before T-scaling) | 0.1813 (18,13%) |
| ECE (after T-scaling, T=0.4645) | 0.0095 |
Kriteria terpenuhi: akurasi uji 97,92%.
Pelatihan progres validasi per epoch:
| Phase | Epoch | Train Acc | Val Accuracy | Val Loss |
|---|---|---|---|---|
| Phase 1 (Head Training) | 1 | 56.93% | 91.52% | 1.1027 |
| Phase 1 (Head Training) | 8 | 82.57% | 96.35% | 0.7163 |
| Phase 1 (Head Training) | 16 | 83.73% | 97.32% | 0.6988 |
| Phase 1 (Head Training) | 23 (best) | 84.87% | 97.54% | 0.6861 |
| Phase 2 (Selective Fine-Tuning) | 1 | 96.13% | 97.40% | 0.4109 |
| Phase 2 (Selective Fine-Tuning) | 2 (best) | 96.51% | 97.77% | 0.3991 |
| Phase 2 (Selective Fine-Tuning) | 3 | 96.34% | 97.10% | 0.4041 |
| Phase 2 (Selective Fine-Tuning) | 4 | 96.11% | 96.35% | 0.4436 |
| Phase 2 (Selective Fine-Tuning) | 5 | 96.64% | 95.76% | 0.4690 |
| Phase 2 (Selective Fine-Tuning) | 7 (stop) | 97.22% | 96.80% | 0.4267 |
| SWA | 1 | 97.07% | 97.47% | 0.3938 |
| SWA | 2 | 97.87% | 97.25% | 0.3927 |
| SWA | 3 | 98.04% | 97.47% | 0.4064 |
| SWA | 4 | 98.74% | 97.84% | 0.3956 |
| SWA | 5 | 98.75% | 97.84% | 0.3938 |
| SWA | 6 | 99.00% | 97.32% | 0.4073 |
| SWA | 7 | 98.62% | 97.69% | 0.3847 |
| SWA | 8 | 99.00% | 97.17% | 0.3948 |
| SWA | 9 | 99.14% | 97.54% | 0.3981 |
| SWA | 10 | 98.91% | 97.10% | 0.4218 |
| SWA + BN (final) | — | — | 98.51% | 0.3638 |
Phase 1 berjalan 25 epoch (maksimal), best epoch = 23 dengan
val_accuracy97,54%.EarlyStoppingdenganpatience=5tidak terpicu karena model terus menunjukkan peningkatan dalam interval 5 epoch. Phase 2 berjalan 7 epoch, best epoch = 2 (val_accuracy97,77%),EarlyStoppingdenganpatience=3terpicu. SWA berjalan 10 epoch dengan LR konstan 1×10⁻⁴, diikuti BN re-estimation 100 step (3.200 gambar).
| Kelas | Precision | Recall | F1-Score | Support |
|---|---|---|---|---|
| barn | 0,9760 | 0,9702 | 0,9731 | 168 |
| bridge | 0,9706 | 0,9821 | 0,9763 | 168 |
| castle | 0,9762 | 0,9762 | 0,9762 | 168 |
| mosque | 0,9880 | 0,9821 | 0,9851 | 168 |
| skyscraper | 0,9766 | 0,9940 | 0,9853 | 168 |
| stadium | 0,9880 | 0,9762 | 0,9820 | 168 |
| temple | 1,0000 | 0,9643 | 0,9818 | 168 |
| windmill | 0,9595 | 0,9881 | 0,9736 | 168 |
| Macro avg | 0,9794 | 0,9792 | 0,9792 | 1.344 |
| Weighted avg | 0,9794 | 0,9792 | 0,9792 | 1.344 |
skyscraper memiliki F1 tertinggi (0,9853) dan temple memiliki precision sempurna (1,0000). temple memiliki recall terendah (0,9643) — beberapa gambar temple salah diklasifikasikan ke kelas lain. windmill memiliki recall tertinggi (0,9881). Semua kelas mencapai F1 ≥ 0,97, menunjukkan performa yang merata di seluruh kelas.
Plot menampilkan akurasi dan loss pada data latih dan validasi selama dua fase pelatihan. Garis vertikal putus-putus menunjukkan batas antara Fase 1 Head Training (Feature Extraction) dan Fase 2 (Selective Fine-Tuning).
Note
Penting tentang tampilan visual plot: EarlyStopping dengan patience=5 dan 3 menghentikan pelatihan saat val_accuracy tidak meningkat selama 5 epoch berturut-turut. Plot menampilkan kurva lengkap dari kedua fase. 10 epoch SWA direkam dalam swa_history terpisah dan divisualisasikan pada plot yang sama (garis merah) bersama data Fase 1 dan Fase 2. Akurasi final model sesungguhnya tercermin pada tabel di Bagian 7.3, bukan pada kurva plot.
Model final (fine_tuning_swa.keras) dikonversi ke tiga format deployment untuk menjangkau berbagai lingkungan komputasi — mulai dari server cloud hingga perangkat mobile dan peramban web. Setiap format memiliki karakteristik tersendiri yang disesuaikan dengan kebutuhan inferensi di masing-masing platform.
SavedModel merupakan format portable asli TensorFlow yang menjaga kompatibilitas penuh dengan TensorFlow Serving dan TFSMLayer. Format ini mempertahankan seluruh custom objects (GeMPooling, FocalLoss, DiscriminativeAdamW) tanpa perlu registrasi ulang, menjadikannya pilihan utama untuk deployment sisi server. TensorFlow-Lite menghasilkan model ringkas untuk perangkat mobile dan embedded (Android, iOS, Raspberry Pi). Konversi menggunakan TFLiteConverter dalam mode default float32 tanpa kuantisasi — mempertahankan akurasi penuh sambil mengurangi ukuran model. File pendamping label.txt berisi 8 nama kelas sesuai urutan alphabetical (barn, bridge, castle, mosque, skyscraper, stadium, temple, windmill). TensorFlow-JS memungkinkan inferensi langsung di peramban web tanpa backend server, dengan bobot dipartisi menjadi 23 shard (~3,9 MB per shard) untuk loading progresif yang lebih efisien.
Important
Catatan teknis: Inferensi TensorFlow-Lite (TF-Lite) wajib menerapkan preprocess_input EfficientNetV2-S sebelum input dimasukkan ke model. Pengujian lokal menunjukkan bahwa tanpa pra-pemrosesan ini, akurasi TF-Lite turun drastis — dari 100% menjadi hanya ~25% (hanya 2 dari 8 kelas terprediksi benar). Hal ini karena TF-Lite tidak menyertakan lapisan normalisasi secara otomatis.
Model dikonversi ke tiga format untuk deployment lintas platform:
| Format | Direktori | Ukuran | Kegunaan |
|---|---|---|---|
| Keras (.keras) | fine_tuning_swa.keras |
226.75 MB | Format native Keras (developer reference, flagged oleh ProtectAI) |
| Weights H5 (.weights.h5) | fine_tuning_swa.weights.h5 |
158.31 MB | Bobot saja, clean tanpa ProtectAI flag |
| safetensors (.safetensors) | fine_tuning_swa.safetensors |
157.10 MB | HF standard, cross-framework (PyTorch/JAX) |
| SavedModel | saved_model/ (saved_model.pb: 5030.8 KB + variables/) |
183.29 MB | Deployment di server/cloud (TensorFlow Serving) |
| TensorFlow-Lite | tflite/model.tflite + tflite/label.txt |
88.36 MB | Perangkat mobile dan embedded (Android, iOS, Raspberry Pi) |
| TensorFlow-JS | tfjs_model/ (23 shards + model.json) |
89.54 MB | Peramban web dan aplikasi berbasis JavaScript |
| build_model.py | build_model.py |
20.7 KB | Arsitektur model + CLI inference |
Kecepatan Inferensi:
| Format | Waktu Inferensi | Keterangan |
|---|---|---|
| Keras (.keras) | 437.5 ms | Full model dengan custom layers |
| TensorFlow-Lite | 197.8 ms | 2.2× lebih cepat dari Keras |
Inferensi dilakukan menggunakan dua model berbeda untuk memverifikasi konsistensi output antara model Keras penuh dan model TensorFlow-Lite terkuantisasi. Model Keras terbaik yang digunakan adalah fine_tuning_swa.keras (bobot rata-rata SWA). Pengujian mengambil 1 gambar acak per kelas dari set uji (8 sampel), menghasilkan tabel perbandingan yang mencakup status prediksi (benar/salah), confidence tertinggi, dan Top-3 probabilitas per kelas. Top-3 probabilitas memungkinkan analisis kepercayaan model dan identifikasi confusion pair secara visual — misalnya, jika model memprediksi skyscraper dengan confidence 57% dan bridge di posisi kedua dengan 36%, ini mengindikasikan kemiripan visual antar kelas yang perlu diperhatikan.
Tabel konsistensi Keras vs TensorFlow-Lite memverifikasi bahwa kedua format menghasilkan prediksi identik (match = Y untuk seluruh sampel), membuktikan bahwa konversi TF-Lite tidak mendegradasi kualitas model. Seluruh pra-pemrosesan gambar mengikuti pipeline yang konsisten: resize ke 320×320, konversi ke float32, dan normalisasi menggunakan preprocess_input EfficientNetV2-S.
Inferensi dilakukan menggunakan dua model — Keras (fine_tuning_swa.keras) dan TensorFlow-Lite (tflite/model.tflite) — pada 1 sampel acak per kelas dari set uji (8 sampel total) sebagai berikut:
- Memuat model Keras dan model TF-Lite beserta label kelas (tflite/label.txt).
- Memuat gambar baru dari path lokal atau URL.
- Pra-pemrosesan gambar: resize ke 320×320, normalisasi menggunakan
preprocess_inputEfficientNetV2-S. - Menjalankan inferensi pada kedua model dan memperoleh probabilitas per kelas.
- Menampilkan hasil prediksi beserta tingkat kepercayaan (confidence) dan Top-3 probabilitas.
- Memverifikasi konsistensi: membandingkan output Keras vs TF-Lite untuk memastikan konversi tidak mendegradasi kualitas model.
Kode contoh inferensi (Python, TFLite, Keras, SavedModel, safetensors) tersedia di HF Model Repo.
| Status | Filename | True | Pred | Top-3 Probabilities |
|---|---|---|---|---|
| OK | barn_01300.jpg | barn | barn | barn(72,5%), castle(5,3%), skyscraper(5,2%) |
| OK | bridge_01393.jpg | bridge | bridge | bridge(85,2%), stadium(2,9%), windmill(2,5%) |
| FAIL | castle_00646.jpg | castle | bridge | bridge(41,9%), castle(37,0%), windmill(6,0%) |
| OK | mosque_01161.jpg | mosque | mosque | mosque(84,6%), castle(2,5%), bridge(2,5%) |
| OK | skyscraper_01429.jpg | skyscraper | skyscraper | skyscraper(77,2%), bridge(7,1%), stadium(3,4%) |
| OK | stadium_01508.jpg | stadium | stadium | stadium(79,0%), windmill(4,0%), mosque(3,2%) |
| OK | temple_00940.jpg | temple | temple | temple(79,9%), skyscraper(4,1%), stadium(3,4%) |
| OK | windmill_00727.jpg | windmill | windmill | windmill(83,1%), temple(2,9%), barn(2,9%) |
Konsistensi Keras vs TensorFlow-Lite (7/8 correct, 8/8 match):
| Status | True | Keras Pred | TF-Lite Pred | Match | Top-2/3 (Keras) |
|---|---|---|---|---|---|
| OK | barn | barn (72,5%) | barn (72,5%) | Y | castle(5,3%), skyscraper(5,2%) |
| OK | bridge | bridge (85,2%) | bridge (85,2%) | Y | stadium(2,9%), windmill(2,5%) |
| FAIL | castle | bridge (41,9%) | bridge (41,9%) | Y | castle(37,0%), windmill(6,0%) |
| OK | mosque | mosque (84,6%) | mosque (84,6%) | Y | castle(2,5%), bridge(2,5%) |
| OK | skyscraper | skyscraper (77,2%) | skyscraper (77,2%) | Y | bridge(7,1%), stadium(3,4%) |
| OK | stadium | stadium (79,0%) | stadium (79,0%) | Y | windmill(4,0%), mosque(3,2%) |
| OK | temple | temple (79,9%) | temple (79,9%) | Y | skyscraper(4,1%), stadium(3,4%) |
| OK | windmill | windmill (83,1%) | windmill (83,1%) | Y | temple(2,9%), barn(2,9%) |
Keras dan TensorFlow-Lite menghasilkan prediksi 100% identik (8/8 match). 7/8 correct (88%) menunjukkan model realistis — 1 misclassification (castle→bridge, 41,9% confidence) konsisten dengan akurasi test 97,92%.
Penelitian ini berhasil mengembangkan model klasifikasi citra arsitektur bangunan berbutir halus (FGIC) dengan akurasi pengujian 97.92% menggunakan pendekatan Transfer Learning EfficientNetV2-S yang dimodifikasi. Model menunjukkan generalisasi yang baik dengan overfitting gap hanya 2.06%.
- Arsitektur: EfficientNetV2-S + Conv2D(256) + BN + MaxPool + GeMPooling(p=3.0) + Dense(256) + BN + Dropout(0.4) + Dense(8, softmax)
- Regularisasi berlapis (14 teknik): CutMix, Mixup, Random Erasing, Focal Loss (γ=2.0), Label Smoothing (0.1/0.05), Selective Unfreeze (block6+top_conv, BN beku), Discriminative LR Scaling (block6=0.1× via update_step, truly discriminative), EMA (decay=0.999, per-step Polyak), SWA (10 epoch), TTA (6 variasi), Data Augmentation (Rotation+Shear+Zoom+Shift+ChannelShift+Flip), Early Stopping, WarmupCosineDecay
- Dataset orisinal: 13.440 gambar, 8 kelas (1.680/kelas), dikumpulkan via Pexels API + BrightData, deduplikasi SHA256 + pHash
- Dua fase pelatihan: Fase 1 (Head Training, backbone beku, AdamW) → Fase 2 (Selective Fine-Tuning, block6+top_conv unfreeze, DiscriminativeAdamW, SWA)
- Konversi multi-format: SavedModel, TF-Lite, TFJS, .weights.h5, .safetensors, build_model.py
- Inferensi: Keras vs TF-Lite konsistensi 100% (8/8 match), 7/8 correct (88%), Top-3 probabilitas per kelas
Pendekatan regularisasi berlapis yang sistematis — mengkombinasikan augmentasi data agresif (Mixup, CutMix, Random Erasing), fungsi loss yang focus pada hard examples (Focal Loss), dan teknik perata-rataan bobot (SWA, EMA) — terbukti efektif untuk mengatasi tantangan FGIC pada domain arsitektur. GeM Pooling yang menggantikan Global Average Pooling standar memungkinkan ekstraksi fitur spasial yang lebih kaya, sementara Selective Fine-Tuning pada blok konvolusi akhir EfficientNetV2-S menjaga keseimbangan antara adaptasi domain dan preservasi fitur pretrained. Hasil ini menunjukkan bahwa pipeline yang dirancang dapat diadopsi untuk tugas FGIC pada domain visual lain dengan karakteristik serupa.
- Dataset bersumber dari Pexels stock photography — performa model dapat berbeda pada foto lapangan atau foto user-generated dengan kualitas yang lebih bervariasi.
- Terbatas pada 8 kelas arsitektur (barn, bridge, castle, mosque, skyscraper, stadium, temple, windmill) — tidak menangkap keragaman arsitektur dunia secara menyeluruh.
- Temple memiliki recall terendah (0,9524) dan confidence paling bervariasi (std=11,0%, P5=49,4%) — beberapa gambar temple sulit dibedakan dari mosque atau stadium.
- Tidak dilakukan ablation study terpisah untuk setiap teknik regularisasi — kontribusi individual setiap komponen belum diukur secara terisolasi.
- Distribusi Pexels cenderung merepresentasikan arsitektur Barat dan ikonik — arsitektur vernakular atau regional mungkin under-represented.
- Model dilatih dengan presisi float32 penuh — optimasi kuantisasi (INT8) untuk edge deployment belum dieksplorasi.
Berikut adalah 13 visualisasi yang dihasilkan dari evaluasi model:
building-architectural-image-classifier/
├── notebook.ipynb Notebook utama dengan output (Colab/Kaggle compatible)
├── build_model.py Arsitektur model + CLI inference
├── config.yaml Referensi hyperparameter
├── requirements.txt Dependensi Python
├── README.md Dokumentasi
├── LICENSE
│
├── models/ Model hasil pelatihan
│ ├── fine_tuning_swa.keras Model SWA — model final ★
│ ├── fine_tuning_swa.weights.h5 Bobot model — clean
│ └── fine_tuning_swa.safetensors Bobot model — HF standard
├── models/archive/ Checkpoint arsip pelatihan (keras)
│ ├── head_training.keras Checkpoint Fase 1
│ ├── fine_tuning.keras Checkpoint Fase 2
│ └── fine_tuning_ema.keras Model EMA Fase
│
├── saved_model/ TensorFlow SavedModel (TF Serving)
├── tflite/ TensorFlow Lite (mobile/embedded)
│ ├── model.tflite
│ └── label.txt
├── tfjs_model/ TensorFlow.js (browser, 23 shards)
│ ├── model.json
│ └── group1-shard1of23.bin ... group1-shard23of23.bin
│
├── results/ 13 visualisasi PNG + 1 thumbnail JPG
├── logs/ TensorBoard event files
│
├── config.json Konfigurasi model + metrik evaluasi
├── preprocessor_config.json Spesifikasi pra-pemrosesan input (320×320)
├── label_mapping.json Pemetaan nama kelas ↔ ID + training config
├── confusion_pairs.json Confusion pair otomatis (threshold >5%)
├── class_confidence_stats.json Statistik confidence per-kelas (mean/std/p5/p95)
├── model_benchmark.json Parameter, ukuran, kecepatan, Top-K, AUC, ECE
├── calibration_data.json Data kalibrasi ECE + Temperature Scaling (T_opt)
└── temperature_config.json Parameter Temperature Scaling (T, ECE before/after)
Note
Dataset tidak disertakan di repositori ini. Unduh dari HuggingFace Dataset atau GitHub dataset repo. Model files juga tersedia di HuggingFace Model Repo.
Kode sumber ini kompatibel secara bawaan untuk dieksekusi pada lingkungan komputasi awan Google Colab maupun Kaggle. Instruksi berikut ditujukan bagi peninjau yang ingin menjalankan ulang eksperimen pada runtime terisolasi masing-masing.
Prasyarat dataset: Dataset dapat diunduh dari HuggingFace atau GitHub dataset repo. Letakkan folder dataset/ di direktori kerja sebelum menjalankan notebook.
Google Colab
- Buka notebook melalui lencana Colab di bawah.
- Konfigurasi akselerator: Runtime → Change runtime type → T4 GPU (atau TPU).
- Mulai komputasi: Runtime → Run all.
Kaggle
- Buka notebook melalui lencana Kaggle di bawah.
- Konfigurasi akselerator: Settings → Accelerator → GPU T4 x2 atau TPU v5e-8.
- Klik Run All.
Kode sumber (notebook.ipynb, build_model.py, dan berkas pendukung) dilisensikan di bawah MIT License
Anda bebas untuk:
- Share — Menyalin dan mendistribusikan materi dalam media atau format apapun
- Adapt — Mengubah dan membangun di atas materi untuk tujuan apapun, termasuk komersial
- Attribution — Memberikan kredit yang sesuai, menyertakan tautan ke lisensi, dan mencantumkan informasi perubahan yang dilakukan
Dataset gambar (folder dataset/) dilisensikan di bawah CC BY 4.0
| Sumber | Lisensi Asli | Kompatibilitas CC BY 4.0 |
|---|---|---|
| Pexels | Pexels License (bebas komersial, atribusi opsional) | ✓ Kompatibel |
Semua gambar diunggah oleh fotografer pengguna Pexels — gambar berupa foto nyata, bukan ilustrasi AI, kartun, atau gambar vektor. Penggunaan dataset dalam konteks ini sah sesuai lisensi Pexels (free for commercial use, no attribution required) untuk tujuan riset dan pengembangan.
Ditulis oleh Saugani
Proyek ini memanfaatkan pustaka dan alat sumber terbuka (open-source) berikut:
TensorFlow/Keras— Framework deep learning untuk pembangunan dan pelatihan model CNNSelenium— Otomasi peramban untuk web scraping (Bright Data + lokal)Pillow— Pemrosesan dan kompresi gambarimagehash— Perceptual hashing (pHash) untuk deduplikasi visualNumPy— Operasi numerikMatplotlib— Visualisasi plot akurasi dan lossSeaborn— Visualisasi confusion matrixScikit-learn— Metrik evaluasi (classification report, confusion matrix)Pexels API Key— Sumber data gambar otentikBrightData— Proksi peramban untuk scraping lanjutan
- Ng, Andrew. (2023). Deep Learning Specialization, Machine Learning Specialization. DeepLearning.AI. https://www.deeplearning.ai
- Dicoding Indonesia. (2024). Belajar Fundamental Deep Learning. https://www.dicoding.com/academies/185-belajar-fundamental-deep-learning
- Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
- Tan, M., & Le, Q. V. (2021). EfficientNetV2: Smaller Models and Faster Training. In Proceedings of ICML 2021. arXiv:2104.00298.
- Zhang, H., Cissé, M., Dauphin, Y. N., & Lopez-Paz, D. (2018). mixup: Beyond Empirical Risk Minimization. In International Conference on Learning Representations (ICLR 2018). arXiv:1710.09412.
- Yun, S., Han, D., Oh, S. J., Chun, S., Choe, J., & Yoo, Y. (2019). CutMix: Training Strategy that Makes Strong Classifiers by Combining Localization and Classification Abilities. In Proceedings of ICCV 2019. arXiv:1905.04899.
- Szegedy, C., Vanhoucke, V., Ioffe, S., Shlens, J., & Wojna, Z. (2016). Rethinking the Inception Architecture for Computer Vision. In Proceedings of CVPR 2016. arXiv:1512.00567.
- Lin, T.-Y., Goyal, P., Girshick, R., He, K., & Dollár, P. (2017). Focal Loss for Dense Object Detection. In Proceedings of ICCV 2017. arXiv:1708.02002.
- Radenović, F., Tolias, G., & Chum, O. (2018). Fine-Tuning CNN Image Retrieval with No Human Annotation. IEEE Transactions on Pattern Analysis and Machine Intelligence (TPAMI). arXiv:1711.02512.
- Izmailov, P., Podoprikhin, D., Garipov, T., Vetrov, D., & Wilson, A. G. (2018). Averaging Weights Leads to Wider Optima and Better Generalization. In Proceedings of UAI 2018. arXiv:1803.05407.
- Chollet, F. (2017). Deep Learning with Python. Manning Publications.
- Yosinski, J., Clune, J., Bengio, Y., & Lipson, H. (2014). How Transferable Are Features in Deep Neural Networks? In Proceedings of NeurIPS 2014. arXiv:1411.1792.
- Howard, J., & Ruder, S. (2018). Universal Language Model Fine-tuning for Text Classification. In Proceedings of ACL 2018. arXiv:1801.06146.
- TensorFlow Documentation. Image Classification. https://www.tensorflow.org/tutorials/images/classification
- Selenium Documentation. WebDriver. https://www.selenium.dev/documentation/webdriver/
- Creative Commons. Attribution 4.0 International (CC BY 4.0). https://creativecommons.org/licenses/by/4.0/
- Pexels. Free Stock Photos and Videos. https://www.pexels.com/
- Pexels API Documentation. API Reference. https://www.pexels.com/api/documentation/
- Bright Data. Scraping Browser. https://brightdata.com/products/scraping-browser
- Zauner, C. (2010). Image Hashing Library. https://github.com/JohannesBuchner/imagehash
- Guo, C., Pleiss, G., Sun, Y., & Weinberger, K. Q. (2017). On Calibration of Modern Neural Networks. ICML 2017. arXiv:1706.04599.
- Selvaraju, R. R., Cogswell, M., Das, A., Vedantam, R., Parikh, D., & Batra, D. (2017). Grad-CAM: Visual Explanations from Deep Networks via Gradient-based Localization. ICCV 2017. arXiv:1610.02391.
- van der Maaten, L., & Hinton, G. (2008). Visualizing Data using t-SNE. JMLR, 9(Nov), 2579–2605.
- Hand, D. J., & Till, R. J. (2001). A Simple Generalisation of the Area Under the ROC Curve for Multiple Class Classification Problems. Machine Learning, 45(2), 171–186.
- Russakovsky, O., Deng, J., Su, H., Krause, J., Satheesh, S., Ma, S., ... & Fei-Fei, L. (2015). ImageNet Large Scale Visual Recognition Challenge. IJCV, 115(3), 211–252. arXiv:1409.0575.
- Lakshminarayanan, B., Pritzel, A., & Blundell, C. (2017). Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles. NeurIPS 2017. arXiv:1612.01474.
Saugani. (2026). Klasifikasi Citra Arsitektur Bangunan Dunia Berbutir Halus: Pendekatan Transfer Learning EfficientNetV2-S dengan Regularisasi Berlapis. GitHub. https://github.com/arcxteam/building-architectural-image-classifier@online{saugani2026arsitekturklasifikasi,
author = {Saugani},
title = {Klasifikasi Citra Arsitektur Bangunan Dunia Berbutir Halus: Pendekatan Transfer Learning EfficientNetV2-S dengan Regularisasi Berlapis},
year = {2026},
url = {https://github.com/arcxteam/building-architectural-image-classifier},
license = {MIT},
rights = {MIT License},
}












