Moderasi Gambar Otomatis

YOLO · MobileNetV3 · CLIP · Tesseract OCR · Keyword + Context Gate

1 Moderasi Gambar

Seret dan lepas gambar ke sini, atau pilih file

JPG · PNG · WebP · GIF · BMP — hingga 1000 file per batch

2 Daftar Kata Kunci Blacklist (48 kata)

Dicocokkan ke teks hasil OCR (dan nama file sebagai fallback). Ada kecocokan → gambar langsung DIMODERASI.

3 Arsitektur Sistem ▸

Alur proses

Input Gambar
▼
Engine VisualYOLO · MobileNetV3 · CLIP · SmolVLM
▼
Visual violative?kelas, prompt, atau ILLEGAL_AD
Ya
DIMODERASIYOLO/MobileNetV3: OCR dilewati
CLIP: cek OCR + konteks
SmolVLM: ILLEGAL_AD
Tidak
Tesseract OCRaman, ragu, CLIP, atau SmolVLM non-ILLEGAL_AD
▼
Keyword + Context GateOCR + nama file
▼
Keyword cocok?promosi atau berita?
Promosi
DIMODERASIjual/order/daftar/deposit
Berita / Tidak
LOLOSedukasi/peringatan atau negatif

1. Engine Visual — Klasifikasi Gambar

Enam engine bisa dipilih dari dropdown Engine visual atau API (?visual=...):

  • yolo — YOLO11n-cls, bobot 3.2 MB, ±37 ms/gambar (tercepat).
  • mobilenetv3 — MobileNetV3-Large, bobot ±16 MB, fine-tune 3 kelas di Google Colab (val_acc 0.85).
  • clip — CLIP ViT-B/32 zero-shot, bobot ±580 MB, tanpa training, paling tahan terhadap gambar di luar dataset (logo, iklan unik).
  • yolo_onnx — YOLO11n-cls dijalankan lewat onnxruntime (models/best.onnx); hasil paritas dengan yolo.
  • clip_onnx — CLIP ViT-B/32 lewat onnxruntime (models/clip/vision.onnx + fitur teks baked di reference.json); hasil paritas dengan clip.
  • smolvlm — SmolVLM2-500M, VLM yang memahami gambar dan teks di dalamnya; menilai langsung apakah gambar itu iklan ilegal, berita/edukasi, atau normal (bobot ±1 GB, lambat di CPU — ±20 detik per gambar).

CLIP membandingkan gambar terhadap prompt violative yang fokus pada promosi/transaksi (jual, harga, kontak, daftar, deposit) dan prompt aman untuk berita, edukasi, peringatan publik, serta kampanye anti-judi/anti-konten ilegal. Keputusan awal violative jika SUM(skor violative) ≥ CLIP_VIOL_THRESHOLD dan SUM(skor violative) ≥ CLIP_VIOL_MARGIN × SUM(skor aman).

Klasifikasi lokal memakai 3 kelas: obat_aborsi (violative), normal, dokumen. Untuk YOLO/MobileNetV3, prediksi violative dengan konfidensi ≥ VIOL_CONF_THRESHOLD (default 0.70) → langsung DIMODERASI dan OCR dilewati. Untuk CLIP, prediksi violative tetap dilanjutkan ke OCR + context gate agar poster berita/edukasi/peringatan tidak otomatis dihukum. SmolVLM menghasilkan vonis sendiri (ILLEGAL_AD / PUBLIC_INFO / NORMAL); ILLEGAL_AD langsung DIMODERASI, sedangkan PUBLIC_INFO/NORMAL tetap melewati OCR sebagai safety net.

2. Tesseract OCR — Ekstraksi Teks

Dijalankan bila visual tidak violative, visual masih ragu, engine yang dipakai adalah CLIP, atau SmolVLM tidak menjawab ILLEGAL_AD. OCR membaca teks dalam gambar (Indonesia + Inggris), menangkap nomor WhatsApp, kata kunci iklan ilegal, serta sinyal konteks berita/peringatan seperti pemerintah, investigasi, edukasi, jangan, berhenti, konseling, dan kampanye. Gambar besar di-resize otomatis ke maks. 1600px.

3. Keyword + Context Gate — Pencocokan Kata Kunci

Mencocokkan teks OCR dengan kata kunci blacklist (aborsi, cytotec, misoprostol, boraks, judi online, dsb.) sekaligus membedakan konteks promosi/transaksi dari berita/edukasi/peringatan. Teks dinormalisasi dulu (huruf kecil, simbol dibuang); nama file dipakai fallback bila OCR kosong.

4. Keputusan Akhir

DIMODERASI bila visual = violative untuk YOLO/MobileNetV3/SmolVLM, atau keyword match berada dalam konteks promosi/transaksi. LOLOS bila keyword negatif, atau keyword muncul dalam konteks berita/edukasi/peringatan publik.

