Как сравнить одну картинку со всеми данными теста в сиамской нейронной сети? - PullRequest
0 голосов
/ 14 марта 2020

Я построил сиамскую нейронную сеть, используя 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)

это каталог enter image description here

1 Ответ

2 голосов
/ 14 марта 2020

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

output = torch.softmax(output)

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

Однако этот метод подходит для задач классификации, в отличие от сиамских сетей. Сиамские сети сравнивают входы, а не сортируют входы по классам. Судя по вашему вопросу, вы пытаетесь сравнить 1 изображение с 26 другими. Вы можете l oop по всем 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)
...