Thị giác máy tính 5 — Nhận diện khuôn mặt & eKYC
Thị giác máy tính 5 — Nhận diện khuôn mặt & eKYC
Khi khách mở tài khoản online, ngân hàng phải trả lời một câu hỏi mà trước đây quầy giao dịch làm bằng mắt thường: người đang cầm điện thoại chụp selfie này có đúng là người trên tấm CCCD không, và có phải người thật đang ngồi trước camera hay chỉ là một tấm ảnh in? Đó chính là hai bài toán lõi của bài này: nhận diện khuôn mặt (so khớp danh tính) và liveness detection (chống giả mạo). Hai bài toán này ghép với OCR ở bài 4 tạo thành quy trình eKYC (electronic Know Your Customer — định danh khách hàng điện tử) — xương sống của ngân hàng số.
Đây là danh mục AI. Các đoạn code trong bài là pseudocode minh hoạ để bạn thấy luồng xử lý; không phải SQL/Python sandbox chạy được.
1. Bốn khái niệm dễ nhầm
"Nhận diện khuôn mặt" là cụm từ bị dùng lẫn lộn. Thực tế có bốn thứ khác nhau, mỗi thứ trả lời một câu hỏi và có đầu ra riêng.
| Khái niệm | Câu hỏi | Đầu ra | Dùng ở đâu |
|---|---|---|---|
| Face detection | Có khuôn mặt không & ở đâu? | Bounding box quanh mỗi mặt | Bước tiền xử lý, cắt vùng mặt |
| Face verification (1:1) | Hai khuôn mặt này có cùng một người? | Có / Không (theo ngưỡng) | eKYC: selfie vs ảnh CCCD |
| Face identification (1:N) | Người này là ai trong CSDL? | ID khớp nhất (hoặc "không có") | Tra danh sách đen, chống trùng hồ sơ |
| Face embedding | Biểu diễn khuôn mặt thế nào để so? | Vector số (ví dụ 512 chiều) | Nền tảng cho cả 1:1 và 1:N |
- Face DETECTION chỉ tìm có mặt hay không và mặt nằm đâu — chưa biết là ai. Đây là bài toán object detection (xem Phân loại, Phát hiện), đầu ra là hộp bao quanh mặt, kèm các điểm mốc (landmark: hai mắt, mũi, hai khoé miệng).
- Face VERIFICATION (1:1) so hai khuôn mặt để xác nhận có phải cùng người — một phép so một-một. Đây chính là lõi của eKYC: so mặt trên selfie với mặt trên ảnh CMND/CCCD. Kết quả là một quyết định nhị phân theo ngưỡng.
- Face IDENTIFICATION (1:N) tìm một khuôn mặt trong cả một cơ sở dữ liệu N người — phép so một-nhiều. Ngân hàng dùng để đối chiếu với danh sách cảnh báo, hoặc phát hiện một người mở nhiều hồ sơ dưới các danh tính khác nhau.
- Face EMBEDDING là nền tảng chung: mạng biến khuôn mặt thành một vector sao cho hai ảnh của cùng một người cho vector gần nhau, hai người khác nhau cho vector xa nhau. So khớp = đo khoảng cách giữa hai vector (đúng tinh thần embedding ở Embeddings & tương đồng).
2. Face embedding & pipeline nhận diện
Từ khuôn mặt thành vector
Ý tưởng cốt lõi: đừng so ảnh với ảnh theo từng pixel (đổi ánh sáng, góc chụp là hỏng), mà học một hàm ánh xạ khuôn mặt → vector trong không gian sao cho khoảng cách phản ánh "cùng người hay không". Cách huấn luyện kinh điển dùng triplet loss: cho bộ ba (anchor, positive = cùng người, negative = người khác), tối ưu để khoảng cách anchor–positive nhỏ hơn anchor–negative một biên (margin). Các họ hàm mất mát đời sau (ArcFace, CosFace...) siết chặt biên góc để tách lớp tốt hơn.
Kết quả: mỗi khuôn mặt là một vector (thường 128–512 chiều), so bằng khoảng cách cosine hoặc Euclid. Vector này gọi là template (mẫu sinh trắc) — thứ ta lưu và bảo vệ, chứ không lưu ảnh gốc nếu tránh được.
Pipeline chuẩn: detect → align → embed → so khớp
- Detect — tìm khuôn mặt và các điểm mốc.
- Align — xoay/căn chỉnh khuôn mặt về tư thế chuẩn (hai mắt nằm ngang, kích thước chuẩn hoá) để giảm nhiễu do tư thế. Bước này cải thiện độ chính xác đáng kể.
- Embed — đưa mặt đã căn qua mạng, ra vector.
- So khớp — tính khoảng cách hai vector, so với ngưỡng. Dưới ngưỡng → cùng người; trên ngưỡng → khác người.
# pseudocode minh hoạ — KHÔNG chạy được
face_id = detect_and_align(id_card_image) # mặt trên CCCD
face_self = detect_and_align(selfie_image) # mặt selfie
v1, v2 = embed(face_id), embed(face_self) # ra vector
dist = cosine_distance(v1, v2) # khoảng cách
match = dist < THRESHOLD # quyết định theo ngưỡng
Với 1:N, ta so vector selfie với toàn bộ template trong CSDL và lấy khoảng cách nhỏ nhất; nếu vẫn vượt ngưỡng thì kết luận "không có trong CSDL". Khi N lớn, dùng chỉ mục vector (ANN) để tra nhanh thay vì quét tuyến tính — xem ANN indexes.
3. Liveness detection — chống giả mạo (cực kỳ quan trọng)
Nhận diện khuôn mặt chính xác đến mấy cũng vô nghĩa nếu bị lừa bằng ảnh in. Kẻ gian có thể cầm ảnh chân dung nạn nhân, phát video trên màn hình điện thoại, đeo mặt nạ 3D, hoặc dựng deepfake hoán mặt. Nếu hệ thống chỉ so khớp mà không kiểm tra "đây có phải người sống thật đang hiện diện không", nó sẽ duyệt cho kẻ giả. Vì thế liveness detection (phát hiện thực thể sống) — hay PAD (Presentation Attack Detection) — là lá chắn bắt buộc, quan trọng ngang hàng với chính việc so khớp.
Hai nhóm tấn công cần chống
| Loại tấn công | Mô tả | Ví dụ |
|---|---|---|
| Print/photo attack | Ảnh in hoặc ảnh trên màn hình | In chân dung, giơ ảnh chụp |
| Replay attack | Phát lại video khuôn mặt | Mở video selfie cũ trên điện thoại khác |
| Mask attack | Mặt nạ 2D/3D, silicone | Mặt nạ in, mặt nạ nhựa |
| Deepfake / injection | Video tổng hợp, chèn luồng camera giả | Hoán mặt real-time, camera ảo |
Passive vs active
- Passive liveness (bị động): phân tích một ảnh/khung hình để phán đoán thật–giả, khách không cần làm gì thêm. Mô hình bắt các dấu hiệu tinh vi: kết cấu da thật vs bề mặt giấy/màn hình (moiré, phản xạ), độ sâu, vi chuyển động, phản chiếu ánh sáng tự nhiên. Ưu điểm: trải nghiệm mượt, nhanh; thách thức: khó chống replay tinh vi.
- Active liveness (chủ động, challenge–response): hệ thống yêu cầu khách thực hiện hành động ngẫu nhiên rồi kiểm tra có làm đúng không — quay đầu trái/phải, chớp mắt, mỉm cười, đọc một dãy số ngẫu nhiên. Vì thử thách là ngẫu nhiên tại thời điểm chạy, kẻ gian không chuẩn bị video sẵn được. Ưu điểm: chống replay/print tốt; nhược điểm: thêm bước, tốn vài giây, khách có thể thao tác sai.
Thực chiến ngân hàng thường kết hợp cả hai và bổ sung chống injection attack (kẻ gian bơm thẳng luồng video giả vào app thay vì đưa qua camera thật) bằng kiểm tra tính toàn vẹn thiết bị/SDK. Với deepfake ngày càng khoẻ, phòng thủ phải liên tục cập nhật — đây là cuộc đua vũ trang, không phải bài toán "làm một lần xong".
4. Quy trình eKYC ngân hàng đầu-cuối
Ghép mọi mảnh lại: một luồng eKYC hoàn chỉnh gồm ba nguồn bằng chứng — giấy tờ, khuôn mặt sống, và nguồn đối chiếu độc lập — rồi ra quyết định.
Các bước:
- Chụp giấy tờ — khách chụp mặt trước/sau CMND/CCCD/hộ chiếu.
- OCR trích thông tin — đọc họ tên, số giấy tờ, ngày sinh, ngày cấp; kiểm định dạng, checksum số giấy tờ (xem OCR & Document AI). Đồng thời tách ảnh chân dung in trên giấy tờ.
- Chụp selfie — khách chụp ảnh/quay video khuôn mặt trực tiếp qua app.
- Liveness — chạy passive + active để chắc chắn là người thật đang hiện diện, không phải ảnh/video/mask/deepfake.
- So khớp mặt 1:1 — verification giữa mặt selfie và ảnh chân dung trên giấy tờ. Cho ra khoảng cách/điểm tương đồng, so ngưỡng.
- Đối chiếu nguồn độc lập — nâng độ tin cậy bằng nguồn ngoài ảnh chụp: đọc chip NFC trên CCCD gắn chip (ảnh và dữ liệu ký số trong chip khó làm giả hơn ảnh chụp), đối chiếu cơ sở dữ liệu quốc gia về dân cư khi được phép, và chạy 1:N nội bộ để phát hiện một người mở nhiều hồ sơ hoặc trùng danh sách cảnh báo.
- Quyết định — nếu mọi tầng qua ngưỡng → duyệt; nếu điểm nằm vùng xám hoặc có cờ bất thường → đẩy sang thẩm định thủ công; nếu phát hiện giả mạo rõ → từ chối và ghi nhận cảnh báo (có thể liên thông khung chống gian lận).
Nguyên tắc thiết kế: không có tầng nào một mình quyết định. Liveness chống người-giả, verification chống danh-tính-sai, đối chiếu nguồn chống giấy-tờ-giả. Kẻ gian phải phá cả ba mới lọt.
5. Độ đo & tradeoff ngưỡng
Mọi hệ thống sinh trắc đều đặt một ngưỡng để biến khoảng cách/điểm số thành quyết định có/không. Chọn ngưỡng là chọn cân bằng giữa hai loại sai.
| Chỉ số | Nghĩa | Rủi ro khi cao |
|---|---|---|
| FAR (False Acceptance Rate) | Tỷ lệ chấp nhận nhầm kẻ giả thành khách thật | Cho kẻ gian lọt → gian lận, mất tiền, rủi ro pháp lý |
| FRR (False Rejection Rate) | Tỷ lệ từ chối nhầm khách thật | Khách thật bị chặn → bỏ cuộc, trải nghiệm tệ |
| EER (Equal Error Rate) | Điểm mà FAR = FRR | Dùng để so sánh mô hình |
Hai loại sai đánh đổi ngược nhau: siết ngưỡng chặt → FAR giảm (an toàn hơn) nhưng FRR tăng (nhiều khách thật bị chặn); nới ngưỡng → ngược lại.
Trong ngân hàng, FAR thường được ưu tiên giữ rất thấp vì chấp nhận nhầm một kẻ mạo danh có thể dẫn tới rửa tiền, chiếm đoạt tài khoản, thiệt hại tài chính và trách nhiệm pháp lý — nặng hơn nhiều so với việc làm phiền một khách thật phải thử lại. Nhưng đẩy FRR quá cao lại làm rơi rớt khách hàng hợp pháp. Lời giải thực tế: đặt ngưỡng ở mức FAR mục tiêu, rồi định tuyến vùng xám sang người thẩm định thay vì ép máy quyết cứng. Ngưỡng cũng cần theo dõi và hiệu chỉnh theo dữ liệu vận hành, và phân tích riêng theo từng nhóm để phát hiện bias.
Liveness có bộ đo song song theo chuẩn PAD: APCER (tỷ lệ tấn công giả mạo bị nhận nhầm là thật) và BPCER (tỷ lệ người thật bị nhận nhầm là giả mạo) — cùng logic đánh đổi.
6. Ràng buộc ngân hàng: sinh trắc học là dữ liệu nhạy cảm
Khuôn mặt và template sinh trắc là dữ liệu cá nhân nhạy cảm. Không giống mật khẩu, bạn không thể đổi khuôn mặt khi bị lộ — nên rò rỉ template là rủi ro dài hạn. Vận hành eKYC ở Việt Nam vì thế nằm dưới các ràng buộc pháp lý và kỹ thuật khắt khe:
- Nghị định 13/2023/NĐ-CP về bảo vệ dữ liệu cá nhân xếp dữ liệu sinh trắc học vào nhóm dữ liệu cá nhân nhạy cảm — đòi hỏi sự đồng ý rõ ràng của chủ thể trước khi thu thập/xử lý, mục đích cụ thể, và biện pháp bảo vệ tăng cường. Chi tiết ở Quyền riêng tư & tuân thủ. Nguyên tắc thực thi: thu thập tối thiểu, nói rõ mục đích, cho phép rút lại đồng ý, và mã hoá dữ liệu khi lưu và khi truyền.
- Tuân thủ quy định eKYC của Ngân hàng Nhà nước. NHNN có khung cho phép mở tài khoản/định danh khách hàng bằng phương thức điện tử với các yêu cầu về đối chiếu, chống giả mạo và lưu vết. (Ở đây nêu khái quát — tra cứu văn bản hiện hành để lấy số liệu/ngưỡng cụ thể, không suy đoán.)
- Bảo vệ template. Ưu tiên lưu vector template đã mã hoá thay vì ảnh gốc; tách khoá; kiểm soát truy cập chặt; ghi log ai truy cập khi nào. Cân nhắc kỹ thuật template protection (biến đổi không phục hồi).
- Bias theo nhân khẩu. Mô hình có thể sai lệch theo giới, độ tuổi, tông da nếu dữ liệu huấn luyện lệch — dẫn tới FRR cao bất công cho một nhóm. Phải đo hiệu năng tách theo nhóm, không chỉ nhìn con số tổng.
- Lưu vết & giải thích. Mọi quyết định eKYC (duyệt/từ chối/chuyển tay) cần được ghi vết để kiểm toán và giải trình với cơ quan quản lý.
Build vs Buy
| Tự xây (build) | Mua dịch vụ (buy) | |
|---|---|---|
| Kiểm soát dữ liệu | Cao — dữ liệu ở trong hệ thống | Phụ thuộc nhà cung cấp, cần rà điều khoản |
| Chất lượng liveness/anti-spoof | Cần đội ML mạnh, cập nhật liên tục | Nhà cung cấp chuyên trách, có chứng nhận PAD |
| Thời gian ra thị trường | Chậm | Nhanh |
| Chi phí | Đầu tư lớn ban đầu | Trả theo lượng gọi, tăng theo quy mô |
| Tuân thủ NĐ13 | Tự chịu trách nhiệm toàn bộ | Vẫn chịu trách nhiệm, phải kiểm nơi lưu dữ liệu |
Phần lớn ngân hàng mua engine nhận diện + liveness (nơi anti-spoofing đòi chuyên môn và cập nhật liên tục) nhưng tự giữ phần điều phối quy trình, ngưỡng quyết định, đối chiếu nguồn và lưu trữ template — để không đẩy dữ liệu nhạy cảm ra ngoài quá mức và giữ quyền kiểm soát rủi ro.
Use case thực tế
Bối cảnh. Ngân hàng triển khai mở tài khoản 100% online qua app: ~5.000 phiên eKYC/ngày. Yêu cầu: chặn gian lận mạo danh (FAR mục tiêu rất thấp) mà vẫn giữ tỷ lệ hoàn tất cao, đúng NĐ13 và khung eKYC của NHNN.
Luồng vận hành:
- Đồng ý & thu thập. Trước khi chụp, app hiển thị thông báo và lấy đồng ý xử lý dữ liệu sinh trắc (NĐ13). Không đồng ý → không tiếp tục.
- Giấy tờ + OCR. Khách chụp CCCD gắn chip; OCR đọc thông tin, kiểm checksum số giấy tờ; tách ảnh chân dung trên thẻ. Nếu có đầu đọc NFC, đọc chip để lấy ảnh/dữ liệu ký số làm nguồn tin cậy hơn ảnh chụp.
- Selfie + liveness. Passive liveness chạy nền; nếu điểm nghi ngờ, kích hoạt active challenge ngẫu nhiên (quay đầu / đọc dãy số hiện trên màn hình). Giả sử ~4% phiên bị chặn ở tầng liveness (nghi print/replay/deepfake).
- So khớp 1:1. Verification selfie vs ảnh giấy tờ (ưu tiên ảnh từ chip nếu có). Điểm ≥ ngưỡng "duyệt" → qua; nằm vùng xám → chuyển thẩm định tay (giả sử ~7%); dưới ngưỡng thấp → từ chối.
- Đối chiếu nguồn & 1:N nội bộ. Đối chiếu CSDL dân cư (khi được phép) và chạy 1:N trên template nội bộ để bắt trùng hồ sơ / danh sách cảnh báo; hit → chuyển điều tra (FraML).
- Quyết định & lưu vết. Duyệt tự động cho các phiên "sạch"; phần còn lại vào hàng đợi người kiểm. Template lưu dạng vector mã hoá, không lưu ảnh selfie thô quá thời gian cần thiết; mọi quyết định được ghi log kiểm toán.
Kết quả (minh hoạ): thời gian mở tài khoản rút từ nhiều phút xuống dưới một phút cho phiên sạch; FAR giữ ở mức mục tiêu nhờ liveness + đối chiếu nguồn; các phiên vùng xám và cờ bias được người xử lý, giữ FRR thực tế ở mức chấp nhận được. Dashboard theo dõi FAR/FRR/APCER/BPCER tách theo nhóm nhân khẩu để phát hiện lệch.
Một truy vấn giám sát vận hành đơn giản (đếm giao dịch bất thường sau khi mở tài khoản để đối soát với luồng eKYC) — minh hoạ trên schema sandbox:
-- ▶ Chạy được
SELECT a.customer_id, COUNT(*) AS so_gd, SUM(t.amount) AS tong_tien
FROM transactions t
JOIN accounts a ON t.account_id = a.id
GROUP BY a.customer_id
ORDER BY tong_tien DESC
LIMIT 20;
Ghi nhớ
- Bốn khái niệm khác nhau: detection (tìm mặt), verification 1:1 (so hai mặt — lõi eKYC: selfie vs ảnh CCCD), identification 1:N (tìm trong CSDL), embedding (mặt → vector, so bằng khoảng cách).
- Pipeline nhận diện: detect → align → embed → so khớp theo ngưỡng. Align cải thiện độ chính xác; template là vector, không phải ảnh.
- Liveness / anti-spoofing là bắt buộc — so khớp giỏi đến mấy vẫn vô nghĩa nếu bị lừa bằng ảnh/video/mask/deepfake. Passive (phân tích 1 khung, mượt) vs active (challenge–response ngẫu nhiên, chống replay); thực chiến kết hợp cả hai + chống injection.
- eKYC đầu-cuối = ba nguồn bằng chứng: giấy tờ+OCR, khuôn mặt sống (liveness+1:1), và đối chiếu nguồn độc lập (NFC chip CCCD, CSDL quốc gia, 1:N nội bộ). Không tầng nào một mình quyết định; vùng xám đẩy sang người.
- Độ đo & tradeoff: FAR (lọt kẻ giả) đối nghịch FRR (chặn khách thật); ngân hàng ưu tiên FAR thấp, đặt ngưỡng theo FAR mục tiêu + route vùng xám sang thẩm định. Liveness đo bằng APCER/BPCER.
- Ràng buộc pháp lý: sinh trắc học là dữ liệu nhạy cảm theo NĐ13 (đồng ý, mục đích, mã hoá, tối thiểu) và khung eKYC của NHNN; bảo vệ template, đo bias theo nhân khẩu, lưu vết kiểm toán.
- Build vs Buy: thường mua engine nhận diện + liveness (chuyên môn anti-spoofing) nhưng tự giữ điều phối, ngưỡng, đối chiếu nguồn và lưu trữ template để kiểm soát dữ liệu và rủi ro.
Đọc tiếp: OCR & Document AI · Phân loại & Phát hiện · Vision hiện đại · Tuân thủ CV ngân hàng · Quyền riêng tư & tuân thủ.
Bài viết liên quan
Phân biệt AI/ML/DL, các kiểu học máy, quy trình ML end-to-end và thuật ngữ nền tảng.
Chất lượng dữ liệu, xử lý thiếu/ngoại lai, mã hoá, chuẩn hoá, tạo đặc trưng và tránh data leakage.
Mô hình ngôn ngữ lớn hoạt động ra sao, token, context window, tham số sinh, và kỹ thuật viết prompt.
Retrieval-Augmented Generation, vector database, tool calling, agent và MCP để xây ứng dụng LLM thực tế.