Подключение Face SDK к проекту
Для начала работы с Face SDK вам нужно добавить библиотеку libfacerec в свой проект. libfacerec — это основная библиотека, в которой реализованы ключевые функции Face SDK, включая детекцию, оценку атрибутов и идентификацию/верификацию.
Добавление библиотеки libfacerec в проект
Требуемые зависимости
Прежде всего вам необходимо установить следующие зависимости:
Для Windows:
- библиотека sense4.dll. Эта библиотека находится в дистрибутиве Face SDK в папке bin и должна оставаться рядом с библиотекой facerec.dll в случае перемещения.
- (64-bit): библиотека tensorflow.dll при ускорении GPU/AVX2. Эта библиотека находится в дистрибутиве Face SDK в папке bin. Библиотека должна располагаться в директории, из которой запускается приложение, либо необходимо добавить путь до директории с этой библиотекой в системную перемнную
PATH
. - (64-bit): Microsoft Visual C++ Redistributable for Visual Studio 2019
Для Linux:
- библиотека libusb-0.1.so.4
- (64-bit): библиотека libtensorflow.so.2 при ускорении GPU/AVX2. Эта библиотека находится в дистрибутиве Face SDK в папке lib
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 в ваш проект. После сборки проекта добавьте facerec.so (для Linux) или facerec.dll (для Windows) и FacerecCSharpWrapper.dll в директорию с исполняемым файлом.
Чтобы подробнее узнать о работе Face SDK в проектах на C#, ознакомьтесь с набором C# сэмплов.
Python
Примечание: Поддерживается Python 3.6 или выше. Перед началом установки необходимо установить пакет setuptools
.
Пакет face_sdk_3divi
позволяет использовать библиотеку libfacerec в проекте на Python. Чтобы установить пакет, перейдите в каталог python_api и выполните команду pip3 install .
Чтобы подробнее узнать о работе Face SDK в проектах на Python, ознакомьтесь с набором Python сэмплов.
Использование библиотеки libfacerec
Работа с библиотекой libfacerec начинается с вызова статического метода FacerecService.createService
, который динамически загрузит библиотеку. Результатом работы метода является интерфейсный объект FacerecService
, который используется для создания других интерфейсных объектов, в том числе Capturers, Estimators и Recognizers.
Предупреждение: Вызывать 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/
.
Для инициализации библиотеки libfacerec с предварительно загруженной (сохраненной в строковой переменной) лицензией вызовите метод FacerecService.createService
со следующими аргументами:
- dll_path: Абсолютный или относительный путь до файла библиотеки - libfacerec.so на Linux или facerec.dll на Windows.
- facerec_conf_dir: Абсолютный или относительный путь до каталога с конфигурационными файлами (каталог
face_sdk/conf/facerec/
в дистрибутиве). - license: Лицензия в виде специальной структуры:
FacerecService.License
Пример 1
В примере показана инициализация библиотеки libfacerec с использованием метода FacerecService.createService
.
- C++
- C#
- Java
- Python
#include <iostream>
#include <exception>
#include <facerec/import.h>
#include <facerec/libfacerec.h>
int main (int argc, char** argv)
{
try
{
pbio::FacerecService::Ptr service;
#ifdef _WIN32
service = pbio::FacerecService::createService("../bin/facerec.dll", "../conf/facerec/");
#else
service = pbio::FacerecService::createService("../lib/libfacerec.so", "../conf/facerec/");
#endif
const pbio::Recognizer::Ptr recognizer = service->createRecognizer("method7v7_recognizer.xml");
pbio::FacerecService::Config capturer_config("common_capturer4_fda.xml");
capturer_config.overrideParameter("min_size", 200);
pbio::Capturer::Ptr capturer = service->createCapturer(capturer_config);
// ...
}
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";
FacerecService service = FacerecService.createService(faceSDKRootDir + "/conf/facerec", "");
Recognizer recognizer = service.createRecognizer("method7v7_recognizer.xml", true, true, false);
FacerecService.Config capturerConfig = new FacerecService.Config("common_capturer4_fda.xml");
capturerConfig.overrideParameter("min_size", 200);
Capturer capturer = service.createCapturer(capturerConfig);
// ...
}
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 FacerecService service = FacerecService.createService(faceSDKRootDir + "/lib/libfacerec.so", faceSDKRootDir + "/conf/facerec", "");
final Recognizer recognizer = service.createRecognizer("method7v7_recognizer.xml", true, true, false);
FacerecService.Config capturerConfig = service.new Config("common_capturer4_fda.xml");
capturerConfig.overrideParameter("min_size", 200);
final Capturer capturer = service.createCapturer(capturerConfig);
// ...
}
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"
service = FacerecService.create_service(face_sdk_root_dir + "/lib/libfacerec.so", face_sdk_root_dir + "/conf/facerec")
recognizer = service.create_recognizer("method7v7_recognizer.xml", True, True, False)
capturer_config = Config("common_capturer4_fda.xml")
capturer = service.create_capturer(capturer_config)
# ...
except Error as e:
print(e)
Пример 2
В примере показан вызов метода createService
с предварительно загруженной (сохраненной в строковой переменной) лицензией.
- C++
- C#
- Java
std::string license_body = "<?xml version="1.0" encoding="utf-8"?><License>........"; // contents of your license
auto license = pbio::FacerecService::License(license_body);
const pbio::FacerecService::Ptr service = pbio::FacerecService::createService("../bin/facerec.dll", "../conf/facerec/", license);
string license_body = "<?xml version="1.0" encoding="utf-8"?><License>........"; // contents of your license
FacerecService service = FacerecService.createService(faceSDKRootDir + "/conf/facerec", new FacerecService.License(license_body));
String license_body = "<?xml version="1.0" encoding="utf-8"?><License>........"; // contents of your license
final FacerecService service = FacerecService.createService(faceSDKRootDir + "/lib/libfacerec.so", faceSDKRootDir + "/conf/facerec", new FacerecService.License(license_body));