Hướng dẫn tích hợp nhận diện khuôn mặt trên OpenHarmony với SeetaFace2

Với sự phát triển của công nghệ hiện đại, việc sử dụng nhận diện khuôn mặt đã trở thành một phương thức xác thực phổ biến trong đời sống hàng ngày. Công nghệ này đang được ứng dụng rộng rãi trong nhiều lĩnh vực như giao thông thông minh, nhà thông minh, văn phòng số hóa và nhiều hơn nữa. Bài viết này sẽ hướng dẫn cách tích hợp khả năng nhận diện khuôn mặt sử dụng công cụ SeetaFace2 trên hệ điều hành OpenAtom OpenHarmony (gọi tắt là "OpenHarmony").

Giới thiệu về SeetaFace2

SeetaFace2 là thư viện nhận diện khuôn mặt mã nguồn mở theo giấy phép BSD, được phát triển bởi công ty VisionThinks (Bắc Kinh). Thư viện này cung cấp ba mô-đun chính cần thiết cho hệ thống nhận diện khuôn mặt tự động: mô-đun phát hiện khuôn mặt (FaceDetector), mô-đun định vị điểm đặc trưng khuôn mặt (FaceLandmarker) và mô-đun trích xuất và so sánh đặc trưng (FaceRecognizer). Ngoài ra còn có hai mô-đun phụ trợ bao gồm FaceTracker (theo dõi khuôn mặt) và QualityAssessor (đánh giá chất lượng ảnh).

Khả năng của SeetaFace2

Được phát triển bằng C++ chuẩn, toàn bộ các mô-đun không phụ thuộc vào bất kỳ thư viện bên thứ ba nào, hỗ trợ cả kiến trúc x86 (Windows, Linux) và ARM, dễ dàng di chuyển lên OpenHarmony. Các ứng dụng hỗ trợ bao gồm kiểm soát ra vào bằng khuôn mặt, chấm công không tiếp xúc, xác thực đối chiếu khuôn mặt và nhiều ứng dụng khác.

Cơ chế hoạt động của SeetaFace2

Hệ thống nhận diện khuôn mặt SeetaFace2 bao gồm ba mô-đun cốt lõi:

  1. Mô-đun phát hiện khuôn mặt (FaceDetector): Xác định vị trí khuôn mặt trong hình ảnh, cắt và chuẩn hóa vùng chứa khuôn mặt về kích thước cố định.
  2. Mô-đun định vị điểm đặc trưng (FaceLandmarker): Trích xuất tọa độ các điểm đặc trưng trên khuôn mặt, thực hiện phép biến đổi để căn chỉnh khuôn mặt về tư thế chuẩn nhằm tăng tính ổn định khi tư thế thay đổi.
  3. Mô-đun trích xuất và so sánh đặc trưng (FaceRecognizer): Sử dụng các phương pháp học sâu để trích xuất đặc trưng khuôn mặt, sau đó tính toán mức độ tương đồng giữa các đặc trưng.

Hai bước thực hiện nhận diện khuôn mặt

Quá trình nhận diện khuôn mặt bao gồm hai giai đoạn chính: đăng ký khuôn mặt và nhận diện khuôn mặt.

1. Đăng ký khuôn mặt

Giai đoạn đầu tiên là phát hiện và trích xuất thông tin khuôn mặt từ hình ảnh đầu vào, lưu trữ thông tin này để sử dụng cho việc so sánh sau này.

Triển khai phát hiện khuôn mặt:

std::vector<DetectedFaceInfo> LocateFaces(const InputImage &img)
{
  auto detected_faces = face_detector.detect(img);
  return std::vector<DetectedFaceInfo>(detected_faces.data, detected_faces.data + detected_faces.size);
}

Trong đó face_detector là mô-đun phát hiện khuôn mặt, sử dụng mô hình phát hiện:

seeta::ModelConfig detector_config("face_detection_model.dat", seeta::ModelConfig::CPU, 0);

Dữ liệu trả về chứa thông tin về số lượng khuôn mặt, tọa độ khu vực và điểm số độ tin cậy. Sau đó sử dụng dữ liệu này để định vị các điểm đặc trưng.

Triển khai định vị điểm đặc trưng:

std::vector<FacialPoint> ExtractLandmarks(const InputImage &img, const FaceRegion ®ion)
{
  std::vector<FacialPoint> landmarks(point_detector.count());
  point_detector.process(img, region, landmarks.data());
  return std::move(landmarks);
}

point_detector là mô-đun định vị điểm đặc trưng, hỗ trợ cả mô hình 5 điểm và 81 điểm. Trong ví dụ này sử dụng mô hình 81 điểm:

seeta::ModelConfig landmark_config("landmark_81_points.dat", seeta::ModelConfig::CPU, 0);

Sau khi có dữ liệu đặc trưng, SeetaFace2 cung cấp cơ sở dữ liệu khuôn mặt để lưu trữ thông tin:

int64_t StoreFaceData(const InputImage &img)
{
  auto face_data = LocateFaces(img);
  auto landmarks = ExtractLandmarks(img, face_data.region);
 
  return face_database.AddEntry(img, landmarks.data());
}

face_database là quản lý cơ sở dữ liệu khuôn mặt. Cơ sở dữ liệu này cũng cung cấp kết quả so sánh đặc trưng, mô-đun so sánh cần sử dụng mô hình đặc trưng:

seeta::ModelConfig feature_config("feature_extraction_model.dat", seeta::ModelConfig::CPU, 0);

2. Nhận diện khuôn mặt

Quá trình nhận diện tương tự như đăng ký, cần phát hiện khuôn mặt và trích xuất đặc trưng. Tuy nhiên có thêm bước đánh giá chất lượng khuôn mặt trước khi thực hiện nhận diện:

int64_t ProcessFaceRecognition(const InputImage &img)
{
    int64_t recognition_count = 0;
  seeta::ModelConfig detector_config("face_detection_model.dat", seeta::ModelConfig::CPU, 0);
  seeta::ModelConfig landmark_config("landmark_81_points.dat", seeta::ModelConfig::CPU, 0);
  seeta::ModelConfig feature_config("feature_extraction_model.dat", seeta::ModelConfig::CPU, 0);
   
  seeta::FaceDetector face_detector(detector_config);
  seeta::FaceLandmarker point_detector(landmark_config);
  seeta::FaceDatabase face_database(feature_config);
   
  auto detected_faces = face_detector.detect(img);
    for (DetectedFaceInfo &face_info : detected_faces) {
        int64_t match_index = -1;
        float confidence_score = 0;
        std::vector<FacialPoint> landmarks(point_detector.count());
      point_detector.process(img, face_info, landmarks.data());
        auto quality_score = quality_evaluator.assess(img, face_info.region, landmarks.data());
        if (quality_score > 0) {
            auto search_result = face_database.SearchBestMatch(img, landmarks.data(), 1, &match_index, &confidence_score);
            if (search_result >= 1) {
                if (confidence_score > SIMILARITY_THRESHOLD) {
                    HILOGI("Khuôn mặt được nhận diện thanh cong! \r\n");
                    recognition_count++;
                }
            }
        }
    }
     
    return recognition_count;
}

Thẻ: openharmony seetaface2 nhan dien khuon mat AI computer vision

Đăng vào ngày 1 tháng 9 lúc 07:13