Path: blob/master/Face-Recognition-with-ArcFace/similarity.py
3119 views
import argparse1import os2import cv23import numpy as np4from embeddings import get_embeddings567def visualize_similarity(tag, input_size=[112, 112]):8images, embeddings = get_embeddings(9data_root=f"data/{tag}_aligned",10model_root="checkpoint/backbone_ir50_ms1m_epoch120.pth",11input_size=input_size,12)1314# calculate cosine similarity matrix15cos_similarity = np.dot(embeddings, embeddings.T)16cos_similarity = cos_similarity.clip(min=0, max=1)17# plot colorful grid from pair distance values in similarity matrix18similarity_grid = plot_similarity_grid(cos_similarity, input_size)1920# pad similarity grid with images of faces21horizontal_grid = np.hstack(images)22vertical_grid = np.vstack(images)23zeros = np.zeros((*input_size, 3))24vertical_grid = np.vstack((zeros, vertical_grid))25result = np.vstack((horizontal_grid, similarity_grid))26result = np.hstack((vertical_grid, result))2728if not os.path.isdir("images"):29os.mkdir("images")3031cv2.imwrite(f"images/{tag}.jpg", result)323334def plot_similarity_grid(cos_similarity, input_size):35n = len(cos_similarity)36rows = []37for i in range(n):38row = []39for j in range(n):40# create small colorful image from value in distance matrix41value = cos_similarity[i][j]42cell = np.empty(input_size)43cell.fill(value)44cell = (cell * 255).astype(np.uint8)45# color depends on value: blue is closer to 0, green is closer to 146img = cv2.applyColorMap(cell, cv2.COLORMAP_WINTER)4748# add distance value as text centered on image49font = cv2.FONT_HERSHEY_SIMPLEX50text = f"{value:.2f}"51textsize = cv2.getTextSize(text, font, 1, 2)[0]52text_x = (img.shape[1] - textsize[0]) // 253text_y = (img.shape[0] + textsize[1]) // 254cv2.putText(55img, text, (text_x, text_y), font, 1, (255, 255, 255), 2, cv2.LINE_AA,56)57row.append(img)58rows.append(np.concatenate(row, axis=1))59grid = np.concatenate(rows)60return grid616263if __name__ == "__main__":64parser = argparse.ArgumentParser()65parser.add_argument(66"--tags",67help="specify your tags for aligned faces datasets",68default="test",69nargs='+',70required=True71)72args = parser.parse_args()73tags = args.tags7475for tag in tags:76visualize_similarity(tag)777879