Exercise 2: Photo Sorting Application 📸

Exercise 2: Photo Sorting Application 📸#

In this exercise, we want to use a model for classifying photos in the exercise2_images folder.

Assume the photos are not tagged/labeled, andd you cannot use labeled data.

First, let’s load the model and print some images.

import glob
image_paths = sorted(glob.glob('exercise2_images/*'))
len(image_paths)
47
# display grid of images
import matplotlib.pyplot as plt

fig, axes = plt.subplots(6,6, figsize=(10, 10))
for i, ax in enumerate(axes.flat):
    ax.imshow(plt.imread(image_paths[i]))
    ax.axis('off')
../_images/3dd394526243a2eeb7e764e95ea6312bc235984cff5c161271940915ae42d4c3.png

a) First, we want to classify the images into three groups:

  • Photos of roses.

  • Photos of sunflowers.

  • Photos of other things.

For each of the photos, compute its vector representation into a matrix. After that, print each photo, and its corresponding classification into the three groups.

import torch
import clip
from PIL import Image

device = "cuda" if torch.cuda.is_available() else "cpu"
model, preprocess = clip.load("ViT-B/32", device=device)
image_embeddings = []

for image_path in image_paths:
    image = preprocess(Image.open(image_path)).unsqueeze(0).to(device)
    
    with torch.no_grad():
        image_features = model.encode_image(image)
        image_features /= image_features.norm(dim=-1, keepdim=True)

    image_embeddings.append(image_features)

image_embeddings = torch.cat(image_embeddings)
image_embeddings.shape
torch.Size([47, 512])
labels = ['A photo of a rose', "A photo of a sunflower", "A photo"]

text = clip.tokenize(labels).to(device)

with torch.no_grad():
    text_features = model.encode_text(text)
    text_features /= text_features.norm(dim=-1, keepdim=True)

text_features.shape
torch.Size([3, 512])
similarities = (100.0 * image_embeddings @ text_features.T).softmax(dim=-1)
for i, image_path in enumerate(image_paths):
    image = Image.open(image_path)
    plt.imshow(image)
    plt.axis('off')
    plt.show()
    print("Similarity scores:")
    for l, label in enumerate(labels):
        print(f"{label}: {similarities[i, l]:.2f}")
