Этот сайт использует файлы cookies. Продолжая просмотр страниц сайта, вы соглашаетесь с использованием файлов cookies. Если вам нужна дополнительная информация, пожалуйста, посетите страницу Политика файлов Cookie
Subscribe
Прямой эфир
Cryptocurrencies: 9874 / Markets: 82599
Market Cap: $ 2 351 429 981 623 / 24h Vol: $ 50 891 020 683 / BTC Dominance: 53.455923388921%

Н Новости

Распознавание, хранение и поиск лиц в базе данных

В этой статье я максимально коротко и просто объясню принцип распознавания, хранения и поиска лиц в базе данных. В качестве примера будет использована библиотека Insightface и база данных PostgreSQL.

В интернете довольно много статей про распознавание лиц, но, чтобы понять, как внедрить в свой проект поиск лиц по базе данных, придется прочитать не одну статью. Поэтому я решил написать собственный материал и, надеюсь, он поможет людям сэкономить несколько часов, получив цельное представление о схеме устройства поиска лиц по базе данных всего лишь из одной статьи.

Для начала кратко пройдемся по всей цепочке действий, чтобы понять общую схему:

  1. Прогоняем фото с лицами через библиотеку insightface и получаем для каждого лица вектор (embedding)

  2. Полученный вектор записываем в базу данных

  3. Чтобы осуществлять поиск по лицу, сравниваем исходный embedding с теми, что хранятся в базе данных

А теперь пройдемся по каждому пункту более подробно.

Преобразование фото лица в вектор

Для начала устанавливаем библиотеку для распознавания лиц:

pip install insightface

Существует много других библиотек для распознавания лиц (к примеру, DeepFace), можете использовать любую библиотеку, принцип работы не изменится.

Далее прогоняем изображение через нейросеть:

from insightface.app import FaceAnalysis
import cv2
app = FaceAnalysis(name="buffalo_sc",providers=['CPUExecutionProvider'])
app.prepare(ctx_id=0, det_size=(256, 256))  #подготовка нейросети
img = cv2.imread("G:/pic.jpg") #считываем изображение
faces = app.get(img) #ищем лица на изображении и получаем информацию о них
for face in faces:
    print(face)
Hidden text
  • если нужна более высокая точность, распознавание пола, возраста, то используйте модель "buffalo_l"

  • можно использовать GPU вместо CPU (providers="CUDAExecutionProvider"). Также придется установить библиотеку onnx и onnxruntime-gpu

На выходе в переменной face получаем:

35802613eae92a2ede560f0e1666496d.png
  • face.bbox - это область на картинке, где находится лицо

  • face.det_score - уверенность нейросети в полученных результатах

  • face.embedding - точка, или же вектор в 512-мерном пространстве, по которому далее можно сравнивать схожесть лиц

Для того, чтобы видеть, какие лица были найдены, можно использовать данный код:

x, y, x2, y2 = face.bbox #получаем границы лица
cropped = img[int(y):int(y2), int(x):int(x2)] #вырезаем лицо из изображения
cv2.imshow('image', cropped) #показываем лицо
cv2.waitKey(0)
Исходное изображение
Полученные лица. insihtface находят лица, даже если их часть скрыта маской
Полученные лица. insihtface находят лица, даже если их часть скрыта маской

Хранение векторов в базе данных

Есть множество вариантов хранения векторов, но, если лиц десятки тысяч, или даже миллионы, то без хорошей базы данных не обойтись. В этой статье, в качестве примера, я покажу как устроено хранение векторов в моем проекте (django + postgresql)

Для более простого хранения и поиска по векторам потребуется установить расширение для базы данных "pgvector" https://github.com/pgvector/pgvector, а также, установить python библиотеку pip install pgvector

После установки расширения можно создавать таблицу, в которой будем хранить полученные векторы.

Как это выглядит django models.py:

from pgvector.django import VectorField
class Faces(models.Model):
    id = models.AutoField(primary_key=True)
    embedding = VectorField(dimensions = 512,null=True)

