跳转至

Царай таниулах (liveness) — хуурамч зураг ба хуучин зураг

Бүртгэлийн эцсийн алхамд иргэн селфи авч, түүнийг баримтын лавлагаа зурагтай (DAN бүртгэлийн зураг / үнэмлэхний чипийн зураг / паспортын DG2) тулгана. Энд ХОЁР эсрэг чиглэлийн эрсдэл бий:

Асуудал Шалтгаан
False accept Чипийн зургийг хэвлээд/дэлгэцээр камерт харуулахад давдаг Царай тулгалт (ArcFace) нь "нэг хүн үү" гэдгийг л хэлнэ — replay-г ялгадаггүй. Хуулбар зураг оригиналтай ТӨГС таарна (match ≈ 1.0)
False reject 44 настай иргэн 16 насны зурагтайгаа таарахгүй Монголын үнэмлэхийг 16 насанд авч ховор шинэчилдэг → лавлагаа зураг 20-30 жилийн настай. ArcFace-ийн ижилсэл насны зөрүүгээр жам ёсоор унадаг

Хоёулаа хоорондоо холбоотой: PAD байхгүй үед аюулгүй байдал бүхэлдээ өндөр босгон дээр тогтдог, тэр нь хуучин зурагтай иргэдийг таслана. Тиймээс PAD + шатлалт босго хоёрыг хамт хийнэ.

1. PAD — хуурамч зураг илрүүлэлт

facematch сервис селфи дээр passive PAD загвар ажиллуулж liveness_score (жинхэнэ нүүр байх магадлал 0..1) буцаана. Загвар: MiniFASNet ×2 (Silent-Face-Anti-Spoofing, Apache-2.0) → deploy/facematch/models/. Дэлгэрэнгүй: тэнд байгаа README.md.

Бодлого (SMARTID_KYC_LIVENESS_MODE):

Горим Зан төлөв
off PAD огт хэрэглэхгүй (зөвхөн хөгжүүлэлт)
log Оноог бүртгэнэ, шийдвэрт нөлөөлөхгүй ⇒ хуурамч зураг ДАВНА. Босго тохируулах үе шат
enforce liveness_score < SMARTID_KYC_LIVENESS_THRESHOLD → ТАТГАЛЗАНА. PAD загвар байхгүй бол ч татгалзана (fail-closed)

Default нь log. Сервер enforce бус горимд эхлэхдээ ил анхааруулга бичнэ.

Баталгаажуулалт (загвар/боловсруулалт өөрчилсөн бүрд):

python3 deploy/facematch/verify_pad.py --url http://127.0.0.1:8000
# image_T1 (жинхэнэ) → 1.000 ✅ · image_F1/F2 (хуурамч) → 0.155 / 0.003 ✅

Урьдчилсан боловсруулалт өчүүхэн зөрөхөд (ж: 255-д хуваах) загвар БҮХ зурагт ~0.016 өгч, PAD чимээгүй утгагүй болдог. Энэ скрипт яг түүнийг барина — заавал ажиллуул.

2. Шатлалт босго — хуучин зураг

Лавлагаа зургийн НАСЫГ тооцоолж босгыг сонгоно:

Зургийн нас Env Default
< 5 жил SMARTID_KYC_DAN_FACEMATCH_THRESHOLD 0.60
5–15 жил ..._THRESHOLD_AGED 0.52
> 15 жил ..._THRESHOLD_OLD 0.45
тодорхойгүй (хатуу босгыг хэрэглэнэ) 0.60

Зургийн насны эх сурвалж (эрэмбээр):

  1. Олгосон огноо — үнэмлэхний чипийн dateOfIssue (iOS/Android апп issue_date болгож илгээнэ).
  2. Дуусах хугацаа — паспортын MRZ-д олгосон огноо байдаггүй тул 10 жилийн хүчинтэй хугацаанаас хасна.
  3. Шинэчлэлтийн насны дүрэм — төрсөн огноо + SMARTID_KYC_ID_RENEWAL_AGES (default 16,25,45): 44 настай иргэн 25-д шинэчилсэн бол зураг ≈19 жилийн настай.

SMARTID_KYC_ID_RENEWAL_AGES нь бодит хууль зүйн дүрэмтэй таарч байх ёстой. Хэрэв үнэмлэхийг зөвхөн 16 → 45-д шинэчилдэг бол 16,45 гэж тавина — эс бөгөөс 30 настай иргэний зургийн насыг 5 жил гэж дутуу тооцож, хэт хатуу босго хэрэглэнэ.

Босгууд БУУРАХ эрэмбэтэй байх ёстой; зөрчвөл сервер анхааруулаад default руу залруулна.

3. Тохируулга (заавал)

Дээрх тоонууд бол эхлэлийн таамаг. Бодит утгыг өөрсдийн өгөгдлөөс тавина:

# Бүх оролдлогын дохиог бүртгэнэ (kyc.liveness):
docker logs deploy-app-1 2>&1 | grep kyc.liveness | tail -50

Лог бүрт: match_score, threshold, tier, photo_age_years, age_source, liveness_score, liveness_mode, liveness_backend, passed. 1-2 долоо хоног log горимоор цуглуулаад:

  • жинхэнэ иргэдийн liveness_score-ийн доод хувиуд (P1/P5) → SMARTID_KYC_LIVENESS_THRESHOLD,
  • зургийн наснаас хамаарсан match_score-ийн тархалт → шатлалт босгууд,
  • дараа нь SMARTID_KYC_LIVENESS_MODE=enforce.

4. Хязгаар — дараагийн алхам

Passive PAD нь хэвлэсэн зураг/дэлгэцийн replay-г ихэвчлэн барьдаг ч гүйцэд шийдэл биш: өндөр чанарын дэлгэц, маск, эсвэл сайн хэвлэсэн зураг давж болно. Бүрэн хамгаалалт нь challenge-response: сервер санамсаргүй даалгавар (толгой эргүүлэх/анивчих) өгч, апп богино хугацааны олон кадр илгээж, сервер тэдгээрийг шалгах. Энэ нь урьдчилан бичсэн видео болон статик зургийг хоёуланг нь таслана — тусад нь төлөвлөгдсөн (A2).