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

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

Похожие вопросы