—— 💎 关于 | ⭐ 快速开始 | 📄 基本说明 | 🐟 API | 🔎 参考文档 | ❓ 常见问题 | 📦 使用许可 ——
Целевая платформа | Минимальная версия | Операционная система |
---|---|---|
.NET Framework | 4.0 | win (x64/x86) |
.NET Standard | 2.0 | win (x64/x86) |
.NET / .NET Core | 3.1, 5.0, 6.0, 7.0 | win (x64/x86), linux (arm/arm64/x64) |
Рассмотрим пример простого обнаружения лица на платформе Windows x64.
using SkiaSharp;
using System;
using ViewFaceCore.Core;
using ViewFaceCore.Model;
namespace ViewFaceCore.Demo.ConsoleApp
{
internal class Program
{
private readonly static string imagePath = @"images/Jay_3.jpg";
static void Main(string[] args)
{
using var bitmap = SKBitmap.Decode(imagePath);
using FaceDetector faceDetector = new FaceDetector();
FaceInfo[] infos = faceDetector.Detect(bitmap);
Console.WriteLine($"Количество распознанных лиц: {infos.Length} Лицо информация: \n");
Console.WriteLine($"No.\tДоверие к лицу\tИнформация о местоположении");
for (int i = 0; i < infos.Length; i++)
{
Console.WriteLine($"{i}\t{infos[i].Score:f8}\t{infos[i].Location}");
}
Console.ReadKey();
}
}
}
Дополнительные примеры можно найти в исходном коде.
├─Bridges #Bridges
│ ├─Linux ##Проект ViewFaceBridge для платформы Linux
│ ├─Shared ##Общая библиотека
│ └─Windows ##Проект ViewFaceBridge для платформы Windows
├─Examples #Некоторые примеры
│ ├─ViewFaceCore.Demo.ConsoleApp ##Пример консольного приложения
│ ├─ViewFaceCore.Demo.VideoForm ##Пример проекта Winform для распознавания лиц с камеры
│ └─ViewFaceCore.Demo.WebApp ##Пример веб-проекта ASP.NET Core
├─Extensions #Проекты расширений
│ ├─ViewFaceCore.Extension.DependencyInjection ##Расширение для внедрения зависимостей
│ ├─ViewFaceCore.Extension.ImageSharp ##Расширение ImageSharp для обработки изображений
│ ├─ViewFaceCore.Extension.Shared ##Общий проект
│ ├─ViewFaceCore.Extension.SkiaSharp ##SkiaSharp图像处理扩展项目
│ └─ViewFaceCore.Extension.SystemDrawing ##System.Drawing图像处理扩展проект
├─Models #Модельный проект
├─Runtimes #Соответствующие каждой платформе среды выполнения
├─SeetaFace
│ └─index #Исходный код SeetaFace, папку build необходимо поместить в этот каталог
├─Tests #Тестовый проект, содержащий различные модульные тесты
└─ViewFaceCore #Исходный код ViewFaceCore
### 3.2 Среда разработки
- Visual Studio 2022, требуется установить поддержку .NET4/4.5 (как установить .NET4/4.5 в Visual Studio 2022?)
- Windows 10/11
- Ubuntu 20.04 (WSL), Debian 10/11 и другие
### 3.3 Компиляция SeetaFace6
#### 3.3.1 Меня не интересует компиляция SeetaFace6~~~
Речь идёт о человеческом распознавании лиц с открытым исходным кодом от компании Midcom Vision. Если вам не интересна компиляция этой части, вы можете напрямую загрузить скомпилированные ссылки на библиотеки из следующего двоичного файла:
https://github.com/ViewFaceCore/SeetaFace6OpenBinary/releases
После размещения файлов структура каталогов должна выглядеть следующим образом:
```shell
src
└─SeetaFace
└─index
└─build
├─bin
│ ├─x64
│ └─x86
├─cmake
├─include
├─lib
│ ├─arm
│ ├─arm64
│ ├─x64
│ └─x86
└─lib64
После завершения компиляции SeetaFace6 через 3.3.1 или 3.3.2 вы можете сразу построить SeetaFaceBridge, щёлкнув правой кнопкой мыши в VS.
Предварительным условием также является компиляция SeetaFace6. Существует три способа компиляции SeetaFaceBridge под Linux: WSL, удалённый Linux и кросс-компиляция. Вы можете выбрать наиболее удобный для вас способ. Сборка~
Это так же просто, как скомпилировать «Hello World» на C#.
Для обеспечения совместимости с различными платформами мы пронумеровали SeetaFace6 и ViewFaceBridge (используется для вызова C++ SeetaFace6 из C#) для каждой платформы. Затем мы упаковали и опубликовали их на nuget. При использовании установите соответствующий пакет nuget для вашей платформы. Например, для установки пакета nuget ViewFaceCore.runtime.win.x64
на платформу Windows x64. Runtime можно установить несколько платформ одновременно, но по крайней мере необходимо установить runtime для текущей платформы. Поддерживаемые платформы и пакеты nuget приведены в следующей таблице:
При использовании, если возникает исключение типа DirectoryNotFoundException: Can not found library path.
, пожалуйста, проверьте, существует ли runtime в соответствующем каталоге. Иногда проблемы с сетью могут привести к сбою загрузки пакета nuget.
ViewFaceCore сам по себе не зависит от каких-либо графических библиотек, но для удобства использования мы разработали три распространённых расширения графических библиотек. Они перечислены в следующей таблице:
Nuget пакет | Версия | Описание |
---|---|---|
ViewFaceCore.Extension.SkiaSharp | |
Расширение SkiaSharp |
4.4.1 Объект жизненного цикла Здесь объект жизненного цикла относится к жизненному циклу различных функциональных объектов в распознавании лиц, а не к управлению памятью и жизненному циклу объектов в C#. Хотя это тесно связано с управлением памятью в C#, это не является основной темой этого раздела, и здесь не будет подробно объясняться сама природа языка C#.
В качестве примера возьмём FaceDetector. В конструкторе FaceDetector:
public FaceDetector(FaceDetectConfig config = null)
{
this.DetectConfig = config ?? new FaceDetectConfig();
_handle = ViewFaceNative.GetFaceDetectorHandler(this.DetectConfig.FaceSize
, this.DetectConfig.Threshold
, this.DetectConfig.MaxWidth
, this.DetectConfig.MaxHeight
, (int)this.DetectConfig.DeviceType);
if (_handle == IntPtr.Zero)
{
throw new Exception("Get face detector handler failed.");
}
}
Через вызов Native функция GetFaceDetectorHandler в проекте ViewFaceBridge получает дескриптор IntPtr для объекта seeta::v6::FaceDetector в SeetaFace6.
Функция GetFaceDetectorHandler в ViewFaceBridge выглядит следующим образом:
View_Api seeta::v6::FaceDetector *GetFaceDetectorHandler(const double faceSize = 20, const double threshold = 0.9, const double maxWidth = 2000, const double maxHeight = 2000, const SeetaDevice deviceType = SEETA_DEVICE_AUTO)
{
seeta::v6::FaceDetector *faceDetector = new seeta::v6::FaceDetector(ModelSetting(modelPath + "face_detector.csta", deviceType));
faceDetector->set(FaceDetector::Property::PROPERTY_MIN_FACE_SIZE, faceSize);
faceDetector->set(FaceDetector::Property::Property::PROPERTY_THRESHOLD, threshold);
faceDetector->set(FaceDetector::Property::PROPERTY_MAX_IMAGE_WIDTH, maxWidth);
faceDetector->set(FaceDetector::Property::PROPERTY_MAX_IMAGE_HEIGHT, maxHeight);
return faceDetector;
}
После использования объекта FaceDetector, он освобождается в методе Dispose в FaceDetector с помощью вызова Native функции DisposeFaceDetector.
View_Api void DisposeFaceDetector(seeta::v6::FaceDetector *handler)
{
_dispose(handler);
}
Таким образом, при написании кода необходимо использовать оператор using или вызывать метод Dispose для освобождения объекта после его использования. Создание и освобождение объектов SeetaFace6 может занять некоторое время, включая загрузку модели и вычисления, поэтому рекомендуется повторно использовать объекты и использовать пул объектов, когда часто требуется создавать новые объекты.
Повторное использование объектов также связано с проблемой безопасности потоков. Подробнее о безопасности потоков см. в следующем разделе.
4.4.2 Безопасность потоков Безопасность потоков — ещё одна важная характеристика разработки, которая может иметь разные интерпретации в разных контекстах. Чтобы избежать недоразумений, здесь используются несколько примеров использования распознавателя для объяснения использования.
4.4.3 Инициализация конфигурации В некоторых сценариях, таких как отсутствие поддержки инструкций AVX2 или необходимость получения внутреннего журнала, настройки по умолчанию могут быть недостаточными. Для этого предоставляется глобальная конфигурация GlobalConfig, и в этом разделе будут подробно описаны поддерживаемые функции.
4.4.3.1 Вывод внутреннего журнала В производственной среде или в некоторых неудобных для отладки сценариях внутренний журнал может предоставить неожиданные результаты при возникновении необъяснимых проблем.
static void Config()
{
//打印内部日志
GlobalConfig.SetLog((msg) =>
{
Console.WriteLine($"[内部日志]{msg}");
});
}
4.4.3.2 Поддержка конкретных наборов инструкций По умолчанию x86 среда использует поддержку распознавания нейронной сети tennis для инструкций AVX2 и FMA. Однако на некоторых процессорах с низким энергопотреблением, таких как Intel J-Series и N-Series, AVX2 был удалён. При запуске на этих процессорах, которые не поддерживают AVX2 или FMA, может возникнуть исключение: 0x00007FFC3FDD104E (tennis.dll) (ConsoleApp1.exe 中)处有未经处理的异常: 0xC000001D: IllegInstruction. Причина в том, что в tennis используются неподдерживаемые наборы инструкций. В следующей таблице приведены соответствующие наборы инструкций для файлов tennis.
Файл | Набор инструкций | Описание |
---|---|---|
tennis.dll | AVX2, FMA | По умолчанию |
tennis_haswell.dll | AVX2, FMA | |
tennis_sandy_bridge.dll | AVX2 | |
tennis_pentium.dll | SSE2 |
ViewFaceCore позволяет принудительно использовать конкретный набор инструкций через глобальный конфигурационный параметр.
Пример:
static void Config()
{
// Устанавливаем поддержку только SSE2 набора инструкций
GlobalConfig.SetInstruction(X86Instruction.SSE2);
}
Обратите внимание, что необходимо установить поддержку набора инструкций до инициализации любого API, иначе это будет неэффективно.
Таблица содержит общие параметры конфигурации, которые могут использоваться всеми API. Некоторые параметры могут не иметь эффекта.
Параметр конфигурации | Тип | Значение по умолчанию | Описание |
---|---|---|---|
DeviceType | Перечисление; поддерживает значения: AUTO, CPU, GPU | AUTO | Определяет тип используемого устройства для обнаружения. В настоящее время поддерживается только CPU. Для использования GPU требуется самостоятельная компиляция TenniS |
API для обнаружения живого человека. Детектор живого человека может загружать локальную модель обнаружения или локальную модель + глобальную модель. Используйте параметр Global для различения, значение по умолчанию — True. При использовании локальной модели необходимо установить модель ViewFaceCore.model.fas_second. При использовании локальной модели + глобальной модели необходимо установить модели ViewFaceCore.model.fas_first и ViewFaceCore.model.fas_second.
Параметры конфигурации FaceAntiSpoofingConfig
Параметр конфигурации | Тип | Значение по умолчанию | Описание |
---|---|---|---|
VideoFrameCount | int | 10 | Устанавливает количество видеокадров для PredictVideo. Обычно при количестве кадров менее 10 результаты более стабильны, а производительность лучше, но задержка получения результатов выше. |
BoxThresh | float | 0.8 | Порог для оценки наличия атакующего материала. Чем выше этот порог, тем строже требования к атакующему материалу. |
Threshold | FaceAntiSpoofingConfigThreshold | (0.3, 0.8) | Во время обнаружения живого человека, если чёткость низкая, сразу возвращается FUZZY. Если чёткость соответствует порогу, оценивается реальность. Если реальность превышает порог, считается, что это живой человек, в противном случае — атака. |
Global | bool | true | Включает глобальную модель обнаружения. На платформе Linux существует ошибка, и значение не может быть установлено на FALSE. |
FaceAntiSpoofingConfigThreshold:
Параметр конфигурации | Тип | Значение по умолчанию | Описание |
---|---|---|---|
Clarity | float | 0.3 | Чёткость (clarity). Если чёткость низкая, то сразу возвращается FUZZY |
Reality | float | 0.8 | Реальность (reality). Если реальность выше порога, считается живым человеком, в противном случае — атакой. |
AntiSpoofing Обнаружение живого человека в одном кадре.
public AntiSpoofingResult AntiSpoofing(FaceImage image, FaceInfo info, FaceMarkPoint[] points)
Входящие параметры:
Имя | Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
image | FaceImage | объект | - | Данные изображения |
info | FaceInfo | объект | - | Информация о лице |
points | FaceMarkPoint [] | структура массива | - | Ключевые точки |
Выход AntiSpoofingResult:
Параметры | Тип | Значение по умолчанию | Описание |
---|---|---|---|
AntiSpoofingStatus | перечисление | - | Ошибка (ошибка или отсутствие лица в индексе лица), Real (реальное лицо), Spoof (атака лица (поддельное лицо)), Fuzzy (невозможно определить (качество изображения лица плохое)), Detecting (в процессе обнаружения) |
Чёткость | float | - | Чёткость |
Реальность | float | - | Реальность |
Пример вызова Обнаружение живого человека в одном кадре.
static void AntiSpoofingDemo()
{
using var bitmap = SKBitmap.Decode(imagePath0);
using FaceDetector faceDetector = new FaceDetector();
using FaceLandmarker faceMark = new FaceLandmarker();
using FaceAntiSpoofing faceAntiSpoofing = new FaceAntiSpoofing();
var info = faceDetector.Detect(bitmap).First();
var markPoints = faceMark.Mark(bitmap, info);
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
var result = faceAntiSpoofing.AntiSpoofing(bitmap, info, markPoints);
Console.WriteLine($"Обнаружение живого человека, результат: {result.Status}, чёткость:{result.Clarity}, реальность:{result.Reality}, затраченное время: {sw.ElapsedMilliseconds} мс");
sw.Stop();
Console.WriteLine();
}
AntiSpoofingVideo Распознавание видеокадров.
public AntiSpoofingResult AntiSpoofingVideo(FaceImage image, FaceInfo info, FaceMarkPoint[] points)
Использование аналогично предыдущему.
Детектирование лиц, ввод изображения для проверки, вывод положения каждого обнаруженного лица в виде прямоугольника. Для детектора лиц требуется модель ViewFaceCore.model.face_detector. Обычно все лица, обнаруженные детектором, возвращаются в порядке убывания достоверности.
Параметры конфигурации FaceDetectConfig
Параметр конфигурации | Тип | Значение по умолчанию | Описание |
---|---|---|---|
FaceSize | int | 20 | Минимальный размер лица. Размер лица тесно связан с производительностью детектора. Рекомендуется устанавливать как можно большее значение в пределах диапазона приложения. |
Порог | double | 0,9 | Порог детектора. Значение по умолчанию равно 0,9, допустимый диапазон — [0, 1]. Это значение обычно не регулируется, за исключением обработки некоторых экстремальных ситуаций. Чем меньше это значение, тем меньше вероятность пропуска, но тем больше вероятность ложного срабатывания. |
MaxWidth | int | 2000 | Максимальная ширина проверяемого изображения |
MaxHeight | int | 2000 | Максимальная высота проверяемого изображения |
Дополнительные сведения см.: http://leanote.com/blog/post/5e7d6cecab64412ae60016ef#title-14
Detect Детектирование информации о лицах.
public FaceInfo[] Detect(FaceImage image)
Входные параметры:
Имя | Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
изображение | FaceImage | объект | — | Данные изображения лица |
Выходные данные: | Параметры | Тип | Значение по умолчанию | Описание | | --- | --- | --- | --- | FaceInfo
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
Score | float | - | Доверие к распознаванию лица |
Location | FaceRect | - | Расположение лица |
FaceRect
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
X | int | - | Координата x левого верхнего угла прямоугольника |
Y | int | - | Координата y левого верхнего угла прямоугольника |
Width | int | - | Ширина прямоугольника |
Height | int | - | Высота прямоугольника |
Пример вызова
Распознавание и маркировка лиц.
using System;
using System.Drawing;
using System.Linq;
using ViewFaceCore;
using ViewFaceCore.Core;
using ViewFaceCore.Model;
namespace Demo
{
internal class Program
{
private readonly static string imagePath = @"images/Jay_3.jpg";
private readonly static string outputPath = @"images/Jay_out.jpg";
static void Main(string[] args)
{
using var bitmap = (Bitmap)Image.FromFile(imagePath);
using FaceDetector faceDetector = new FaceDetector();
FaceInfo[] infos = faceDetector.Detect(bitmap);
// Вывод информации о лицах
Console.WriteLine($"Количество распознанных лиц: {infos.Length} \n");
Console.WriteLine($"№\tДоверие к распознаванию\tИнформация о расположении лица");
for (int i = 0; i < infos.Length; i++)
{
Console.WriteLine($"{i}\t{infos[i].Score:f8}\t{infos[i].Location}");
}
// Рисование прямоугольников для маркировки лиц
using (Graphics g = Graphics.FromImage(bitmap))
{
g.DrawRectangles(new Pen(Color.Red, 4), infos.Select(p => new RectangleF(p.Location.X, p.Location.Y, p.Location.Width, p.Location.Height)).ToArray());
}
bitmap.Save(outputPath);
Console.WriteLine($"Сохранено в: {outputPath}");
Console.WriteLine();
}
}
}
На вход подаются исходное изображение и результаты распознавания лиц, на выходе — координаты ключевых точек на заданном лице.
В данном случае определяются координаты пяти точек: левый глаз, правый глаз, нос, левый угол рта и правый угол рта. Здесь «левый» и «правый» относятся к расположению на изображении, а не к человеку на нём.
Конфигурация FaceLandmarkConfig
Конфигурация | Тип | Значение по умолчанию | Описание |
---|---|---|---|
MarkType | Перечисление | Light | Тип модели для определения ключевых точек |
Перечисление MarkType:
Значение перечисления | Выбранная модель | Описание |
---|---|---|
Normal | ViewFaceCore.model.face_landmarker_pts68 | Модель для определения 68 ключевых точек |
Light | ViewFaceCore.model.face_landmaker_pts5 | Модель для определения пяти ключевых точек |
Mask | ViewFaceCore.model.face_landmarker_mask_pts5 | Модель для определения пяти ключевых точек при наличии маски на лице |
Следует отметить:
Ключевые точки — это координаты определённых мест на лице. В некоторых описаниях ключевые точки также называют особенностями лица, но это не связано с концепцией особенностей, используемых в распознавании лиц. Нет однозначного вывода, что чем больше ключевых точек определено, тем выше точность распознавания лица.
Обычно для распознавания используется определение пяти ключевых точек. Алгоритм уже определён, и изменить его нельзя. Пяти ключевых точек достаточно для удовлетворения требований к точности распознавания и других связанных анализов. Увеличение количества ключевых точек только усложняет алгоритм, не влияя на результат.
Источник: вводный курс 2.2 Распознаватель ключевых точек лица http://leanote.com/blog/post/5e7d6cecab64412ae60016ef#title-15
Mark
public FaceMarkPoint[] Mark(FaceImage image, FaceInfo info)
Входные параметры:
Имя | Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
image | FaceImage | объект | — | Данные об изображении лица |
info | FaceInfo | структура | — | Информация о лице |
Выходные параметры:
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
FaceMarkPoin[] | массив структур | — | Координаты ключевых точек, упорядоченные следующим образом: левый глаз, правый глаз, нос, левый уголок рта, правый уголок рта |
Структура FaceMarkPoin
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
X | int | — | Координата x верхнего левого угла |
Y | int | — | Координата y верхнего левого угла |
Пример вызова
Распознать лицо и отметить ключевые точки.
static void FaceMarkDemo()
{
using var bitmap0 = SKBitmap.Decode(imagePath0);
using var faceImage = bitmap0.ToFaceImage();
using FaceDetector faceDetector = new FaceDetector();
using FaceLandmarker faceMark = new FaceLandmarker();
Stopwatch sw = new Stopwatch();
var infos = faceDetector.Detect(faceImage);
var markPoints = faceMark.Mark(faceImage, infos[0]);
sw.Stop();
Console.WriteLine($"Определено {markPoints.Length} ключевых точек, затраченное время: {sw.ElapsedMilliseconds} мс");
foreach (var item in markPoints)
{
Console.WriteLine($"X:{item.X}, Y:{item.Y}");
}
Console.WriteLine();
}
``` **FaceRecognizer (распознавание лиц)**
Распознавание лиц — это базовая концепция, которая заключается в преобразовании распознаваемого лица в двоичные данные с помощью обработки и последующем сравнении сходства на основе представления характеристик лица. В конечном итоге сравнивается с порогом сходства, и если он превышает порог, считается, что лицо, представленное характеристиками, принадлежит одному и тому же человеку.
**Конфигурация FaceRecognizeConfig**
| Конфигурация | Тип | Значение по умолчанию | Описание |
| ------------ | ------------ | ------------ | ------------ |
| FaceType | перечисление | Normal | Модель распознавания лиц |
| Threshold | порог | FaceType.Normal: 0,62, FaceType.Mask: 0,4, FaceType.Light: 0,55 | Различные модели распознавания лиц имеют разные значения по умолчанию |
В конфигурации Threshold является частной переменной, которую необходимо получить с помощью метода GetThreshold и установить с помощью SetThreshold.
**Извлечение**
Извлечение признаков.
```csharp
public float[] Extract(FaceImage image, FaceMarkPoint[] points)
Параметры:
Имя | Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
image | FaceImage | объект | - | Информация о лицевом изображении |
points | Массив FaceMarkPoint | - | Точки маркировки лица, полученные с помощью FaceLandmarker.Mark |
Возвращаемое значение:
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
float[] | массив | - | Значения признаков |
Значения признаков после извлечения представляют собой массив float. После извлечения значений признаков они сравниваются с другими значениями признаков лица с использованием метода Compare, а способ сравнения признаков представляет собой внутреннее произведение вектора.
Сравнение
Вычисление сходства.
public float Compare(float[] lfs, float[] rfs)
Параметры:
Имя | Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
lfs | float[] | массив | - | Значения признаков |
rfs | float[] | массив | - | Значения признаков |
Возвращаемое значение:
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
float | float | - | Сходство признаков |
IsSelf
Определение того, является ли это одним и тем же человеком.
public bool IsSelf(float similarity)
или
public bool IsSelf(float[] lfs, float[] rfs)
Параметры:
Имя | Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
lfs | float[] | массив | - | Значения признаков |
rfs | float[] | массив | - | Значения признаков |
Или
Имя | Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|---|
similarity | float | float | - | Сходство признаков |
Сравнивается с установленным порогом, и если оно больше порога, то это один и тот же человек.
Возвращаемое значение:
Параметр | Тип | Значение по умолчанию | Описание |
---|---|---|---|
bool | bool | - | true для одного и того же человека, false для разных людей |
Пример использования
После извлечения признаков двух изображений лица определите, являются ли лица на двух изображениях одинаковыми людьми.
static void FaceRecognizerDemo()
{
Stopwatch sw = Stopwatch.StartNew();
sw.Start();
using var faceImage0 = SKBitmap.Decode(imagePath0).ToFaceImage();
using var faceImage1 = SKBitmap.Decode(imagePath1).ToFaceImage();
// Обнаружение информации о лицах
using FaceDetector faceDetector = new FaceDetector();
FaceInfo[] infos0 = faceDetector.Detect(faceImage0);
FaceInfo[] infos1 = faceDetector.Detect(faceImage1);
// Маркировка положения лица
using FaceLandmarker faceMark = new FaceLandmarker();
FaceMarkPoint[] points0 = faceMark.Mark(faceImage0, infos0[0]);
FaceMarkPoint[] points1 = faceMark.Mark(faceImage1, infos1[0]);
// Извлечение значений признаков
using FaceRecognizer faceRecognizer = new FaceRecognizer();
float[] data0 = faceRecognizer.Extract(faceImage0, points0);
float[] data1 = faceRecognizer.Extract(faceImage1, points1);
// Сравнение значений признаков
bool isSelf = faceRecognizer.IsSelf(data0, data1);
Console.WriteLine($"Распознано ли лицо как одно и то же лицо: {isSelf}, время сравнения: {sw.ElapsedMilliseconds}ms");
Console.WriteLine();
sw.Stop();
}
Отслеживание лиц используется для определения того, какие люди в видеопоследовательности являются одними и теми же людьми, и получения местоположения лица в видео. Результаты отслеживания лиц (FaceTrackInfo) могут быть непосредственно преобразованы в использование FaceInfo.
FaceTrackInfo по сравнению с FaceInfo добавляет поле PID, которое является номером личности, и если отслеживанию присвоен один и тот же PID, можно считать, что лица с одинаковым PID принадлежат одному и тому же лицу.
Для получения дополнительной информации см.: http://leanote.com/blog/post/5e7d6cecab64412ae60016ef#title-29
Конфигурационный файл FaceTrackerConfig
Конфигурация | Тип | Значение по умолчанию | Описание |
---|---|---|---|
Width | int | - | Ширина видео |
Height | int | - | Высота видео |
MinFaceSize | int | 20 | Установите размер обнаруживаемого лица, который равен квадратному корню из произведения ширины и высоты лица. Производительность детектора тесно связана с минимальным размером лица. Основные аспекты включают скорость, и мы рекомендуем устанавливать это значение в пределах диапазона приложения. Это значение должно быть как можно больше. |
Threshold | float | 0,9 | Порог детектора. Разумный диапазон составляет [0, 1]. Обычно это значение не регулируется, за исключением случаев, когда обрабатываются некоторые экстремальные ситуации. Чем меньше это значение установлено, тем меньше вероятность пропуска обнаружения, но тем выше вероятность ложного обнаружения. |
Stable | bool | false | Выполнять ли интерполяцию результатов обнаружения между кадрами, чтобы результаты обнаружения выглядели лучше визуально. |
Interval | int | 10 | Интервал обнаружения |
Конфигурация FaceTrackerConfig должна указывать ширину и высоту видео, которые не могут быть пустыми.
Отслеживание
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )