Nhận diện khuôn mặt bằng InsightFace

Giới thiệu InsightFace

InsightFace là một dự án mã nguồn mở mạnh mẽ dành cho các tác vụ liên quan đến nhận diện khuôn mặt (Face Recognition), phát hiện khuôn mặt (Face Detection) và căn chỉnh khuôn mặt (Face Alignment). Dự án này được phát triển dựa trên các mô hình học sâu tối ưu, đặc biệt là ArcFace – một trong những phương pháp tiên tiến nhất trong nhận diện khuôn mặt.

Lý do chọn InsightFace:

  • Được đánh giá cao bởi người dùng trên GitHub (hiện là 24k star)
  • Độ chính xác cao
  • Hỗ trợ phát hiện và căn chỉnh khuôn mặt mạnh mẽ
  • Khả năng mở rộng và dễ triển khai

Cài đặt InsightFace:

Giới thiệu Face Embedding trong InsightFace

Face Embedding là một vector số có độ dài cố định (thường là 512-D) được trích xuất từ khuôn mặt. Nó giúp biểu diễn khuôn mặt dưới dạng đặc trưng số hóa, giúp so sánh và nhận diện khuôn mặt một cách hiệu quả. Trong InsightFace, Face Embedding được tạo bởi mô hình ArcFace, một phương pháp tiên tiến giúp tăng độ chính xác bằng cách tối ưu hóa khoảng cách giữa các khuôn mặt khác nhau.


Trích xuất embedding khuôn mặt bằng InsightFace:

So sánh giữa landmark và embedding

Demo nhận diện khuôn mặt bằng InsightFace

Mục tiêu

Demo này thực hiện nhận diện khuôn mặt từ các ảnh trích xuất từ video, sử dụng thư viện InsightFace để phát hiện và so sánh khuôn mặt. Mỗi khuôn mặt được lưu trữ trong dataset theo danh tính dựa trên độ tương đồng của embedding.
Kết quả sau khi chạy demo thu được sẽ là:

  • Mỗi người trong dataset có một thư mục riêng (P0001, P0002, …).
  • Mỗi thư mục (P0001, P0002, …) chứa từ 20 ảnh mẫu trở lên, các file embedding *.bin tương ứng của ảnh (mục đích của việc lưu của việc lưu ảnh cùng với một file embedding tương ứng của ảnh đó là để khi duyệt qua folder chúng ta không cần trích xuất embedding của ảnh một lần nữa) .
  • Trong mỗi thư mục của mỗi người có 1 folder appear/ ghi nhận tất cả lần xuất hiện của khuôn mặt. Mỗi lượt được phát hiện sẽ được lưu vào appear/ Tên file ảnh chứa thời gian phát hiện khuôn mặt + chuỗi 5 ký tự ngẫu nhiên để tránh trùng lặp. Mục đích là để theo dõi thời gian và tuần suất xuất hiện của từng người.

Chuẩn bị

Sử dụng Python 3.6 trở lên trên Windows 10 hoặc Ubuntu 18.04 (OS khác chưa test)

Dataset

Dataset được sử dụng trong bài demo này bao gồm các frame hình ảnh trích xuất từ một tập của chương trình truyền hình thực tế “Ơn Giời Cậu Đây Rồi” – một chương trình hài tình huống nổi tiếng của VTV.


Lợi ích của dataset này:

  • Môi trường thực tế với nhiều điều kiện khác nhau.
  • Chứa nhiều người, giúp kiểm tra khả năng phân biệt khuôn mặt.
  • Có thể áp dụng vào các bài toán nhận diện khuôn mặt trong video.

Quy trình xử lý

  1. Khởi tạo mô hình InsightFace: Sử dụng mô hình buffalo_l để phát hiện và trích xuất embedding khuôn mặt.
  2. Duyệt qua tất cả ảnh trong thư mục input_folder:
    • Bỏ qua file không phải ảnh.
    • Đọc ảnh, phát hiện khuôn mặt, trích xuất bounding box và embedding.
  3. Kiểm tra xem khuôn mặt đã tồn tại trong dataset chưa:
    • Duyệt qua tất cả thư mục trong dataset.
    • So sánh embedding mới với embedding đã lưu bằng cosine similarity (khoảng cách cosine giữa 2 vector).
    • Nếu similarity > 0.6, gán vào thư mục tương ứng, nếu nhỏ hơn thì xem đây là người mới và tạo thư mục
  4. Lưu ảnh và embedding:
    • Nếu số ảnh trong thư mục chưa vượt quá 20, lưu khuôn mặt mới.
    • Luôn lưu khuôn mặt vào thư mục appear/ để ghi nhận lần xuất hiện.

Code demo

Đánh giá kết quả

InsightFace xử lý nhanh và tối ưu, giúp nhận diện khuôn mặt trong thời gian ngắn. Hầu như nhận diện được tất cả khuôn mặt xuất hiện trong ảnh, chỉ bỏ sót những khuôn mặt với điều kiện chiếu sáng quá tối. Việc so sánh khuôn mặt dựa vào embedding trích xuất bằng InsightFace cũng đạt hiệu quả cao đối với những khuôn mặt chính diện hoặc có góc nhìn gần chính diện.

Ứng dụng

  • Nhận diện người xuất hiện nhiều lần trong video.
  • Xây dựng hệ thống theo dõi danh tính trong chuỗi video.
  • Có thể mở rộng để nhận diện trong thời gian thực.

Leave a Reply