../_images/74d02a60602521f6b78a80cd6b8a070c6c35cb8117c374aef74cd5d97c794417.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/729931f1780c6a59e12b9c8442c67b9af8813f288927afc4b49544572627bb05.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/3ca811c9eb9f1e804831ff1eb1d280d6ece25ba9de5f24a30f1e6633cbc2687d.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/428adaa007ad4ead87886a17bee04932c9a4c776a9d90d94ddde01d4eff8ee0e.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/dad5699726b3dcdfd2b10f4aa77e02d2a89e7f38a457de63c65636e77cf4c13b.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/e694fb71f861c76350e5ca3338790680c236f2ed9ed5af5bbfe1ab43678411fd.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/482a4368fd41b0a7408b920c8fabd378fdfb17974a61e946d26d053536f01aed.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/03b53708693d154fd578fe01c6896e345faf44e9f89219eb5a0638a1ab562f92.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/c4e46920dc28f41201d362bfc3f0e2cd6f6f09342baa64b0e2d54d1feec3500d.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/a8177aa2c6830831810d679a745388fd574ba136d1ddaf44021c649347765517.png
Similarity scores:
A photo of a rose: 0.02
A photo of a sunflower: 0.02
A photo: 0.96
../_images/e644cc7d66ad353687833ae7618e8ff1b60017a5146259a59149c2913eb90850.png
Similarity scores:
A photo of a rose: 0.01
A photo of a sunflower: 0.01
A photo: 0.98
../_images/c5426cf2ba61293ff42fcde508ac37cfe16c4042c33c351b595e10c82379e766.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/11d36166e9832f82219d222e675760e1c23296436b607d02079a5869ed8d3d62.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/768d8c6ffbd7f1b73188fa51dc860436efc5064ca478996efbe89e967b2b1933.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/211d43eafff5914e9fb4dc387a47a063480698081052a5ccfe52c29ff71b861d.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/ffea8c706bb4a447c2965f76a76fa00601d9d42d21736e2aaf141936136501bd.png
Similarity scores:
A photo of a rose: 0.99
A photo of a sunflower: 0.00
A photo: 0.01
../_images/15ffc1b1986b865bfbea4314510c24a593357be58e23622f73ced88819d057b2.png
Similarity scores:
A photo of a rose: 0.95
A photo of a sunflower: 0.01
A photo: 0.04
../_images/dca79163115597fdd0d950e48ea2dffcc64c5ece13d1bb178f0b61e121c5be8d.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/7de7ae29bc7f7edff4118dc781227fca75ca49cfc06cd655738d9b181e322c37.png
Similarity scores:
A photo of a rose: 0.99
A photo of a sunflower: 0.00
A photo: 0.01
../_images/9d65e633772be1f445843d9a50ba21e6bdb325b3f74037494dfc987cdd13ad78.png
Similarity scores:
A photo of a rose: 0.04
A photo of a sunflower: 0.01
A photo: 0.95
../_images/a417b3e974573edb8c16e5aa3bc8b7aeea0641889a0f452e9ea8cd23473944a8.png
Similarity scores:
A photo of a rose: 0.01
A photo of a sunflower: 0.01
A photo: 0.99
../_images/3d4489a929e389c80cd5372be379aa6817ea80d1adcb0a66b62d7c8b328af1ad.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/8103367fe04a6e1a094c52967bd855f824563332b0f0fdb3257f828b5a9519d1.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/9e59d35925f505029b68ee58e4f19ee47abb62fe64c8d6a0a64f20c23c581dce.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/f25a0e6f30097c2d5631b196aaf8b48bf8c7b972a273c75064ca1ef728325c39.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/5d6f7b3cc8b976b721715b8de41d2ae982e7202397faad17eec90c423b9688e7.png
Similarity scores:
A photo of a rose: 0.99
A photo of a sunflower: 0.00
A photo: 0.01
../_images/755a9748363198fd8fe5f8a7cbe6cf30c4d5f55b6816da2cf5c62f21c255bc82.png
Similarity scores:
A photo of a rose: 0.98
A photo of a sunflower: 0.00
A photo: 0.02
../_images/a5c5fe13ffda5144281af3ca8fd55ab7313a40e7af4647a27a068b5e64713cec.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 0.99
A photo: 0.01
../_images/b6f3c337663be23a7aac9062518e8705afdb18f62cb47a7079f67cf05cb87a95.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/6aafa4d7f35d4d4d46d945b2b37a6a78c8df5a7bf3be43c29b2aacad05c5997e.png
Similarity scores:
A photo of a rose: 0.04
A photo of a sunflower: 0.05
A photo: 0.91
../_images/fb35a8e2783970e27cc2c8a2f1798c2b50fdd70f0142556206872f7004eb2ce0.png
Similarity scores:
A photo of a rose: 0.97
A photo of a sunflower: 0.00
A photo: 0.03
../_images/2c6fb7d1fe27ab703cd4d4c89a72b5907e967ab386dab75b6ff9f168cafadd48.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/ed0f72db3ec1ab6377741754b1dad35f43b2d3bcb90b70d1a6b9baa816985937.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/2323c451fc505c24431e59c028e5f46bea500323635c6f04be4c3cc2ef3b4d43.png
Similarity scores:
A photo of a rose: 0.96
A photo of a sunflower: 0.00
A photo: 0.04
../_images/448c6716784cd6cdb01dcd35b9f373454129309e7332a562032f07b3a9cbac28.png
Similarity scores:
A photo of a rose: 0.91
A photo of a sunflower: 0.00
A photo: 0.09
../_images/8871ebe1cf9dcdc998fe78ee47e91eea3d3c6ada655fba2c64aad92bfc98c63e.png
Similarity scores:
A photo of a rose: 0.01
A photo of a sunflower: 0.01
A photo: 0.98
../_images/cecc0fe972aa77ef21139b20243d757b064bd7e8da71f7586f93a1c0d8c933e0.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/78f82997dae900d01dd36a7efb76cc72f8c43580377e5a6a0aac517478b0c093.png
Similarity scores:
A photo of a rose: 1.00
A photo of a sunflower: 0.00
A photo: 0.00
../_images/aeceb8967671599d677badf862f7cc8edc882cb17ca40381b9aed51649ab37de.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/20bb08851467ba3a00ccf278c5f7741b63ec70fd4114c1855a673c505690a2cb.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/d8fa9065948cd1178297278cc57db5f52f7ae05d4e58a6b38c22ba9d0125f091.png
Similarity scores:
A photo of a rose: 0.99
A photo of a sunflower: 0.00
A photo: 0.01
../_images/34900dead4a17818d196bba9ae023f96b97904c83a7dd1e4210fba65d41af7ba.png
Similarity scores:
A photo of a rose: 0.01
A photo of a sunflower: 0.00
A photo: 0.99
../_images/e0bbfe48a7ebe8b1fd5b38b26c7bbf7106b38294e64c6b9e4b7aec14f10809a7.png
Similarity scores:
A photo of a rose: 0.08
A photo of a sunflower: 0.30
A photo: 0.62
../_images/40594df89ad344a248f7dbd879d956e84299983f313a291902ea8a36ff94b8c6.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/a90e00e1bf81bce3872186b9fabdf364ddf9f9aa8d3a3362c55887aad29d3e8f.png
Similarity scores:
A photo of a rose: 0.00
A photo of a sunflower: 1.00
A photo: 0.00
../_images/4503386f6af7fa74df4c558c77ff18a833ca52c794264d134fa5003bcaf9580a.png
Similarity scores:
A photo of a rose: 0.02
A photo of a sunflower: 0.01
A photo: 0.97
../_images/c92d57de5f5cd22ee104088e96a379dcfdb927ee7865554b86c788e7aeac466a.png
Similarity scores:
A photo of a rose: 0.94
A photo of a sunflower: 0.02
A photo: 0.05

