Подключение Face SDK к проекту
Для начала работы с Face SDK вам нужно добавить библиотеку libfacerec в свой проект. libfacerec — это основная библиотека, в которой реализованы ключевые функции Face SDK, включая детекцию, оценку атрибутов и идентификацию/верификацию.
Добавление библиотеки libfacerec в проект
C++
Библиотека libfacerec загружается динамически во время выполнения при вызове статического метода pbio::FacerecService::createService
, поэтому вам не нужно линковать свою программу с libfacerec.so (Linux) или facerec.dll (Windows). Необходимо только добавить каталог include к директориям заголовочных файлов.
Все объявления libfacerec находятся в двух заголовочных файлах:
facerec/import.h
– должен быть включен ровно один раз (например, в main.cpp)facerec/libfacerec.h
– должен быть включен в каждом файле, использующем библиотеку
Библиотека libfacerec не имеет фактических сторонних зависимостей, т.к. все использованные сторонние библиотеки (см. Лицензии свободного ПО]) слинкованы статически, поэтому для примеров, в которых используется OpenCV или boost*, должны подходить любые версии указанных библиотек.
* – за исключением дистрибутивов linux_x86_64 и windows_x86_64 при использовании ускорения GPU/AVX2. В таких случаях используется зависимость от libtensorflow.so.2, libonnxruntime.so или tensorflow.dll, onnxruntime.dll соответственно.
Версия библиотеки
Текущая версия библиотеки может быть получена путем вызова метода get_version
от созданного объекта FacerecService
. При этом будет возвращена строка формата x.yy.zz
, где x
– основная версия, yy
– дополнительная версия, zz
– версия патча.
Для C++ версию дополнительно можно получить из констант препроцессора:
LIBFACEREC_VERSION
– строковое представление, аналогично форматуFacerecService.get_version()
LIBFACEREC_VERSION_HEX
– трехбайтовое представление версии, удобное для численного сравнения, например,0x010234
Чтобы подробнее узнать о работе Face SDK в проектах на C++, ознакомьтесь с набором C++ сэмплов].
Java
Для использования facerec.jar в проекте укажите путь до этого файла в classpath
. Java-библиотека facerec.jar является оберткой над C++ библиотекой, поэтому необходимо наличие libfacerec_jni.so и libfacerec.so для Linux и Android или facerec_jni.dll и facerec.dll для Windows во время выполнения. Путь до директории, содержащей libfacer_jni.so или facerec_jni.dll, должен быть указан в java.library.path
.
Чтобы подробнее узнать о работе Face SDK в проектах на Java, ознакомьтесь с набором Java сэмплов].
C#
Для использования библиотеки необходимо добавить ссылку на FacerecCSharpWrapper.dll в ваш проект. После сборки проекта добавьте FacerecCSharpWrapper.dll, а также, в зависимости от операционной системы, добавьте facerec.dll (для Windows) или создайте ссылку facerec.dll на libfacerec.so (для Linux) в директорию с исполняемым файлом.
Чтобы подробнее узнать о работе Face SDK в проектах на C#, ознакомьтесь с набором C# сэмплов].
Python
Примечание. Поддерживается Python 3.6 или выше. Перед началом установки необходимо установить пакет setuptools
.
Пакет face_sdk_3divi
позволяет использовать библиотеку libfacerec в проекте на Python. Чтобы установить пакет, перейдите в каталог python_api и выполните команду pip3 install .
Чтобы подробнее узнать о работе Face SDK в проектах на Python, ознакомьтесь с набором Python сэмплов].
NodeJS
Примечание. Поддерживается Node v18.20.8 или выше.
Пакет face_sdk_3divi
позволяет использовать библиотеку libfacerec в проекте на NodeJS. Чтобы установить пакет, вызовите в своем проекте npm install /path/to/FaceSDK/node_js
.
Go
Поддерживается только Linux.
Для сборки и запуска исполняемого файла вам понадобятся переменные:
- CGO_LDFLAGS="-L<path_to_face_sdk_lib_directory> -lfacerec"
- LD_LIBRARY_PATH=<path_to_face_sdk_lib_directory>
Пакет facesdk позволяет использовать библиотеку libfacerec в проекте на языке Go. Чтобы использовать пакет, добавьте следующую строку в ваш проект:
import (facesdk "github.com/3DiVi/Go-API")
Использование библиотеки libfacerec
Работа с библиотекой libfacerec начинается с вызова статического метода FacerecService.createService
, который динамически загрузит библиотеку. Результатом работы метода является интерфейсный объект FacerecService
, который используется для создания других интерфейсных объектов, в том числе Contexts, ProcessingBlocks и DynamicTemplateIndexes.
Предупреждение. Вызывать FacerecService.createService
можно только один раз, иначе может произойти сбой.
Для инициализации библиотеки libfacerec вызовите метод FacerecService.createService
со следующими аргументами:
- dll_path: Абсолютный или относительный путь до файла библиотеки - libfacerec.so на Linux или facerec.dll на Windows.
- facerec_conf_dir: Абсолютный или относительный путь до каталога с конфигурационными файлами (каталог
face_sdk/conf/facerec/
в дистрибутиве). - license_dir: Абсолютный или относительный путь до директории с лицензией, иначе остается пустая строка. В случае пустой строки поиск файла лицензии выполняется сначала в каталоге
face_sdk/license/
, затем в каталогеface_sdk/conf/facerec/
.
В NodeJS нужно вызвать функцию Init из пакета face_sdk_3divi
с теми же параметрами.
Пример
В примере показана инициализация библиотеки libfacerec с использованием метода FacerecService.createService
.
- C++
- C#
- Java
- Python
- NodeJS
- Go
#include <iostream>
#include <exception>
#include <facerec/import.h>
#include <facerec/libfacerec.h>
int main (int argc, char** argv)
{
try
{
std::string faceSDKRootDir = "/path/to/face_sdk";
#ifdef _WIN32
std::string dll_path = faceSDKRootDir + "/bin/facerec.dll";
#else
std::string dll_path = faceSDKRootDir + "/lib/libfacerec.so";
#endif
std::string conf_dir = faceSDKRootDir + "/conf/facerec/";
std::string license_dir = faceSDKRootDir + "/license/";
pbio::FacerecService::Ptr service;
service = pbio::FacerecService::createService(dll_path, conf_dir, license_dir);
pbio::Context detectorConfig = service->createContext();
pbio::Context fitterConfig = service->createContext();
pbio::Context faceExtractorConfig = service->createContext();
detectorConfig["unit_type"] = "FACE_DETECTOR";
fitterConfig["unit_type"] = "FACE_FITTER";
faceExtractorConfig["unit_type"] = "FACE_TEMPLATE_EXTRACTOR";
pbio::ProcessingBlock faceDetector = service->createProcessingBlock(detectorConfig);
pbio::ProcessingBlock faceFitter = service->createProcessingBlock(fitterConfig);
pbio::ProcessingBlock faceExtractor = service->createProcessingBlock(faceExtractorConfig);
// ...
}
catch(const pbio::Error &e)
{
std::cerr << "facerec exception catched: '" << e.what() << "' code: " << std::hex << e.code() << std::endl;
}
catch(const std::exception &e)
{
std::cerr << "exception catched: '" << e.what() << "'" << std::endl;
}
}
using System;
using VDT.FaceRecognition.SDK;
namespace Example
{
public class Example
{
public static void Main(string []args)
{
try
{
String faceSDKRootDir = "/path/to/face_sdk";
String confDirPath = faceSDKRootDir + "/conf/facerec";
String licenseDirPath = faceSDKRootDir + "/license";
FacerecService service = FacerecService.createService(confDirPath, licenseDirPath);
Dictionary<object, object> detectorConfig = new();
Dictionary<object, object> fitterConfig = new();
Dictionary<object, object> faceExtractorConfig = new();
detectorConfig["unit_type"] = "FACE_DETECTOR";
fitterConfig["unit_type"] = "FACE_FITTER";
faceExtractorConfig["unit_type"] = "FACE_TEMPLATE_EXTRACTOR";
ProcessingBlock faceDetector = service.CreateProcessingBlock(detectorConfig);
ProcessingBlock faceFitter = service.CreateProcessingBlock(fitterConfig);
ProcessingBlock faceExtractor = service.CreateProcessingBlock(faceExtractorConfig);
// ...
}
catch (Error e)
{
Console.WriteLine(e.Message);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
package example;
import java.lang.String;
import java.lang.Exception;
import com.vdt.face_recognition.sdk.FacerecService;
import com.vdt.face_recognition.sdk.Recognizer;
import com.vdt.face_recognition.sdk.Capturer;
import com.vdt.face_recognition.sdk.SDKException;
public class Example
{
public static void main(String []args)
{
try
{
final String faceSDKRootDir = "/path/to/face_sdk";
final String dllPath = faceSDKRootDir + "/lib/libfacerec.so";
final String confDirPath = faceSDKRootDir + "/conf/facerec";
final String licenseDirPath = faceSDKRootDir + "/license";
final FacerecService service = FacerecService.createService(dllPath, confDirPath, licenseDirPath);
Context detectorConfig = service.createContext();
Context fitterConfig = service.createContext();
Context faceExtractorConfig = service.createContext();
detectorConfig.get("unit_type").setString("FACE_DETECTOR");
fitterConfig.get("unit_type").setString("FACE_FITTER");
faceExtractorConfig.get("unit_type").setString("FACE_TEMPLATE_EXTRACTOR");
ProcessingBlock faceDetector = service.createProcessingBlock(detectorConfig);
ProcessingBlock faceFitter = service.createProcessingBlock(fitterConfig);
ProcessingBlock faceExtractor = service.createProcessingBlock(faceExtractorConfig);
// ...
}
catch (SDKException e)
{
System.out.println(e.getMessage());
}
catch (Exception e)
{
System.out.println(e.getMessage());
}
}
}
from face_sdk_3divi import Config, FacerecService, Error
if __name__ == '__main__':
try:
face_sdk_root_dir = "path/to/face_sdk"
dll_path = face_sdk_root_dir + "/lib/libfacerec.so"
conf_dir_path = face_sdk_root_dir + "/conf/facerec"
license_dir = face_sdk_root_dir + "/license"
service = FacerecService.create_service(dll_path, conf_dir_path, license_dir)
detectorConfig = {"unit_type": "FACE_DETECTOR"}
fitterConfig = {"unit_type": "FACE_FITTER"}
faceExtractorConfig = {"unit_type": "FACE_TEMPLATE_EXTRACTOR"}
faceDetector = service.createProcessingBlock(detectorConfig);
faceFitter = service.createProcessingBlock(fitterConfig);
faceExtractor = service.createProcessingBlock(faceExtractorConfig);
# ...
except Error as e:
print(e)
const facerec = require('face_sdk_3divi');
function main()
{
try {
const sdk_path = "path/to/face_sdk";
const dll_path = sdk_path + "/lib/libfacerec.so";
const conf_dir_path = sdk_path + "/conf/facerec";
const license_dir_path = sdk_path + "/license";
facerec.Init(dll_path, conf_dir_path, license_dir_path);
let detector_config = new facerec.Context();
let fitter_config = new facerec.Context();
let extractor_config = new facerec.Context();
detector_config.get("unit_type").value = "FACE_DETECTOR";
fitter_config.get("unit_type").value = "FACE_FITTER";
extractor_config.get("unit_type").value = "FACE_TEMPLATE_EXTRACTOR";
} catch (err) {
console.log(err)
}
}
package main
import (
facesdk "github.com/3DiVi/Go-API"
)
func main() {
sdkPath := "path/to/face_sdk"
confPath := sdk_path + "/conf/facerec"
licensePath := sdk_path + "/license"
_, err := facesdk.CreateFacerecService(confPath, licensePath)
if err != nil {
panic(err)
}
detectorConfig, err := facesdk.CreateContext()
if err != nil {
panic(err)
}
defer detectorConfig.Close()
fitterConfig, err := facesdk.CreateContext()
if err != nil {
panic(err)
}
defer fitterConfig.Close()
extractorConfig, err := facesdk.CreateContext()
if err != nil {
panic(err)
}
defer extractorConfig.Close()
context, err := detectorConfig.GetOrInsertByKey("unit_type")
if err != nil {
panic(err)
}
err = context.SetString("FACE_DETECTOR")
if err != nil {
panic(err)
}
context, err = fitterConfig.GetOrInsertByKey("unit_type")
if err != nil {
panic(err)
}
err = context.SetString("FACE_FITTER")
if err != nil {
panic(err)
}
context, err = extractorConfig.GetOrInsertByKey("unit_type")
if err != nil {
panic(err)
}
}