Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

4 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Arch-Building-Image-Classification

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

License: MIT HuggingFace Dataset HuggingFace Model Live Hugging Spaces Open In Colab Kaggle Notebook

ABSTRAK

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.

Lingkungan dan Hardware

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.

1. Latar Belakang

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.

2. Deskripsi Dataset dan Metode Pengumpulan

2.1 Sumber Data

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.

2.2 Metode Pengumpulan Data

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.

2.3 Kontrol Kualitas dan Ukuran Berkas

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

2.4 Spesifikasi Dataset

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)

2.5 Pemilihan Kelas dan Kata Kunci

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

3. Tujuan Proyek

  • 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.

4. Diagram Alur Penelitian

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
Loading

5. Metodologi

5.1 Pra-pemrosesan dan Augmentasi Data

Tahapan pra-pemrosesan yang diterapkan:

  1. Normalisasi piksel menggunakan preprocess_input dari modul tensorflow.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.

  2. 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)
  3. 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.

  4. 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.

  5. Pembagian dataset dilakukan dengan proporsi 80% latih, 10% validasi, 10% uji menggunakan splitfolders.ratio dari dataset/ 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.

5.2 Arsitektur Model — Transfer Learning EfficientNetV2-S

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 EarlyStopping dengan monitor='val_accuracy', patience=5, mode='max', restore_best_weights=True. Pelatihan berjalan 25 epoch (maksimal) dengan best epoch = 23 (val_accuracy 97,54%). EarlyStopping tidak 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 EarlyStopping dengan patience=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 warning layout failed: INVALID_ARGUMENT (NHWC→NCHW layout optimizer pada stateless_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.

5.3 Callback dan Optimasi Pelatihan

Empat jenis callback diterapkan pada kedua fase pelatihan:

  1. EarlyStopping — Menghentikan pelatihan apabila val_accuracy tidak membaik selama patience 5 dan 3 epoch (Fase 1 dan Fase 2) dengan monitor='val_accuracy', mode='max', dan restore_best_weights=True. Model dikembalikan ke epoch terbaik secara otomatis.

  2. ModelCheckpoint — Menyimpan model dengan val_accuracy tertinggi per fase — head_training.keras (Fase 1) dan fine_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 berdasarkan val_accuracy tertinggi sebelum evaluasi akhir.

  3. 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.

  4. 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.

5.4 Penanganan Overfitting

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)

6. Metrik Evaluasi

Evaluasi performa model menggunakan metrik berikut:

$$\text{Accuracy} = \frac{\text{Jumlah Prediksi Benar}}{\text{Total Sampel Uji}}$$

$$\text{Focal Loss} = -\sum_{i=1}^{C} (1 - \hat{y}_i)^\gamma , y_i \log(\hat{y}_i)$$

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.

6.1 Metrik Lanjutan

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%).

7. Hasil Evaluasi

7.1 Distribusi Dataset

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%

7.2 Distribusi per Kelas

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

7.3 Perbandingan Checkpoint dan Akurasi Model

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_accuracy 97,54%. EarlyStopping dengan patience=5 tidak terpicu karena model terus menunjukkan peningkatan dalam interval 5 epoch. Phase 2 berjalan 7 epoch, best epoch = 2 (val_accuracy 97,77%), EarlyStopping dengan patience=3 terpicu. SWA berjalan 10 epoch dengan LR konstan 1×10⁻⁴, diikuti BN re-estimation 100 step (3.200 gambar).

7.4 Classification Report (Set Uji, 1.344 Sampel)

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.

7.5 Plot Akurasi dan Loss

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.

8. Konversi Model

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

9. Inferensi

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.

9.1 Hasil Inferensi

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:

  1. Memuat model Keras dan model TF-Lite beserta label kelas (tflite/label.txt).
  2. Memuat gambar baru dari path lokal atau URL.
  3. Pra-pemrosesan gambar: resize ke 320×320, normalisasi menggunakan preprocess_input EfficientNetV2-S.
  4. Menjalankan inferensi pada kedua model dan memperoleh probabilitas per kelas.
  5. Menampilkan hasil prediksi beserta tingkat kepercayaan (confidence) dan Top-3 probabilitas.
  6. 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%.

10. Kesimpulan

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%.

Pencapaian Utama

  • 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

Implikasi untuk Penelitian

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.

Keterbatasan

  • 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.

Galeri Hasil Visual

Berikut adalah 13 visualisasi yang dihasilkan dari evaluasi model:

