think
16px
820px

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:

  1. k-means (k=3) pada warna — stempel dinas tercetak lebih terang daripada tinta pena;
    cluster tergelap = tinta. Cincin stempel hilang.
  2. 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:

  1. Skor ≥80 → auto-assist "cocok" (impostor ~1% di korpus) — verifikator tinggal konfirmasi.
  2. Sisanya → manusia dengan alat yang sudah ada (crop terisolasi + peta + lembar utuh).
  3. Jalan menaikkan porsi kasus yang ≥80 (C5 lanjutan, semua bahannya sudah ada):
    - Perbesar korpuscalib-fetch bisa 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_VERSION sigverify-v2-ens-dinov2-signet (cache bust); health melaporkan
    signet:true + knot kalibrasi; Dockerfile mem-bake signet.pth dari 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.