5. Web Server (FastAPI)

Endpoint POST /api/moderasi/satu (1 gambar) dan POST /api/moderasi/bulk (banyak, maks. 1000, paralel 4 thread), GET /api/engines (daftar engine + default), POST /api/engines/default?engine=... (set default). Engine bisa diatur per-request lewat ?visual=yolo|clip|mobilenetv3|smolvlm. Respons JSON.

6. Catatan SmolVLM

SmolVLM punya tiga waktu tunggu berbeda: download model saat cache Hugging Face belum ada, load model saat pertama dipakai setelah server start, lalu inference per gambar. Di CPU, inference bisa belasan sampai puluhan detik per gambar. Gunakan HF_HOME agar cache model tetap, dan hindari SmolVLM untuk batch besar. Jika CLIP/SmolVLM gagal saat runtime, server fallback ke YOLO dan field visual_engine menunjukkan engine yang benar-benar dipakai.

7. Cara Kerja Berbagai Case

CaseAlurKeputusan
YOLO/MobileNetV3 violative conf tinggiMelewati VIOL_CONF_THRESHOLD; OCR dilewati.DIMODERASI
Visual aman atau conf rendahLanjut OCR + keyword/context gate.Tergantung OCR
CLIP violativeTidak langsung final; OCR tetap mengecek promosi vs publik/edukatif.Tergantung context gate
CLIP amanTetap lanjut OCR sebagai safety net untuk iklan berbasis teks.Tergantung OCR
SmolVLM ILLEGAL_ADVonis VLM dianggap cukup kuat; OCR dilewati.DIMODERASI
SmolVLM PUBLIC_INFO/NORMALLanjut OCR sebagai safety net.Tergantung OCR
Berita/edukasi berisi keyword sensitifKeyword terdeteksi, tetapi context gate melihat sinyal publik seperti berita, edukasi, peringatan, pemerintah, kampanye.LOLOS
Iklan teks terselubung + kontak/WAOCR mencari kombinasi keyword, sinyal promosi/transaksi, kontak, dan pola terselubung.DIMODERASI
OCR kosongNama file dipakai fallback keyword; jika tetap tidak ada sinyal, hasil mengikuti visual.Biasanya LOLOS
Engine gagal runtimeServer fallback ke YOLO; cek visual_engine di response untuk engine aktual.Tergantung YOLO/OCR
4 Penjelasan Model ▸

Berapa Kelasnya? — 3 Kelas

Model mengklasifikasikan setiap gambar ke salah satu dari 3 kelas:

  • obat_aborsi — gambar iklan/produk obat penggugur kandungan (cytotec, misoprostol, dsb.) → DIMODERASI.
  • normal — gambar biasa yang aman (makanan, hewan, logo, mobil, dsb.) → LOLOS.
  • dokumen — poster, sertifikat, atau dokumen resmi → LOLOS.

Kelas obat_aborsi disebut kelas violative. Untuk YOLO/MobileNetV3, prediksi violative dengan konfidensi ≥ VIOL_CONF_THRESHOLD (default 0.70) → langsung DIMODERASI & OCR dilewati. Untuk CLIP, hasil violative menjadi sinyal awal dan tetap dicek OCR + context gate.

Pilihan Engine Visual

  • YOLO11n-cls: 1.53 juta parameter, bobot 3.2 MB, ±37 ms/gambar. Paling cepat, cocok untuk CPU.
  • MobileNetV3-Large: transfer learning dari ImageNet, fine-tune 3 kelas di Google Colab, bobot ±16 MB, val_acc 0.85. Model aktif saat ini.
  • CLIP ViT-B/32: zero-shot (tanpa training), bobot ±580 MB, paling tahan terhadap gambar di luar distribusi dataset. Prompt violative dipersempit ke konteks promosi/transaksi, sementara prompt aman mencakup berita, edukasi, peringatan publik, dan kampanye anti-judi/anti-konten ilegal. Ambang: CLIP_VIOL_THRESHOLD (default 0.30) & CLIP_VIOL_MARGIN (default 2.0).
  • SmolVLM2-500M: VLM paling kaya konteks, tetapi paling berat. Cocok untuk review manual gambar sulit; kurang cocok sebagai default batch di CPU karena download awal besar, load model lama, dan inference lambat.

Data Training

  • obat_aborsi: 720 train + 59 val.
  • normal: 585 train + 48 val.
  • dokumen: 669 train + 55 val.
  • Total ±1.974 train + 162 val (termasuk augmentasi 2x per gambar train: crop, rotasi, flip, kecerahan).

Metrik Kinerja

  • MobileNetV3-Large (model aktif): val_acc 0.852.
  • YOLO11n-cls v5 (alternatif): lihat log training (runs/).

