Царай таниулах (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 |
Зургийн насны эх сурвалж (эрэмбээр):
- Олгосон огноо — үнэмлэхний чипийн
dateOfIssue(iOS/Android аппissue_dateболгож илгээнэ). - Дуусах хугацаа — паспортын MRZ-д олгосон огноо байдаггүй тул 10 жилийн хүчинтэй хугацаанаас хасна.
- Шинэчлэлтийн насны дүрэм — төрсөн огноо +
SMARTID_KYC_ID_RENEWAL_AGES(default16,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).