Download evaluate.py from nxp/facenet512-imx: direct link, hf CLI and curl.
- Browser
- Download file 3.44 kB
-
https://huggingface.co/nxp/facenet512-imx/resolve/main/evaluate.py
- Command line
-
hf download hf://nxp/facenet512-imx/evaluate.py
-
curl -L -o evaluate.py https://huggingface.co/nxp/facenet512-imx/resolve/main/evaluate.py
3.44 kB
| #!/usr/bin/env python3 | |
| # Copyright 2022-2024,2026 NXP | |
| # SPDX-License-Identifier: MIT | |
| import argparse | |
| import os | |
| import numpy as np | |
| from glob import glob | |
| import tqdm | |
| try: | |
| import tflite_runtime.interpreter as tflite | |
| except ImportError: | |
| import tensorflow as tf | |
| tflite = tf.lite | |
| import cv2 | |
| THRESHOLD = 0.6 | |
| # Download and extract https://vis-www.cs.umass.edu/lfw/lfw-deepfunneled.tgz | |
| LFW_DIR = "lfw-deepfunneled" | |
| # Download https://vis-www.cs.umass.edu/lfw/pairsDevTest.txt | |
| LFW_PAIRS_FILE = "pairsDevTest.txt" | |
| def cosine_similarity(a, b): | |
| return 1 - np.dot(a, b) / (np.linalg.norm(a) * np.linalg.norm(b)) | |
| def load_img(filename): | |
| img = cv2.imread(filename, 1) | |
| img = img[45:-45, 45:-45] | |
| img = np.array(img, dtype=np.uint8) | |
| return img[None, ...] | |
| def main(): | |
| parser = argparse.ArgumentParser(description="Evaluate FaceNet512 on LFW pairsDevTest") | |
| parser.add_argument('-m', '--model', | |
| default='original_model/facenet512_uint8_float32.tflite', | |
| help='Path to the TFLite model file') | |
| args = parser.parse_args() | |
| interpreter = tflite.Interpreter(model_path=args.model) | |
| interpreter.allocate_tensors() | |
| input_details = interpreter.get_input_details() | |
| output_details = interpreter.get_output_details() | |
| with open(LFW_PAIRS_FILE, 'r') as f: | |
| pairs = f.readlines()[1:] | |
| pairs = [p.strip().split("\t") for p in pairs] | |
| image_filenames = set() | |
| for line in pairs[:500]: | |
| image_filenames.add(os.sep.join([LFW_DIR, line[0], | |
| f"{line[0]}_{int(line[1]):04d}.jpg"])) | |
| image_filenames.add(os.sep.join([LFW_DIR, line[0], | |
| f"{line[0]}_{int(line[2]):04d}.jpg"])) | |
| for line in pairs[500:]: | |
| image_filenames.add(os.sep.join([LFW_DIR, line[0], | |
| f"{line[0]}_{int(line[1]):04d}.jpg"])) | |
| image_filenames.add(os.sep.join([LFW_DIR, line[2], | |
| f"{line[2]}_{int(line[3]):04d}.jpg"])) | |
| feature_vectors = dict() | |
| for f in tqdm.tqdm(image_filenames, desc="Running inferences"): | |
| img = load_img(f) | |
| interpreter.set_tensor(input_details[0]['index'], img) | |
| interpreter.invoke() | |
| out = interpreter.get_tensor(output_details[0]['index']) | |
| # Dequantize if needed | |
| if output_details[0]['dtype'] == np.uint8: | |
| scale, zero_point = output_details[0]['quantization'] | |
| out = (out.astype(np.float32) - zero_point) * scale | |
| feature_vectors[f] = out[0] | |
| n_correct = 0 | |
| # Evaluate same person pairs | |
| for line in pairs[:500]: | |
| f1 = os.sep.join([LFW_DIR, line[0], f"{line[0]}_{int(line[1]):04d}.jpg"]) | |
| f2 = os.sep.join([LFW_DIR, line[0], f"{line[0]}_{int(line[2]):04d}.jpg"]) | |
| result = cosine_similarity(feature_vectors[f1], feature_vectors[f2]) | |
| n_correct += 1 if result < THRESHOLD else 0 | |
| # Evaluate different person pairs | |
| for line in pairs[500:]: | |
| f1 = os.sep.join([LFW_DIR, line[0], f"{line[0]}_{int(line[1]):04d}.jpg"]) | |
| f2 = os.sep.join([LFW_DIR, line[2], f"{line[2]}_{int(line[3]):04d}.jpg"]) | |
| result = cosine_similarity(feature_vectors[f1], feature_vectors[f2]) | |
| n_correct += 1 if result > THRESHOLD else 0 | |
| print(f"Quantized model accuracy: {n_correct / 1000.0:.1%}") | |
| if __name__ == '__main__': | |
| main() | |