Как это выглядит в pgAdmin:

fd1862d25e7b8cfbee529ff00c9af327.png

Как добавлять в базу данных новые лица в django:

Faces.objects.create(embedding=face.embedding)

После того, как у нас уже есть база данных с хранящимися в ней лицами, можно переходить к поиску.

Поиск по базе данных

Итак, лица у нас хранятся в виде векторов. Что же нам нужно сделать с этими векторами, чтобы найти лицо в базе данных? Самые распространенные варианты поиска - это нахождение расстояний между концами векторов (чем меньше расстояние, тем меньше отличаются лица), а также - нахождение косинуса между векторами.

Расстояние между концами векторов в 2-х мерном пространстве
Расстояние между концами векторов в 2-х мерном пространстве

В этой статье рассмотрим поиск через нахождение расстояний (евклидово расстояние). Выполняется оно так:

from pgvector.django import L2Distance
fbase = Faces.objects.alias(distance=L2Distance('embedding', face.embedding)).filter(distance__lt=22)

В этом куске кода мы ищем в базе данных векторы, расстояние до которых от исходного вектора не более 22. Если нужен более точный поиск, можно поставить число поменьше. Если точность не так важна, можно увеличить число. Также, расстояние зависит от размерности вектора, если у вас 128-мерные векторы, то расстояния там, скорее всего, будут поменьше. В общем, подбирайте точность поиска опытным путем исходя из ваших задач.

Если нам просто нужно посчитать расстояние между двумя векторами, то можно воспользоваться библиотекой numpy:

import numpy as np
distance = np.linalg.norm(embedding1 - embedding2)

В приведенном примере в таблице с лицами хранится только id. Можно хранить и любые другие данные, пол, возраст, можно связать id с данными из других таблиц. Тут все зависит от ваших задач.

Заключение

В данной статье мы разобрали общие принципы распознавания, хранения и поиска лиц в базе данных. Далее подбирайте базы данных, библиотеки, которые будут наиболее удобны и эффективны для работы в ваших фреймворках, для решения ваших задач.

