Добрый вечер,
Не знаю насколько четко получилось отразить суть вопроса в заголовке)
Есть код на Python который после распознавания лица на фото получает массив данных, сравнивая/вычисляя евклидово расстояние с другим аналогичным массивом мы узнаем насколько схожи два лица на фото.
За основу я брал эту статью:
статья
Единственное что я не понимаю, так это как мне правильно сохранять полученную 'биометрию/массив' в реляционную базу и дальше производить поиск только с помощью SQL запроса?
Пример:
#!/usr/bin/env python3
import cv2
import face_recognition
import mysql.connector as mysql
def get_image_hash(image):
# Открытие изображения
img = face_recognition.load_image_file(image)
# Blaсk Livеs Mаttеr
#img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# Получаем данные с лица
vector = face_recognition.face_encodings(img)[0]
vector = (str(vector),)
return vector
# Open DB
conn = mysql.connect(
host = '127.0.0.1',
user = 'user',
passwd = 'password'
)
cur = conn.cursor()
cur.execute("SHOW DATABASES")
# Проверка на существование базы
db_found = False
for db in cur:
if 'test' in db:
db_found = True
if not db_found:
cur.execute("CREATE DATABASE IF NOT EXISTS test;")
conn.commit()
cur.execute("USE test;")
cur.execute("""CREATE TABLE IF NOT EXISTS faces(id_face BIGINT PRIMARY KEY NOT NULL AUTO_INCREMENT, face_hash TEXT)""")
new_image = get_image_hash('test.jpg')
# Сохранение в БД
cur.execute('''INSERT INTO faces (face_hash) VALUES(%s)''', new_image)
conn.commit()
# Загрузка фото для поиска
find_me_image = get_image_hash('findme.jpg')
#print('d: ', find_me_image[0])
# Как я здесь должен сравнивать массив полученный с только что загруженного фото с ранее сохраненными образцами в БД?
cur.execute("SELECT * FROM faces WHERE ..... ;")
cur.close()
print('find_me_image: ', str(find_me_image))
print('new_image: ', str(new_image))
Если я верно понимаю на данный момент у меня только один выход:
извлечь все лица из базы и далее уже их сравнивать в python используя метод pdist:
pdist([vector1, vector2], 'euclidean')
Но если лиц будет миллионы?
Как быстро это будет работать?
Предполагаю что требуется иметь колоссальный объём RAM.
ps: За рабочий пример кода я готов заплатить!