| --- |
| tags: |
| - Face Image Quality Assessment |
| - ediffiqa |
| - Quality Assessment |
| - Face Recognition |
| - onnx |
| - onnxslim |
| --- |
| |
| # eDifFIQA ONNX |
|
|
| ONNX exports of the [eDifFIQA](https://github.com/LSIbabnikz/eDifFIQA) face image quality models. |
|
|
| These models estimate the visual quality of a face image. They can be used before face recognition or face verification to filter low-quality face crops. |
|
|
| > [!NOTE] |
| > Note: The models expect cropped/aligned face images. |
|
|
| ## Export Details |
|
|
| Models were exported with `torch==2.10.0` and simplified with `onnxslim==0.1.93`. All models were exported with dynamic batch size support and ONNX opset 20. |
|
|
| ## Available Models |
|
|
| | Variant | File | Size | |
| |------------|-------------------|--------| |
| | eDifFIQA-T | `ediffiqa_t.onnx` | tiny | |
| | eDifFIQA-S | `ediffiqa_s.onnx` | small | |
| | eDifFIQA-M | `ediffiqa_m.onnx` | medium | |
| | eDifFIQA-L | `ediffiqa_l.onnx` | large | |
|
|
| ## Usage |
|
|
| ```python |
| from pathlib import Path |
| |
| import cv2 |
| import numpy as np |
| import onnxruntime as ort |
| |
| |
| class EDifFIQAOnnx: |
| |
| def __init__( |
| self, |
| model_path: Path | str, |
| input_size: tuple[int, int] = (112, 112), |
| providers: list[str] | None = None, |
| ) -> None: |
| self.model_path = str(model_path) |
| self.input_size = input_size |
| |
| self.session = ort.InferenceSession( |
| self.model_path, |
| providers=providers or ["CPUExecutionProvider"], |
| ) |
| |
| self.input_name = self.session.get_inputs()[0].name |
| self.output_name = self.session.get_outputs()[0].name |
| |
| def infer(self, image_bgr: np.ndarray) -> float: |
| """ |
| Run quality inference on a BGR-aligned face image. |
| |
| :param image_bgr: BGR face image. |
| :return: Quality score. |
| """ |
| tensor = self._preprocess(image_bgr) |
| output = self.session.run([self.output_name], {self.input_name: tensor})[0] |
| return float(np.squeeze(output)) |
| |
| def _preprocess(self, image_bgr: np.ndarray) -> np.ndarray: |
| """ |
| Preprocess image. |
| |
| :param image_bgr: BGR image. |
| :return: Input tensor with shape (1, 3, 112, 112). |
| """ |
| image_rgb = cv2.cvtColor(image_bgr, cv2.COLOR_BGR2RGB) |
| image_rgb = cv2.resize(image_rgb, self.input_size) |
| |
| image = image_rgb.astype(np.float32) |
| image = ((image / 255.0) - 0.5) / 0.5 |
| image = np.transpose(image, (2, 0, 1))[None, ...] |
| |
| return image.astype(np.float32) |
| ``` |