Phát hiện khuôn mặt đóng vai trò là cửa ngõ của hầu hết các quy trình thị giác máy tính. Mọi cuộc gọi video, thư viện ảnh và nguồn cấp dữ liệu an ninh đều phụ thuộc vào việc nhận diện khuôn mặt người trước khi bất kỳ điều gì khác có thể diễn ra. Tuy nhiên, việc lựa chọn mô hình thường buộc chúng ta phải đối mặt với một sự đánh đổi không mấy dễ chịu. Các mạng nơ-ron nặng mang lại độ chính xác cao nhưng đòi hỏi GPU đắt tiền và hệ thống làm mát gắn tủ rack. Các mô hình nhỏ hơn có thể chạy trên phần cứng khiêm tốn nhưng thường gặp khó khăn với các khuôn mặt nhỏ hoặc nguồn cấp dữ liệu độ phân giải cao. Mô hình YuNet từ OpenCV Zoo đã phá vỡ quy luật đó. Tôi đã dành thời gian thử nghiệm hiệu năng của nó trên các quy mô khác nhau để xem liệu nó thực sự xứng đáng có một vị trí trong các dự án thực tế hay chỉ trông đẹp đẽ trên lý thuyết.
Tại sao YuNet xứng đáng được xem xét kỹ lưỡng
YuNet không phải là một sản phẩm nghiên cứu thuần túy. Nó nằm trong OpenCV Zoo, một bộ sưu tập các mô hình đã được huấn luyện sẵn và được tối ưu hóa cho mô-đun OpenCV DNN. Biến thể cụ thể mà tôi đã thử nghiệm sử dụng lượng tử hóa INT8, có nghĩa là các trọng số (weights) và giá trị kích hoạt (activations) của nó được nén xuống thành các số nguyên 8-bit thay vì các số thực dấu phẩy động 32-bit thông thường. Đây không phải là một chi tiết kỹ thuật nhỏ nhặt. INT8 giúp cắt giảm băng thông bộ nhớ, giảm áp lực lên bộ nhớ đệm (cache) và cho phép các CPU hiện đại thực hiện suy luận một cách mượt mà mà không tốn quá nhiều sức. Đối với bất kỳ ai đang xây dựng ứng dụng trên laptop, thiết bị biên (edge device) hoặc một máy chủ không có card đồ họa chuyên dụng, hiệu suất này chính là sự khác biệt giữa một quy trình mượt mà và một chuỗi hình ảnh giật lag.
Bản thân kiến trúc này được thiết kế rất nhẹ nhàng. Nó loại bỏ sự cồng kềnh của các kiến trúc xương sống (backbones) khổng lồ và tập trung vào nhiệm vụ duy nhất là định vị khuôn mặt. Sự kỷ luật đó sẽ mang lại hiệu quả khi bạn cần tích hợp việc phát hiện vào một ứng dụng lớn hơn, nơi tài nguyên CPU và pin phải chia sẻ với các tác vụ theo dõi (tracking), nhận dạng (recognition) hoặc mã hóa video.
Thiết lập thử nghiệm
Tất cả các bài kiểm tra đều được thực hiện trên một chiếc Mac Studio với chip Apple M4 Max. Tệp mô hình được sử dụng là bản build YuNet INT8 quantized ONNX từ kho lưu trữ OpenCV Zoo. Đầu tiên, tôi đo tốc độ suy luận trên hình ảnh 1280x720, sau đó so sánh số lượng khuôn mặt được phát hiện qua bốn độ phân giải đầu vào khác nhau để hiểu rõ quy mô ảnh ảnh hưởng đến kết quả như thế nào.
Nếu bạn muốn tự xác minh các con số này trên máy của mình, quy trình này hoàn toàn có thể tái lập được. Hãy chạy các lệnh sau để tải kho lưu trữ thưa (sparse repository) và thực hiện bài kiểm tra hiệu năng:
git clone --depth 1 --filter=blob:none --sparse https://github.com/kiarina/labs.git
cd labs
git sparse-checkout set .gitignore .mise/tasks Makefile mise.toml 2026/07/08/yunet-face-detection
mise -C 2026/07/08/yunet-face-detection run
Việc sử dụng sparse checkout giúp giữ cho dung lượng tải xuống nhỏ, và trình chạy tác vụ mise sẽ xử lý các phụ thuộc (dependencies) một cách tự động. Bạn không cần phải vật lộn với các môi trường Python hay cài đặt gói thủ công.
Tốc độ duy trì sự ổn định
Trên hình ảnh 1280x720, mô hình YuNet INT8 đạt tốc độ trung bình 9,21 mili giây cho mỗi lần suy luận. Lần chạy nhanh nhất đạt 8,03 ms, trong khi lần chậm nhất là 10,47 ms. Đó là một khoảng dao động cực kỳ hẹp. Chênh lệch giữa thời gian tốt nhất và tệ nhất chưa đến hai mili giây rưỡi.
Trong thực tế, sự nhất quán này quan trọng hơn cả những con số để phô trương. Các ứng dụng thời gian thực không chỉ cần độ trễ trung bình thấp; chúng cần độ trễ có thể dự đoán được. Một mô hình đôi khi mất tới 50 ms sẽ tạo ra sự giật lag rõ rệt trên nguồn cấp webcam. YuNet duy trì sự ổn định. Bạn có thể tin tưởng rằng nó sẽ xử lý xong một khung hình trước khi khung hình tiếp theo đến, giúp việc lập lịch cho phần còn lại của quy trình trở nên đơn giản hơn nhiều.
Sự biến thiên quy mô tiết lộ câu chuyện thực sự
Tốc độ thô chẳng có ý nghĩa gì nếu mô hình bỏ lỡ một nửa số khuôn mặt trong cảnh. Để kiểm tra điều này, tôi đã đưa cùng một nguồn hình ảnh qua YuNet ở bốn độ phân giải khác nhau. Các con số đã kể một câu chuyện rõ ràng:
- 320 x 180: phát hiện 6 khuôn mặt
- 640 x 360: phát hiện 26 khuôn mặt
- 1280 x 720: phát hiện 38 khuôn mặt
- 2560 x 1440: phát hiện 52 khuôn mặt
Sự nhảy vọt này thật đáng kinh ngạc. Ở độ phân giải 320 x 180, chỉ có những khuôn mặt lớn nhất và gần nhất mới được ghi nhận. Khi tăng lên 640 x 360, số lượng tăng gấp bốn lần. Ở độ phân giải full 1440p, YuNet tìm thấy số lượng khuôn mặt nhiều hơn gấp tám lần so với ở độ phân giải thấp nhất.
Điều này xảy ra vì quá trình hạ mẫu (downsampling) phá hủy các chi tiết nhanh hơn những gì chúng ta tưởng tượng. Một khuôn mặt chiếm một vùng vừa phải trong khung hình 1440p có thể bị thu nhỏ thành một vệt mờ chỉ 5x5 pixel ở độ phân giải 360p. Một khi các đặc điểm khuôn mặt bị thu nhỏ xuống dưới trường thụ cảm (receptive field) của mô hình, chúng sẽ trở thành những nhiễu vô hình. Mắt hòa lẫn vào lông mày. Mũi biến mất. YuNet không còn điểm tựa nào để bám vào.
Kết luận thực tế này rất đáng để ghi nhớ. Nếu camera của bạn chụp góc rộng một lớp học, phòng họp hoặc một góc phố, các khuôn mặt ở xa sẽ không xuất hiện trừ khi bạn cung cấp cho mô hình đủ số lượng pixel. Ở đây, độ phân giải không chỉ là về chất lượng hình ảnh. Nó là một đòn bẩy trực tiếp đối với độ triệu hồi (recall).
Chiến lược thay đổi kích thước (Resize) mà bạn thực sự cần
YuNet đủ nhanh đến mức bạn không cần phải ép độ phân giải đầu vào xuống 320 x 240 theo thói quen. Trên chip M4 Max, ngay cả độ phân giải 2560 x 1440 vẫn chạy được mà không cần GPU chuyên dụng. Điều này thay đổi cách bạn nên thiết kế một pipeline.
Thay vì ép mọi khung hình qua một kích thước cố định nhỏ xíu, hãy chọn độ phân giải đầu vào dựa trên những gì bạn đang cố gắng tìm kiếm. Nếu bạn chỉ quan tâm đến người đứng ngay trước camera, 720p hoặc thậm chí 640p là đã đủ. Nếu bạn cần lập danh sách mọi người tham dự trong một hội trường lớn, hãy cung cấp cho mô hình một vùng cắt (crop) có độ phân giải cao hơn hoặc toàn bộ khung hình gốc. Vì YuNet rất nhẹ, bạn có dư địa để đưa ra lựa chọn đó. Bạn không bị bó buộc vào một thiết lập sẵn duy nhất chỉ để tránh độ trễ 200 ms.
Tuy nhiên, vẫn có một lưu ý. Mô hình vẫn phụ thuộc vào kích thước khuôn mặt so với tensor đầu vào. Ở đây không có sự bất biến về tỷ lệ (scale invariance) một cách thần kỳ. Những khuôn mặt nhỏ sẽ vẫn không thể nhận diện được trừ khi chúng chiếm đủ số lượng pixel. Cách khắc phục rất đơn giản: hãy phóng to ảnh nguồn trước khi thực hiện suy luận (inference) khi tìm kiếm các đối tượng ở xa, sau đó ánh xạ các khung bao (bounding boxes) kết quả trở lại tọa độ gốc. YuNet cung cấp cho bạn dư địa về tốc độ để thực hiện bước đó.
Vị trí của nó trong Stack của bạn
YuNet không phải là giải pháp cho mọi tác vụ khuôn mặt có thể hình dung được. Việc bị che khuất nặng, góc nghiêng cực đoan hoặc trích xuất lưới 3D (3D mesh extraction) nằm ngoài phạm vi của nó. Nhưng đối với những công việc cơ bản như định vị khuôn mặt trong ảnh và luồng video, nó nằm ở một điểm lý tưởng. Các ứng dụng webcam thời gian thực, công cụ lọc ảnh tự động và các hệ thống nhúng khiêm tốn đều được hưởng lợi từ một bộ dò chạy nhanh trên các CPU tiêu chuẩn.
Định dạng INT8 ONNX cũng giúp việc triển khai trở nên dễ dàng. Bạn không cần cài đặt PyTorch hay TensorFlow trên thiết bị mục tiêu. Module DNN của OpenCV tải mô hình trực tiếp, giúp tệp thực thi (binary) của bạn nhỏ gọn và cây phụ thuộc (dependency tree) không quá phức tạp.
Điểm mấu chốt
YuNet chứng minh rằng phát hiện khuôn mặt không đòi hỏi phần cứng công nghiệp hay các framework cồng kềnh. Các con số đã nói lên tất cả: dưới mười mili giây cho một khung hình 720p, và số lượng phát hiện tăng lên một cách trực tiếp, có thể dự đoán được khi độ phân giải tăng lên. Bạn có quyền lựa chọn giữa tốc độ tối đa ở độ phân giải trung bình hoặc phạm vi bao phủ rộng hơn ở quy mô cao hơn, và mô hình sẽ không làm bạn phải trả giá cho lựa chọn đó.
Nếu bạn đang xây dựng bất cứ thứ gì liên quan đến hình ảnh thực tế, hãy chạy các bước tái lập ở trên trên phần cứng của chính bạn. Hãy thử nghiệm nó với các cảnh quay của bạn. Sau đó, tinh chỉnh logic thay đổi kích thước để khớp với những khuôn mặt mà bạn thực sự cần tìm. Tốc độ chỉ hữu ích khi bạn có thể điều hướng nó. YuNet mang lại cho bạn cả vận tốc lẫn khả năng kiểm soát.
