Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
hackassin
GitHub Repository: hackassin/learnopencv
Path: blob/master/Face-Recognition-with-ArcFace/similarity.py
3119 views
1
import argparse
2
import os
3
import cv2
4
import numpy as np
5
from embeddings import get_embeddings
6
7
8
def visualize_similarity(tag, input_size=[112, 112]):
9
images, embeddings = get_embeddings(
10
data_root=f"data/{tag}_aligned",
11
model_root="checkpoint/backbone_ir50_ms1m_epoch120.pth",
12
input_size=input_size,
13
)
14
15
# calculate cosine similarity matrix
16
cos_similarity = np.dot(embeddings, embeddings.T)
17
cos_similarity = cos_similarity.clip(min=0, max=1)
18
# plot colorful grid from pair distance values in similarity matrix
19
similarity_grid = plot_similarity_grid(cos_similarity, input_size)
20
21
# pad similarity grid with images of faces
22
horizontal_grid = np.hstack(images)
23
vertical_grid = np.vstack(images)
24
zeros = np.zeros((*input_size, 3))
25
vertical_grid = np.vstack((zeros, vertical_grid))
26
result = np.vstack((horizontal_grid, similarity_grid))
27
result = np.hstack((vertical_grid, result))
28
29
if not os.path.isdir("images"):
30
os.mkdir("images")
31
32
cv2.imwrite(f"images/{tag}.jpg", result)
33
34
35
def plot_similarity_grid(cos_similarity, input_size):
36
n = len(cos_similarity)
37
rows = []
38
for i in range(n):
39
row = []
40
for j in range(n):
41
# create small colorful image from value in distance matrix
42
value = cos_similarity[i][j]
43
cell = np.empty(input_size)
44
cell.fill(value)
45
cell = (cell * 255).astype(np.uint8)
46
# color depends on value: blue is closer to 0, green is closer to 1
47
img = cv2.applyColorMap(cell, cv2.COLORMAP_WINTER)
48
49
# add distance value as text centered on image
50
font = cv2.FONT_HERSHEY_SIMPLEX
51
text = f"{value:.2f}"
52
textsize = cv2.getTextSize(text, font, 1, 2)[0]
53
text_x = (img.shape[1] - textsize[0]) // 2
54
text_y = (img.shape[0] + textsize[1]) // 2
55
cv2.putText(
56
img, text, (text_x, text_y), font, 1, (255, 255, 255), 2, cv2.LINE_AA,
57
)
58
row.append(img)
59
rows.append(np.concatenate(row, axis=1))
60
grid = np.concatenate(rows)
61
return grid
62
63
64
if __name__ == "__main__":
65
parser = argparse.ArgumentParser()
66
parser.add_argument(
67
"--tags",
68
help="specify your tags for aligned faces datasets",
69
default="test",
70
nargs='+',
71
required=True
72
)
73
args = parser.parse_args()
74
tags = args.tags
75
76
for tag in tags:
77
visualize_similarity(tag)
78
79