Visualisasi Deskripsi
Training Curves Kurva akurasi dan loss selama Fase 1, Fase 2, dan SWA
Confusion Matrix Confusion matrix pada set uji (1.344 sampel, 8 kelas)
Per-Class Accuracy Akurasi per kelas pada set uji
Confidence Per Class Distribusi confidence per kelas (mean ± P5-P95)
Reliability Diagram ECE reliability diagram (15 bins, sebelum T-scaling)
ROC Curves ROC curve per kelas (One-vs-Rest, macro-AUC = 0.9975)
t-SNE Embedding t-SNE 2D scatter plot dari fitur GeM Pooling
Grad-CAM Grad-CAM heatmap per kelas (layer: top_conv)
Misclassification Contoh gambar yang salah diklasifikasi
Augmentation Contoh augmentasi data per kelas
Resolution Distribution Distribusi resolusi dataset (histogram + scatter + sample)
Inference Keras Hasil inferensi Keras (7/8 correct)
Inference TFLite Hasil inferensi TensorFlow-Lite (7/8 correct)

11. Struktur Berkas Proyek

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.

12. Cara Memulai (Menjalankan)

12.1 Instruksi Model Reproduksibilitas

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

  1. Buka notebook melalui lencana Colab di bawah.
  2. Konfigurasi akselerator: Runtime → Change runtime type → T4 GPU (atau TPU).
  3. Mulai komputasi: Runtime → Run all.
  4. Open In Colab

Kaggle

  1. Buka notebook melalui lencana Kaggle di bawah.
  2. Konfigurasi akselerator: Settings → Accelerator → GPU T4 x2 atau TPU v5e-8.
  3. Klik Run All.
  4. Kaggle Notebook

13. Lisensi

13.1 Kode Sumber — MIT License

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

13.2 Dataset — Creative Commons Attribution 4.0 International (CC BY 4.0)

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.

14. Ucapan Terima Kasih

Ditulis oleh Saugani

Proyek ini memanfaatkan pustaka dan alat sumber terbuka (open-source) berikut:

  • TensorFlow / KerasFramework deep learning untuk pembangunan dan pelatihan model CNN
  • Selenium — Otomasi peramban untuk web scraping (Bright Data + lokal)
  • Pillow — Pemrosesan dan kompresi gambar
  • imagehashPerceptual hashing (pHash) untuk deduplikasi visual
  • NumPy — Operasi numerik
  • Matplotlib — Visualisasi plot akurasi dan loss
  • Seaborn — Visualisasi confusion matrix
  • Scikit-learn — Metrik evaluasi (classification report, confusion matrix)
  • Pexels API Key — Sumber data gambar otentik
  • BrightData — Proksi peramban untuk scraping lanjutan

15. Referensi

  1. Ng, Andrew. (2023). Deep Learning Specialization, Machine Learning Specialization. DeepLearning.AI. https://www.deeplearning.ai
  2. Dicoding Indonesia. (2024). Belajar Fundamental Deep Learning. https://www.dicoding.com/academies/185-belajar-fundamental-deep-learning
  3. Goodfellow, I., Bengio, Y., & Courville, A. (2016). Deep Learning. MIT Press.
  4. Tan, M., & Le, Q. V. (2021). EfficientNetV2: Smaller Models and Faster Training. In Proceedings of ICML 2021. arXiv:2104.00298.
  5. 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.
  6. 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.
  7. 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.
  8. 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.
  9. 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.
  10. 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.
  11. Chollet, F. (2017). Deep Learning with Python. Manning Publications.
  12. 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.
  13. Howard, J., & Ruder, S. (2018). Universal Language Model Fine-tuning for Text Classification. In Proceedings of ACL 2018. arXiv:1801.06146.
  14. TensorFlow Documentation. Image Classification. https://www.tensorflow.org/tutorials/images/classification
  15. Selenium Documentation. WebDriver. https://www.selenium.dev/documentation/webdriver/
  16. Creative Commons. Attribution 4.0 International (CC BY 4.0). https://creativecommons.org/licenses/by/4.0/
  17. Pexels. Free Stock Photos and Videos. https://www.pexels.com/
  18. Pexels API Documentation. API Reference. https://www.pexels.com/api/documentation/
  19. Bright Data. Scraping Browser. https://brightdata.com/products/scraping-browser
  20. Zauner, C. (2010). Image Hashing Library. https://github.com/JohannesBuchner/imagehash
  21. Guo, C., Pleiss, G., Sun, Y., & Weinberger, K. Q. (2017). On Calibration of Modern Neural Networks. ICML 2017. arXiv:1706.04599.
  22. 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.
  23. van der Maaten, L., & Hinton, G. (2008). Visualizing Data using t-SNE. JMLR, 9(Nov), 2579–2605.
  24. 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.
  25. 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.
  26. Lakshminarayanan, B., Pritzel, A., & Blundell, C. (2017). Simple and Scalable Predictive Uncertainty Estimation using Deep Ensembles. NeurIPS 2017. arXiv:1612.01474.

16. Sitasi

APA (7th Edition)

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

BibTeX — GitHub

@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},
}