Konfigurasi (env)

  • MODERASI_VISUAL — engine default: yolo | yolo_onnx | clip | clip_onnx | mobilenetv3 | smolvlm.
  • VIOL_CONF_THRESHOLD — ambang violative utk YOLO/MobileNetV3 (default 0.70).
  • CLIP_VIOL_THRESHOLD — ambang jumlah skor violative utk CLIP (default 0.30).
  • CLIP_VIOL_MARGIN — rasio minimal skor violative terhadap skor aman utk CLIP (default 2.0).
  • HF_HOME — folder cache Hugging Face untuk CLIP/SmolVLM agar model tidak diunduh ulang.
  • SMOLVLM_MAX_SIZE — batas sisi terpanjang gambar untuk processor SmolVLM (default 1024).
  • MODERASI_MODEL — path model YOLO alternatif.

Keterbatasan & Catatan

  • Ambang 0.70 sengaja dibuat agar gambar yang ragu-ragu (mis. conf 0.68) tidak langsung DIMODERASI; di bawah ambang tetap dicek via OCR + keyword.
  • Bottleneck OCR: ±550 ms/gambar; engine visual jauh lebih cepat. OCR dilewati untuk YOLO/MobileNetV3/SmolVLM yang sudah violative, tetapi tetap dijalankan untuk CLIP violative agar konteks berita/edukasi bisa dikenali. SmolVLM sendiri paling lambat (±20 dtk/gambar di CPU, ±1 GB bobot).
  • SmolVLM: request pertama bisa terlihat sangat lama bila model belum ada di cache. Setelah cache tersedia, server tetap perlu memuat model saat pertama kali engine ini dipakai setelah restart.
  • Dataset kecil & noisy (scrape). Akurasi dapat naik dengan data lebih banyak, augmentasi, atau GPU.
5 Referensi API ▸

Base URL: http://IP_SERVER:8787. Dokumentasi interaktif otomatis juga tersedia di /docs (Swagger UI).

Endpoint

Method & PathKeterangan
GET /Halaman upload (UI).
GET /healthStatus server + engine aktif + kelas model.
POST /api/moderasi/satuModerasi 1 gambar. Field: file. Opsional ?visual=.
POST /api/moderasi/bulkModerasi banyak gambar (maks. 1000). Field: files. Opsional ?visual=.
GET /api/keywordsDaftar keyword blacklist (aborsi/boraks/umum).
GET /api/enginesDaftar engine visual + ketersediaan + engine default.
POST /api/engines/default?engine=Ganti engine default (yolo|clip|mobilenetv3|smolvlm).

Contoh cURL

# Moderasi 1 gambar (engine default)
curl -F "file=@foto.jpg" http://IP:8787/api/moderasi/satu

# Moderasi 1 gambar, paksa engine clip
curl -F "file=@foto.jpg" "http://IP:8787/api/moderasi/satu?visual=clip"

# Moderasi 1 gambar, paksa engine smolvlm (VLM)
curl -F "file=@foto.jpg" "http://IP:8787/api/moderasi/satu?visual=smolvlm"

# Moderasi banyak gambar sekaligus
curl -F "files=@a.jpg" -F "files=@b.png" "http://IP:8787/api/moderasi/bulk?visual=mobilenetv3"

# Cek engine yang tersedia
curl http://IP:8787/api/engines

# Ganti engine default server
curl -X POST "http://IP:8787/api/engines/default?engine=mobilenetv3"

Format Respons Moderasi

{
  "ringkasan": {
    "total": 2,
    "dimoderasi": 1,
    "lolos": 1,
    "error": 0,
    "avg_elapsed_ms": 412.7,
    "elapsed_ms": 835.4
  },
  "results": [
    {
      "file": "foto.jpg",
      "filename": "foto.jpg",
      "visual_engine": "mobilenetv3",
      "yolo_class": "obat_aborsi",
      "yolo_conf": 0.9743,
      "yolo_violative": true,
      "ocr_text": "",
      "keyword_hits": [],
      "elapsed_ms": 378.2,
      "keputusan": "DIMODERASI",
      "alasan": ["MOBILENETV3 deteksi kelas violative: obat_aborsi (conf 0.97); OCR dilewati (visual sudah violative)"]
    }
  ]
}

Catatan

  • keputusan: LOLOS | DIMODERASI | ERROR (file bukan gambar valid).
  • visual_engine: engine yang benar-benar dipakai untuk gambar itu (yolo|clip|mobilenetv3|smolvlm).
  • yolo_violative: true = kelas violative + conf ≥ ambang (visual sudah memutuskan DIMODERASI).
  • elapsed_ms: waktu proses request pada ringkasan, dan waktu proses per gambar pada tiap item results.
  • Query ?visual= hanya berlaku untuk request itu; default server tetap dipakai bila tidak dikirim.
  • Engine yang belum tersedia (mis. CLIP tanpa transformers) → HTTP 400.