Как сравнить одно изображение со всеми данными теста в сиамской нейронной сети?

Я построил сиамскую нейронную сеть с помощью pytorch. Но я только что протестировал это, вставив 2 изображения и вычислив оценку сходства, где 0 означает, что изображение отличается, а 1 означает, что изображение такое же.

import numpy as np
import os, sys
from PIL import Image
dir_name = "/Users/tania/Desktop/Aksara/Compare" #this should contain 26 images only
X = []
for i in os.listdir(dir_name):
    if ".PNG" in i:
        X.append(torch.from_numpy(np.array(Image.open("./Compare/" + i))))

x1 = np.array(Image.open("/Users/tania/Desktop/Aksara/TEST/Ba/B/B.PNG"))
x1 = transforms(x1)
x1 = torch.from_numpy(x1)

#x1 = torch.stack([x1])

closest = 0.0  #highest similarity
closest_letter_idx = 0  #index of closest letter 0=A, 1=B, ...
cnt = 0

for i in X:
    output = model(x1,i) #assuming x1 is your input image
    output = torch.sigmoid(output)
    if output > closest:
        closest_letter_idx = cnt
        closest = output
    cnt += 1

Обе картинки разные, поэтому на выходе

  File "test.py", line 83, in <module>
    X.append(torch.from_numpy(Image.open("./Compare/" + i)))
TypeError: expected np.ndarray (got PngImageFile)

это каталог

1 ответ

Да, есть способ, вы можете использовать функцию softmax:

output = torch.softmax(output)

Это возвращает тензор из 26 значений, каждое из которых соответствует вероятности того, что изображение соответствует каждому из 26 классов. Следовательно, тензор в сумме равен 1 (100%).

Однако этот метод подходит для задач классификации, в отличие от сиамских сетей. Сиамские сети сравнивают входные данные, а не сортируют входные данные по классам. Судя по вашему вопросу, похоже, вы пытаетесь сравнить 1 картинку с 26 другими. Вы можете перебрать все 26 образцов для сравнения, вычислить и сохранить оценку сходства для каждого и вывести максимальное значение (то есть, если вы не хотите изменять свою модель):

dir_name = '/Aksara/Compare' #this should contain 26 images only
X = []
for i in os.listdir(dir_name):
    if ".PNG" in i:
        X.append(torch.from_numpy(np.array(Image.open("./Compare/" + i))))

x1 = np.array(Image.open("test.PNG"))
#do your transformations on x1
x1 = torch.from_numpy(x1)
closest = 0.0  #highest similarity
closest_letter_idx = 0  #index of closest letter 0=A, 1=B, ...
cnt = 0

for i in X:
    output = model(x1,i) #assuming x1 is your input image
    output = torch.sigmoid(output)
    if output > closest:
        closest_letter_idx = cnt
        closest = output
    cnt += 1
print(closest_letter_idx)
Другие вопросы по тегам