Apostille K.12 — mesin pembanding tanda tangan v2 (isolasi + ensemble + kalibrasi korpus)
Deployed: ahu-signature-verify v2 (sigverify-v2-ens-dinov2-signet) + app ahu-ai-ocr:b60cda50 · backend 2548 ✅ / frontend 976 ✅ · diverifikasi live pada e4229ea8
Jawaban untuk "any way we can improve the signature comparison AI?": ya — tiga lapis, semuanya
sudah terpasang malam ini, plus jalur menuju otonomi penuh yang datanya kini tersedia.
Lapis 1 — "Clean the scan" (persis idemu): isolasi goresan
Sebelum menilai, service kini mengisolasi goresan tangan dari kedua sisi:
- k-means (k=3) pada warna — stempel dinas tercetak lebih terang daripada tinta pena;
cluster tergelap = tinta. Cincin stempel hilang. - Filter connected-component — garis tabel formulir, blob solid (foto/kotak), dan komponen
seukuran teks cetak dibuang; yang bertahan hanya goresan besar/flourish.
Hasil pada dokumenmu: flourish "Maarml" bersih tanpa stempel; sel TANDATANGAN lembar 2008
terisolasi rapi. Skoring dan peta kemiripan berjalan pada goresan terisolasi ini (crop mentah
tetap ditampilkan ke manusia — apa adanya).
Lapis 2 — engine khusus tanda tangan: ensemble dinov2 + SigNet
dinov2 bukan model tanda tangan. Kutambahkan SigNet (Hafemann et al. — CNN yang memang
dilatih untuk verifikasi tanda tangan offline, bobot GPDS publik, BSD-3, di-bake saat build) dan
skor akhir = rata-rata cosine keduanya di atas goresan terisolasi.
Lapis 3 — kalibrasi dari korpus NYATA, bukan tebakan
Ini kuncinya: registri + MinIO memungkinkan korpus evaluasi otomatis. Kuambil 140 lembar
spesimen acak (40 pejabat dengan ≥2 registrasi → pasangan genuine lintas-lembar; 60 pejabat lain
→ pasangan impostor):
| Engine | AUC (19 genuine vs 400 impostor) |
|---|---|
| dinov2 mentah (prod lama) | tak terukur jujur — separuh pasangan "genuine" ternyata file identik yang di-upload ulang |
| dinov2 @ goresan terisolasi | 0.738 |
| SigNet @ goresan terisolasi | 0.719 |
| Ensemble (dipilih) | 0.755 |
Kalibrasi baru dijangkarkan pada persentil impostor: 50% ↔ p95 (hanya ~5% pasangan
pejabat-berbeda melampauinya), 80% ↔ p99 (~1%). Artinya:
- "≥80% — sangat mirip" kini klaim yang bisa dipertanggungjawabkan — bukti kuat kecocokan.
- Skor rendah tetap bukan verdict ("AI belum dapat menilai") — dan copy modal menjelaskannya.
- Sanity: lembar vs dirinya sendiri = 100% (cos 0.9997).
Kasusmu (dokumen 2013 vs spesimen 2008) tetap 0–24% — lintas-domain (dokumen berstempel vs lembar
spesimen) memang kelas tersulit, dan AI-nya jujur bilang belum bisa menilai; verifikator melihat
goresan terisolasi yang kini sangat mudah dibandingkan mata.
Menuju "fully autonomous" — apa yang realistis
Otonomi yang bisa dipertanggungjawabkan adalah triase otomatis, bukan tolak-otomatis:
- Skor ≥80 → auto-assist "cocok" (impostor ~1% di korpus) — verifikator tinggal konfirmasi.
- Sisanya → manusia dengan alat yang sudah ada (crop terisolasi + peta + lembar utuh).
- Jalan menaikkan porsi kasus yang ≥80 (C5 lanjutan, semua bahannya sudah ada):
- Perbesar korpus —calib-fetchbisa menarik ribuan lembar; kalibrasi makin tajam.
- Fine-tune metric model (triplet loss) pada pasangan genuine lintas-lembar registri —
ribuan pasangan tersedia gratis dari data sendiri; ini lompatan akurasi terbesar.
- Deteksi kotak dokumen lebih ketat (mengecilkan noise sisi dokumen).
- Catatan data: beberapa berkas spesimen registri berisi tanda tangan pejabat LAIN (surat
pengantar) — perlu pembersihan di sisi registri/AHU.
Menolak otomatis (menyatakan "palsu" tanpa manusia) tidak kurekomendasikan pada kualitas scan
seperti ini — false-reject pada dokumen sah adalah risiko hukum; sistem komersial pun memakai
threshold ganda + manusia di tengah.
Teknis
app/signet.py(vendored, atribusi BSD-3),isolate_signature()+_ensemble_score()di
main.py; MODEL_VERSIONsigverify-v2-ens-dinov2-signet(cache bust); health melaporkan
signet:true+ knot kalibrasi; Dockerfile mem-bakesignet.pthdari HF saat build.- Peta kemiripan kini digambar di atas goresan terisolasi (menampilkan apa yang BENAR-BENAR
dibandingkan model). - Korpus + skrip eval:
/tmp/calib(140 lembar) +calib-fetch.ts/calib-eval.py— siap
diperbesar untuk C5.