Как изменить 128 d вектора изображения в питоне - PullRequest
0 голосов
/ 28 сентября 2019

Я пытаюсь вычислить euclidean distance между двумя изображениями.Для этого я сначала получаю массив 128d изображения, а затем использую cv2.norm(), чтобы получить расстояние.Ниже приведен код:

embedder = cv2.dnn.readNetFromTorch(<model_path>)
embedder.setInput(faceBlob)
unknown_vector = embedder.forward()

###
# SOME CODE
###

for i in range(len(known_embeddings["embeddings"])):
    known_vector = known_embeddings["embeddings"][i]
    distance = cv2.norm(unknown_vector, known_vector)

, но выше cv2.norm() дает ошибку ниже:

cv2.error: OpenCV(4.1.0) C:\projects\opencv-python\opencv\modules\core\src\norm.cpp:1018: error: (-215:Assertion failed) _src1.sameSize(_src2) && _src1.type() == _src2.type() in function 'cv::norm'

Я напечатал known_vector и unknown_vector иэто выглядит так:

known_vector = [ 0.05413035  0.0257974   0.00822693 -0.02118884 -0.00418675  0.21330039
                 0.04995908  0.08850633 -0.10475695  0.04271172  0.08244997  0.11823266
                 0.05605    -0.26287156 -0.03104441 -0.11828042 -0.10454978  0.08653253
                 0.05605    -0.26287156 -0.03104441 -0.11828042 -0.10454978........... ]

unknow_vector = [[ 0.0166864   0.14611466 -0.06341252 -0.017478    0.04083985  0.28554845
                   0.03665403 -0.03293686 -0.05170902  0.07699523  0.06401276 -0.03113891
                   0.05892153 -0.16073132  0.04638063 -0.01014538 -0.07338376  0.07749851
                   0.02471998 -0.10915973  0.16763256 -0.02218471 -0.06936902........... ]]

Итак, сверху это выглядит так, как будто они разные по форме.Как я могу преобразовать unknown_vector, чтобы соответствовать форме known_vector.Пожалуйста помоги.Спасибо

1 Ответ

1 голос
/ 28 сентября 2019

Вы не должны использовать петли там, где они не нужны.По возможности используйте векторизованные операции.

Более того, я не уверен, почему вы даже используете только opencv, pytorch для этой задачи, я думаю (если нет, пожалуйста, уточните в комментарии, пожалуйста)см. ниже:

import torch

embedding = torch.nn.Embedding(1000, 50)
example_vector = torch.randn(50)

# Broadcast to (1000, 50) automatically, result is of shape 1000
distances = torch.norm(example_vector.reshape(1, -1) - embedding.weight, dim=1)

distances содержит расстояния вашего example_vector до каждого вложения, вы можете взять torch.max из него или min или что угодно еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...