b) Let’s say now we want to classify the same images into two groups:

  • Photos of cars.

  • The rest of the photos.

Do only the minimum changes to the previous code, and again, for each photo print the new classification.

labels = ['A photo of a car', "A photo"]

text = clip.tokenize(labels).to(device)

with torch.no_grad():
    text_features = model.encode_text(text)
    text_features /= text_features.norm(dim=-1, keepdim=True)

text_features.shape
torch.Size([2, 512])
similarities = (100.0 * image_embeddings @ text_features.T).softmax(dim=-1)
for i, image_path in enumerate(image_paths):
    image = Image.open(image_path)
    plt.imshow(image)
    plt.axis('off')
    plt.show()
    print("Similarity scores:")
    for l, label in enumerate(labels):
        print(f"{label}: {similarities[i, l]:.2f}")
../_images/74d02a60602521f6b78a80cd6b8a070c6c35cb8117c374aef74cd5d97c794417.png
Similarity scores:
A photo of a car: 0.02
A photo: 0.98
../_images/729931f1780c6a59e12b9c8442c67b9af8813f288927afc4b49544572627bb05.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/3ca811c9eb9f1e804831ff1eb1d280d6ece25ba9de5f24a30f1e6633cbc2687d.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/428adaa007ad4ead87886a17bee04932c9a4c776a9d90d94ddde01d4eff8ee0e.png
Similarity scores:
A photo of a car: 0.06
A photo: 0.94
../_images/dad5699726b3dcdfd2b10f4aa77e02d2a89e7f38a457de63c65636e77cf4c13b.png
Similarity scores:
A photo of a car: 0.02
A photo: 0.98
../_images/e694fb71f861c76350e5ca3338790680c236f2ed9ed5af5bbfe1ab43678411fd.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/482a4368fd41b0a7408b920c8fabd378fdfb17974a61e946d26d053536f01aed.png
Similarity scores:
A photo of a car: 0.02
A photo: 0.98
../_images/03b53708693d154fd578fe01c6896e345faf44e9f89219eb5a0638a1ab562f92.png
Similarity scores:
A photo of a car: 0.02
A photo: 0.98
../_images/c4e46920dc28f41201d362bfc3f0e2cd6f6f09342baa64b0e2d54d1feec3500d.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/a8177aa2c6830831810d679a745388fd574ba136d1ddaf44021c649347765517.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/e644cc7d66ad353687833ae7618e8ff1b60017a5146259a59149c2913eb90850.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/c5426cf2ba61293ff42fcde508ac37cfe16c4042c33c351b595e10c82379e766.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/11d36166e9832f82219d222e675760e1c23296436b607d02079a5869ed8d3d62.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/768d8c6ffbd7f1b73188fa51dc860436efc5064ca478996efbe89e967b2b1933.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/211d43eafff5914e9fb4dc387a47a063480698081052a5ccfe52c29ff71b861d.png
Similarity scores:
A photo of a car: 0.02
A photo: 0.98
../_images/ffea8c706bb4a447c2965f76a76fa00601d9d42d21736e2aaf141936136501bd.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/15ffc1b1986b865bfbea4314510c24a593357be58e23622f73ced88819d057b2.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/dca79163115597fdd0d950e48ea2dffcc64c5ece13d1bb178f0b61e121c5be8d.png
Similarity scores:
A photo of a car: 0.02
A photo: 0.98
../_images/7de7ae29bc7f7edff4118dc781227fca75ca49cfc06cd655738d9b181e322c37.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/9d65e633772be1f445843d9a50ba21e6bdb325b3f74037494dfc987cdd13ad78.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/a417b3e974573edb8c16e5aa3bc8b7aeea0641889a0f452e9ea8cd23473944a8.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/3d4489a929e389c80cd5372be379aa6817ea80d1adcb0a66b62d7c8b328af1ad.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/8103367fe04a6e1a094c52967bd855f824563332b0f0fdb3257f828b5a9519d1.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/9e59d35925f505029b68ee58e4f19ee47abb62fe64c8d6a0a64f20c23c581dce.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/f25a0e6f30097c2d5631b196aaf8b48bf8c7b972a273c75064ca1ef728325c39.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/5d6f7b3cc8b976b721715b8de41d2ae982e7202397faad17eec90c423b9688e7.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/755a9748363198fd8fe5f8a7cbe6cf30c4d5f55b6816da2cf5c62f21c255bc82.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/a5c5fe13ffda5144281af3ca8fd55ab7313a40e7af4647a27a068b5e64713cec.png
Similarity scores:
A photo of a car: 0.02
A photo: 0.98
../_images/b6f3c337663be23a7aac9062518e8705afdb18f62cb47a7079f67cf05cb87a95.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/6aafa4d7f35d4d4d46d945b2b37a6a78c8df5a7bf3be43c29b2aacad05c5997e.png
Similarity scores:
A photo of a car: 0.99
A photo: 0.01
../_images/fb35a8e2783970e27cc2c8a2f1798c2b50fdd70f0142556206872f7004eb2ce0.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/2c6fb7d1fe27ab703cd4d4c89a72b5907e967ab386dab75b6ff9f168cafadd48.png
Similarity scores:
A photo of a car: 0.03
A photo: 0.97
../_images/ed0f72db3ec1ab6377741754b1dad35f43b2d3bcb90b70d1a6b9baa816985937.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/2323c451fc505c24431e59c028e5f46bea500323635c6f04be4c3cc2ef3b4d43.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/448c6716784cd6cdb01dcd35b9f373454129309e7332a562032f07b3a9cbac28.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/8871ebe1cf9dcdc998fe78ee47e91eea3d3c6ada655fba2c64aad92bfc98c63e.png
Similarity scores:
A photo of a car: 0.98
A photo: 0.02
../_images/cecc0fe972aa77ef21139b20243d757b064bd7e8da71f7586f93a1c0d8c933e0.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/78f82997dae900d01dd36a7efb76cc72f8c43580377e5a6a0aac517478b0c093.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/aeceb8967671599d677badf862f7cc8edc882cb17ca40381b9aed51649ab37de.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/20bb08851467ba3a00ccf278c5f7741b63ec70fd4114c1855a673c505690a2cb.png
Similarity scores:
A photo of a car: 0.02
A photo: 0.98
../_images/d8fa9065948cd1178297278cc57db5f52f7ae05d4e58a6b38c22ba9d0125f091.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00
../_images/34900dead4a17818d196bba9ae023f96b97904c83a7dd1e4210fba65d41af7ba.png
Similarity scores:
A photo of a car: 0.98
A photo: 0.02
../_images/e0bbfe48a7ebe8b1fd5b38b26c7bbf7106b38294e64c6b9e4b7aec14f10809a7.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/40594df89ad344a248f7dbd879d956e84299983f313a291902ea8a36ff94b8c6.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/a90e00e1bf81bce3872186b9fabdf364ddf9f9aa8d3a3362c55887aad29d3e8f.png
Similarity scores:
A photo of a car: 0.01
A photo: 0.99
../_images/4503386f6af7fa74df4c558c77ff18a833ca52c794264d134fa5003bcaf9580a.png
Similarity scores:
A photo of a car: 0.98
A photo: 0.02
../_images/c92d57de5f5cd22ee104088e96a379dcfdb927ee7865554b86c788e7aeac466a.png
Similarity scores:
A photo of a car: 0.00
A photo: 1.00

