@HexUserHex

Сравнить 'биометрию' двух лиц с помощью python и модуля face_recognition используя SQL запрос?

Добрый вечер,
Не знаю насколько четко получилось отразить суть вопроса в заголовке)

Есть код на 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: За рабочий пример кода я готов заплатить!
  • Вопрос задан
  • 232 просмотра
Пригласить эксперта
Ответы на вопрос 2
Совсем недавно наткнулся на описание одной специализированной СУБД.
https://milvus.io/docs/v2.0.0/overview.md
Попробуй. Может, подойдет.
Ответ написан
fox_12
@fox_12 Куратор тега Python
Расставляю биты, управляю заряженными частицами
Вот тут описано неплохое решение используя Elasticsearch
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы