facenet512-imx / evaluate.py
NXP
Release 2.0
93aff39
Raw
History Blame Contribute Delete
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()