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
CLIP: cek OCR + konteks
SmolVLM: ILLEGAL_AD
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 denganyolo.clip_onnx— CLIP ViT-B/32 lewat onnxruntime (models/clip/vision.onnx+ fitur teks baked direference.json); hasil paritas denganclip.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
| Case | Alur | Keputusan |
|---|---|---|
| YOLO/MobileNetV3 violative conf tinggi | Melewati VIOL_CONF_THRESHOLD; OCR dilewati. | DIMODERASI |
| Visual aman atau conf rendah | Lanjut OCR + keyword/context gate. | Tergantung OCR |
| CLIP violative | Tidak langsung final; OCR tetap mengecek promosi vs publik/edukatif. | Tergantung context gate |
| CLIP aman | Tetap lanjut OCR sebagai safety net untuk iklan berbasis teks. | Tergantung OCR |
SmolVLM ILLEGAL_AD | Vonis VLM dianggap cukup kuat; OCR dilewati. | DIMODERASI |
SmolVLM PUBLIC_INFO/NORMAL | Lanjut OCR sebagai safety net. | Tergantung OCR |
| Berita/edukasi berisi keyword sensitif | Keyword terdeteksi, tetapi context gate melihat sinyal publik seperti berita, edukasi, peringatan, pemerintah, kampanye. | LOLOS |
| Iklan teks terselubung + kontak/WA | OCR mencari kombinasi keyword, sinyal promosi/transaksi, kontak, dan pola terselubung. | DIMODERASI |
| OCR kosong | Nama file dipakai fallback keyword; jika tetap tidak ada sinyal, hasil mengikuti visual. | Biasanya LOLOS |
| Engine gagal runtime | Server 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 & Path | Keterangan |
|---|---|
GET / | Halaman upload (UI). |
GET /health | Status server + engine aktif + kelas model. |
POST /api/moderasi/satu | Moderasi 1 gambar. Field: file. Opsional ?visual=. |
POST /api/moderasi/bulk | Moderasi banyak gambar (maks. 1000). Field: files. Opsional ?visual=. |
GET /api/keywords | Daftar keyword blacklist (aborsi/boraks/umum). |
GET /api/engines | Daftar 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 padaringkasan, dan waktu proses per gambar pada tiap itemresults.- Query
?visual=hanya berlaku untuk request itu; default server tetap dipakai bila tidak dikirim. - Engine yang belum tersedia (mis. CLIP tanpa
transformers) → HTTP 400.