c) Without printing any photo, could you tell if there were any person’s face in the photos?

labels = ["A person's face", "A photo"]

text = clip.tokenize(labels).to(device)

with torch.no_grad():
    text_features = model.encode_text(text)
    text_features /= text_features.norm(dim=-1, keepdim=True)

text_features.shape
torch.Size([2, 512])
similarities = (100.0 * image_embeddings @ text_features.T).softmax(dim=-1)
for i, image_path in enumerate(image_paths):
    image = Image.open(image_path)
    plt.imshow(image)
    plt.axis('off')
    plt.show()
    print("Similarity scores:")
    for l, label in enumerate(labels):
        print(f"{label}: {similarities[i, l]:.2f}")
../_images/74d02a60602521f6b78a80cd6b8a070c6c35cb8117c374aef74cd5d97c794417.png
Similarity scores:
A person's face: 0.03
A photo: 0.97
../_images/729931f1780c6a59e12b9c8442c67b9af8813f288927afc4b49544572627bb05.png
Similarity scores:
A person's face: 0.01
A photo: 0.99
../_images/3ca811c9eb9f1e804831ff1eb1d280d6ece25ba9de5f24a30f1e6633cbc2687d.png
Similarity scores:
A person's face: 0.01
A photo: 0.99
../_images/428adaa007ad4ead87886a17bee04932c9a4c776a9d90d94ddde01d4eff8ee0e.png
Similarity scores:
A person's face: 0.07
A photo: 0.93
../_images/dad5699726b3dcdfd2b10f4aa77e02d2a89e7f38a457de63c65636e77cf4c13b.png
Similarity scores:
A person's face: 0.27
A photo: 0.73
../_images/e694fb71f861c76350e5ca3338790680c236f2ed9ed5af5bbfe1ab43678411fd.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/482a4368fd41b0a7408b920c8fabd378fdfb17974a61e946d26d053536f01aed.png
Similarity scores:
A person's face: 0.01
A photo: 0.99
../_images/03b53708693d154fd578fe01c6896e345faf44e9f89219eb5a0638a1ab562f92.png
Similarity scores:
A person's face: 0.07
A photo: 0.93
../_images/c4e46920dc28f41201d362bfc3f0e2cd6f6f09342baa64b0e2d54d1feec3500d.png
Similarity scores:
A person's face: 0.03
A photo: 0.97
../_images/a8177aa2c6830831810d679a745388fd574ba136d1ddaf44021c649347765517.png
Similarity scores:
A person's face: 0.30
A photo: 0.70
../_images/e644cc7d66ad353687833ae7618e8ff1b60017a5146259a59149c2913eb90850.png
Similarity scores:
A person's face: 0.01
A photo: 0.99
../_images/c5426cf2ba61293ff42fcde508ac37cfe16c4042c33c351b595e10c82379e766.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/11d36166e9832f82219d222e675760e1c23296436b607d02079a5869ed8d3d62.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/768d8c6ffbd7f1b73188fa51dc860436efc5064ca478996efbe89e967b2b1933.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/211d43eafff5914e9fb4dc387a47a063480698081052a5ccfe52c29ff71b861d.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/ffea8c706bb4a447c2965f76a76fa00601d9d42d21736e2aaf141936136501bd.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/15ffc1b1986b865bfbea4314510c24a593357be58e23622f73ced88819d057b2.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/dca79163115597fdd0d950e48ea2dffcc64c5ece13d1bb178f0b61e121c5be8d.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/7de7ae29bc7f7edff4118dc781227fca75ca49cfc06cd655738d9b181e322c37.png
Similarity scores:
A person's face: 0.01
A photo: 0.99
../_images/9d65e633772be1f445843d9a50ba21e6bdb325b3f74037494dfc987cdd13ad78.png
Similarity scores:
A person's face: 0.06
A photo: 0.94
../_images/a417b3e974573edb8c16e5aa3bc8b7aeea0641889a0f452e9ea8cd23473944a8.png
Similarity scores:
A person's face: 0.15
A photo: 0.85
../_images/3d4489a929e389c80cd5372be379aa6817ea80d1adcb0a66b62d7c8b328af1ad.png
Similarity scores:
A person's face: 0.06
A photo: 0.94
../_images/8103367fe04a6e1a094c52967bd855f824563332b0f0fdb3257f828b5a9519d1.png
Similarity scores:
A person's face: 0.11
A photo: 0.89
../_images/9e59d35925f505029b68ee58e4f19ee47abb62fe64c8d6a0a64f20c23c581dce.png
Similarity scores:
A person's face: 0.03
A photo: 0.97
../_images/f25a0e6f30097c2d5631b196aaf8b48bf8c7b972a273c75064ca1ef728325c39.png
Similarity scores:
A person's face: 0.15
A photo: 0.85
../_images/5d6f7b3cc8b976b721715b8de41d2ae982e7202397faad17eec90c423b9688e7.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/755a9748363198fd8fe5f8a7cbe6cf30c4d5f55b6816da2cf5c62f21c255bc82.png
Similarity scores:
A person's face: 0.03
A photo: 0.97
../_images/a5c5fe13ffda5144281af3ca8fd55ab7313a40e7af4647a27a068b5e64713cec.png
Similarity scores:
A person's face: 0.11
A photo: 0.89
../_images/b6f3c337663be23a7aac9062518e8705afdb18f62cb47a7079f67cf05cb87a95.png
Similarity scores:
A person's face: 0.04
A photo: 0.96
../_images/6aafa4d7f35d4d4d46d945b2b37a6a78c8df5a7bf3be43c29b2aacad05c5997e.png
Similarity scores:
A person's face: 0.08
A photo: 0.92
../_images/fb35a8e2783970e27cc2c8a2f1798c2b50fdd70f0142556206872f7004eb2ce0.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/2c6fb7d1fe27ab703cd4d4c89a72b5907e967ab386dab75b6ff9f168cafadd48.png
Similarity scores:
A person's face: 0.21
A photo: 0.79
../_images/ed0f72db3ec1ab6377741754b1dad35f43b2d3bcb90b70d1a6b9baa816985937.png
Similarity scores:
A person's face: 0.03
A photo: 0.97
../_images/2323c451fc505c24431e59c028e5f46bea500323635c6f04be4c3cc2ef3b4d43.png
Similarity scores:
A person's face: 0.01
A photo: 0.99
../_images/448c6716784cd6cdb01dcd35b9f373454129309e7332a562032f07b3a9cbac28.png
Similarity scores:
A person's face: 0.01
A photo: 0.99
../_images/8871ebe1cf9dcdc998fe78ee47e91eea3d3c6ada655fba2c64aad92bfc98c63e.png
Similarity scores:
A person's face: 0.03
A photo: 0.97
../_images/cecc0fe972aa77ef21139b20243d757b064bd7e8da71f7586f93a1c0d8c933e0.png
Similarity scores:
A person's face: 0.14
A photo: 0.86
../_images/78f82997dae900d01dd36a7efb76cc72f8c43580377e5a6a0aac517478b0c093.png
Similarity scores:
A person's face: 0.03
A photo: 0.97
../_images/aeceb8967671599d677badf862f7cc8edc882cb17ca40381b9aed51649ab37de.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/20bb08851467ba3a00ccf278c5f7741b63ec70fd4114c1855a673c505690a2cb.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/d8fa9065948cd1178297278cc57db5f52f7ae05d4e58a6b38c22ba9d0125f091.png
Similarity scores:
A person's face: 0.02
A photo: 0.98
../_images/34900dead4a17818d196bba9ae023f96b97904c83a7dd1e4210fba65d41af7ba.png
Similarity scores:
A person's face: 0.06
A photo: 0.94
../_images/e0bbfe48a7ebe8b1fd5b38b26c7bbf7106b38294e64c6b9e4b7aec14f10809a7.png
Similarity scores:
A person's face: 0.43
A photo: 0.57
../_images/40594df89ad344a248f7dbd879d956e84299983f313a291902ea8a36ff94b8c6.png
Similarity scores:
A person's face: 0.01
A photo: 0.99
../_images/a90e00e1bf81bce3872186b9fabdf364ddf9f9aa8d3a3362c55887aad29d3e8f.png
Similarity scores:
A person's face: 0.07
A photo: 0.93
../_images/4503386f6af7fa74df4c558c77ff18a833ca52c794264d134fa5003bcaf9580a.png
Similarity scores:
A person's face: 0.18
A photo: 0.82
../_images/c92d57de5f5cd22ee104088e96a379dcfdb927ee7865554b86c788e7aeac466a.png
Similarity scores:
A person's face: 0.01
A photo: 0.99