Как сравнить одно изображение со всеми данными теста в сиамской нейронной сети?
Я построил сиамскую нейронную сеть с помощью 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)