|
import numpy as np |
|
from numpy.linalg import norm |
|
import torch |
|
from IPython.display import display |
|
import cv2 |
|
|
|
url1='http://farm3.staticflickr.com/2519/4126738647_cc436c111b_z.jpg' |
|
cap1='A motorcycle sits parked across from a herd of livestock' |
|
|
|
url2='http://farm3.staticflickr.com/2046/2003879022_1b4b466d1d_z.jpg' |
|
cap2='Motorcycle on platform to be worked on in garage' |
|
|
|
url3='https://i.natgeofe.com/n/548467d8-c5f1-4551-9f58-6817a8d2c45e/NationalGeographic_2572187_3x2.jpg' |
|
cap3='a cat laying down stretched out near a laptop' |
|
|
|
img1 = { |
|
'flickr_url': url1, |
|
'caption': cap1, |
|
'image_path' : './shared_data/motorcycle_1.jpg', |
|
'tensor_path' : './shared_data/motorcycle_1' |
|
} |
|
|
|
img2 = { |
|
'flickr_url': url2, |
|
'caption': cap2, |
|
'image_path' : './shared_data/motorcycle_2.jpg', |
|
'tensor_path' : './shared_data/motorcycle_2' |
|
} |
|
|
|
img3 = { |
|
'flickr_url' : url3, |
|
'caption': cap3, |
|
'image_path' : './shared_data/cat_1.jpg', |
|
'tensor_path' : './shared_data/cat_1' |
|
} |
|
|
|
def load_tensor(path): |
|
return torch.load(path) |
|
|
|
def load_embeddings(): |
|
ex1_embed = load_tensor(img1['tensor_path'] + '.pt') |
|
ex2_embed = load_tensor(img2['tensor_path'] + '.pt') |
|
ex3_embed = load_tensor(img3['tensor_path'] + '.pt') |
|
return ex1_embed.data.numpy(), ex2_embed.data.numpy(), ex3_embed.data.numpy() |
|
|
|
def cosine_similarity(vec1, vec2): |
|
similarity = np.dot(vec1,vec2)/(norm(vec1)*norm(vec2)) |
|
return similarity |
|
|
|
def calculate_cosine_distance(): |
|
ex1_embed, ex2_embed, ex3_embed = load_embeddings() |
|
similarity1 = cosine_similarity(ex1_embed, ex2_embed) |
|
similarity2 = cosine_similarity(ex1_embed, ex3_embed) |
|
similarity3 = cosine_similarity(ex2_embed, ex3_embed) |
|
return [similarity1, similarity2, similarity3] |
|
|
|
def calcuate_euclidean_distance(): |
|
ex1_embed, ex2_embed, ex3_embed = load_embeddings() |
|
distance1 = cv2.norm(ex1_embed,ex2_embed, cv2.NORM_L2) |
|
distance2 = cv2.norm(ex1_embed,ex3_embed, cv2.NORM_L2) |
|
distance3 = cv2.norm(ex2_embed,ex3_embed, cv2.NORM_L2) |
|
return [distance1, distance2, distance3] |
|
|
|
def show_cosine_distance(): |
|
distances = calculate_cosine_distance() |
|
print("Cosine similarity between ex1_embeded and ex2_embeded is:") |
|
display(distances[0]) |
|
print("Cosine similarity between ex1_embeded and ex3_embeded is:") |
|
display(distances[1]) |
|
print("Cosine similarity between ex2_embeded and ex2_embeded is:") |
|
display(distances[2]) |
|
|
|
def show_euclidean_distance(): |
|
distances = calcuate_euclidean_distance() |
|
print("Euclidean distance between ex1_embeded and ex2_embeded is:") |
|
display(distances[0]) |
|
print("Euclidean distance between ex1_embeded and ex3_embeded is:") |
|
display(distances[1]) |
|
print("Euclidean distance between ex2_embeded and ex2_embeded is:") |
|
display(distances[2]) |
|
|
|
show_cosine_distance() |
|
show_euclidean_distance() |