Как перевести строку в вектор для расчёта евклидового расстояния?
Есть проект по идентификации людей с помощью веб камеры. Проблема заключается в расчёте евклидового расстояния между дескрипторами лица. При извлечении дескрипторов, они с типом dlib.vector, мне их необходимо занести в файл (в перспективе создать БД), а затем извлечь для расчёта евклидового расстояния. Второй дескриптор получаю с камеры ноутбука. Использую 2 нейронки от dlib. Я могу извлечь дескриптор из файла, преобразовать его в массив, список, строку, но как я понял оба дескриптора должны иметь тип dlib.vector, что сделать мне не удаётся.
Python 3.6 + cv2 + dlib + scipy
Расчёт евклидового расстояния. a = distance.euclidean(face_descriptor1, face_descriptor2)
Ответы (3 шт):
Проще всего воспользоваться модулем Numpy - сначала перевести dlib.vector в numpy array:
import numpy as np
arr = np.asarray(dlib.vector)
Расчёт евклидового расстояния:
np.linalg.norm(database_landmarks - arr)
Спасибо за ответ! Всё же смог сам справиться. Выяснил, что для такой конструкцииa = distance.euclidean(face_descriptor1, face_descriptor2) не обязательно получить два вектора типа dlib.vector. Как я понял, нужен был двумерный массив, в котором всего один столбец и 128 строк. Справился так.
import numpy as np
line = []
face_descriptor1 = np.zeros((128, 1))
f = open("D:\sns findface\descript\descript"+ str(i) +".txt")
for z in range(128):
line = float(f.readline())
face_descriptor1[z][0] = line
Судя по вашему ответу - основная сложность была в том, чтобы прочитать вектор face_descriptor из текстового файла, получив матрицу размерности (128, 1).
Сделать это можно так:
face_descriptor1 = np.loadtxt(filename).reshape(-1, 1)