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

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

Похожие вопросы
Greenway Global Новосибирск
от 150 000 ₽
SpectrumData Екатеринбург
от 200 000 до 300 000 ₽
Akronix Санкт-Петербург
от 150 000 до 200 000 ₽
22 янв. 2025, в 04:08
6000 руб./за проект
21 янв. 2025, в 23:55
20000 руб./за проект
21 янв. 2025, в 23:35
80000 руб./за проект