Источник

  • 07.09.23 16:24 CherryTeam

    Cherry Team atlyginimų skaičiavimo programa yra labai naudingas įrankis įmonėms, kai reikia efektyviai valdyti ir skaičiuoti darbuotojų atlyginimus. Ši programinė įranga, turinti išsamias funkcijas ir patogią naudotojo sąsają, suteikia daug privalumų, kurie padeda supaprastinti darbo užmokesčio skaičiavimo procesus ir pagerinti finansų valdymą. Štai keletas pagrindinių priežasčių, kodėl Cherry Team atlyginimų skaičiavimo programa yra naudinga įmonėms: Automatizuoti ir tikslūs skaičiavimai: Atlyginimų skaičiavimai rankiniu būdu gali būti klaidingi ir reikalauti daug laiko. Programinė įranga Cherry Team automatizuoja visą atlyginimų skaičiavimo procesą, todėl nebereikia atlikti skaičiavimų rankiniu būdu ir sumažėja klaidų rizika. Tiksliai apskaičiuodama atlyginimus, įskaitant tokius veiksnius, kaip pagrindinis atlyginimas, viršvalandžiai, premijos, išskaitos ir mokesčiai, programa užtikrina tikslius ir be klaidų darbo užmokesčio skaičiavimo rezultatus. Sutaupoma laiko ir išlaidų: Darbo užmokesčio valdymas gali būti daug darbo jėgos reikalaujanti užduotis, reikalaujanti daug laiko ir išteklių. Programa Cherry Team supaprastina ir pagreitina darbo užmokesčio skaičiavimo procesą, nes automatizuoja skaičiavimus, generuoja darbo užmokesčio žiniaraščius ir tvarko išskaičiuojamus mokesčius. Šis automatizavimas padeda įmonėms sutaupyti daug laiko ir pastangų, todėl žmogiškųjų išteklių ir finansų komandos gali sutelkti dėmesį į strategiškai svarbesnę veiklą. Be to, racionalizuodamos darbo užmokesčio operacijas, įmonės gali sumažinti administracines išlaidas, susijusias su rankiniu darbo užmokesčio tvarkymu. Mokesčių ir darbo teisės aktų laikymasis: Įmonėms labai svarbu laikytis mokesčių ir darbo teisės aktų, kad išvengtų baudų ir teisinių problemų. Programinė įranga Cherry Team seka besikeičiančius mokesčių įstatymus ir darbo reglamentus, užtikrindama tikslius skaičiavimus ir teisinių reikalavimų laikymąsi. Programa gali dirbti su sudėtingais mokesčių scenarijais, pavyzdžiui, keliomis mokesčių grupėmis ir įvairių rūšių atskaitymais, todėl užtikrina atitiktį reikalavimams ir kartu sumažina klaidų riziką. Ataskaitų rengimas ir analizė: Programa Cherry Team siūlo patikimas ataskaitų teikimo ir analizės galimybes, suteikiančias įmonėms vertingų įžvalgų apie darbo užmokesčio duomenis. Ji gali generuoti ataskaitas apie įvairius aspektus, pavyzdžiui, darbo užmokesčio paskirstymą, išskaičiuojamus mokesčius ir darbo sąnaudas. Šios ataskaitos leidžia įmonėms analizuoti darbo užmokesčio tendencijas, nustatyti tobulintinas sritis ir priimti pagrįstus finansinius sprendimus. Pasinaudodamos duomenimis pagrįstomis įžvalgomis, įmonės gali optimizuoti savo darbo užmokesčio strategijas ir veiksmingai kontroliuoti išlaidas. Integracija su kitomis sistemomis: Cherry Team programinė įranga dažnai sklandžiai integruojama su kitomis personalo ir apskaitos sistemomis. Tokia integracija leidžia automatiškai perkelti atitinkamus duomenis, pavyzdžiui, informaciją apie darbuotojus ir finansinius įrašus, todėl nebereikia dubliuoti duomenų. Supaprastintas duomenų srautas tarp sistemų padidina bendrą efektyvumą ir sumažina duomenų klaidų ar neatitikimų riziką. Cherry Team atlyginimų apskaičiavimo programa įmonėms teikia didelę naudą - automatiniai ir tikslūs skaičiavimai, laiko ir sąnaudų taupymas, atitiktis mokesčių ir darbo teisės aktų reikalavimams, ataskaitų teikimo ir analizės galimybės bei integracija su kitomis sistemomis. Naudodamos šią programinę įrangą įmonės gali supaprastinti darbo užmokesčio skaičiavimo procesus, užtikrinti tikslumą ir atitiktį reikalavimams, padidinti darbuotojų pasitenkinimą ir gauti vertingų įžvalgų apie savo finansinius duomenis. Programa Cherry Team pasirodo esanti nepakeičiamas įrankis įmonėms, siekiančioms efektyviai ir veiksmingai valdyti darbo užmokestį. https://cherryteam.lt/lt/

  • 08.10.23 01:30 davec8080

    The "Shibarium for this confirmed rug pull is a BEP-20 project not related at all to Shibarium, SHIB, BONE or LEASH. The Plot Thickens. Someone posted the actual transactions!!!! https://bscscan.com/tx/0xa846ea0367c89c3f0bbfcc221cceea4c90d8f56ead2eb479d4cee41c75e02c97 It seems the article is true!!!! And it's also FUD. Let me explain. Check this link: https://bscscan.com/token/0x5a752c9fe3520522ea88f37a41c3ddd97c022c2f So there really is a "Shibarium" token. And somebody did a rug pull with it. CONFIRMED. But the "Shibarium" token for this confirmed rug pull is a BEP-20 project not related at all to Shibarium, SHIB, BONE or LEASH.

Для участия в Чате вам необходим бесплатный аккаунт pro-blockchain.com Войти Регистрация
Есть вопросы?
С вами на связи 24/7
Help Icon