1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/view-face-core-ViewFaceCore

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README.md 47 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
gitlife-traslator Отправлено 28.11.2024 17:48 9cc7ebd

ViewFaceCore

Nuget    GitHub license    GitHub stars    GitHub forks


—— 💎 关于  | ⭐ 快速开始  | 📄 基本说明  | 🐟 API  | 🔎 参考文档  | ❓ 常见问题  | 📦 使用许可 ——

1. 关于

  • Это решение для распознавания лиц на основе SeetaFace6 .NET.
  • Проект вдохновлён SeetaFaceEngine.Net.
  • Открытый исходный код, бесплатный и кроссплатформенный (win/linux).

2. Быстрый старт

2.1 Поддерживаемые платформы .NET и операционные системы

Целевая платформа Минимальная версия Операционная система
.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)

2.2 Простое обнаружение информации о лице

Рассмотрим пример простого обнаружения лица на платформе Windows x64.

  1. Установите зависимости с помощью nuget:
Пакет Минимальная версия Папка генерации файлов Описание
ViewFaceCore Библиотека ядра ViewFaceCore .NET
ViewFaceCore.all_models viewfacecore\models Поддержка моделей для распознавания лиц (можно установить напрямую, чтобы упростить процесс)
ViewFaceCore.runtime.win.x64 viewfacecore\win\x64 Среда выполнения для Windows-x64, для других платформ выберите установку самостоятельно, можно установить несколько
ViewFaceCore.Extension.SkiaSharp Расширение SkiaSharp для обработки изображений, ImageSharp, SkiaSharp, System.Drawing — на выбор
  1. Получите информацию о лице:
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();
        }
    }
}

Дополнительные примеры можно найти в исходном коде.

3. Разработка

3.1 Структура проекта

├─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

3.3.2 Я хочу скомпилировать SeetaFace6

  1. Официальный способ компиляции SeetaFace6: Ссылка: https://github.com/SeetaFace6Open/index#%E7%BC%96%E8%AF%91%E4%BE%9D%E8%B5%96
  2. Использование скрипта компиляции в проекте: Ссылка: https://github.com/ViewFaceCore/ViewFaceCore/blob/main/docs/SeetaFace_Build.md

3.4 Компиляция SeetaFaceBridge

3.4.1 Компиляция SeetaFaceBridge в среде Windows

После завершения компиляции SeetaFace6 через 3.3.1 или 3.3.2 вы можете сразу построить SeetaFaceBridge, щёлкнув правой кнопкой мыши в VS.

3.4.2 Компиляция SeetaFaceBridge в среде Linux

Предварительным условием также является компиляция SeetaFace6. Существует три способа компиляции SeetaFaceBridge под Linux: WSL, удалённый Linux и кросс-компиляция. Вы можете выбрать наиболее удобный для вас способ. Сборка~

3.5 Компиляция ViewFaceCore

Это так же просто, как скомпилировать «Hello World» на C#.

4. Основные инструкции

4.1 Runtime для разных платформ

Для обеспечения совместимости с различными платформами мы пронумеровали SeetaFace6 и ViewFaceBridge (используется для вызова C++ SeetaFace6 из C#) для каждой платформы. Затем мы упаковали и опубликовали их на nuget. При использовании установите соответствующий пакет nuget для вашей платформы. Например, для установки пакета nuget ViewFaceCore.runtime.win.x64 на платформу Windows x64. Runtime можно установить несколько платформ одновременно, но по крайней мере необходимо установить runtime для текущей платформы. Поддерживаемые платформы и пакеты nuget приведены в следующей таблице:

Nuget пакет Версия Выходной каталог Описание
ViewFaceCore.runtime.win.x64 viewfacecore/win/x64 Windows, x64
ViewFaceCore.runtime.win.x86 viewfacecore/win/x86 Windows, x86
ViewFaceCore.runtime.ubuntu.20.04.x64 viewfacecore/linux/x64 Linux, x64; поддерживает Ubuntu20.04+, Debian10+ и более новые версии Debian-подобных систем Linux
ViewFaceCore.runtime.linux.arm viewfacecore/linux/arm Linux, armhf; поддерживает Raspberry Pi и аналогичные
ViewFaceCore.runtime.linux.arm64 viewfacecore/linux/arm64 Linux, arm64; поддерживает Raspberry Pi и аналогичные

При использовании, если возникает исключение типа DirectoryNotFoundException: Can not found library path., пожалуйста, проверьте, существует ли runtime в соответствующем каталоге. Иногда проблемы с сетью могут привести к сбою загрузки пакета nuget.

4.2 Графические библиотеки расширения

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 Безопасность потоков Безопасность потоков — ещё одна важная характеристика разработки, которая может иметь разные интерпретации в разных контекстах. Чтобы избежать недоразумений, здесь используются несколько примеров использования распознавателя для объяснения использования.

  1. Распознаватель можно передавать между потоками. Распознаватель, созданный в потоке 1, можно вызвать в потоке 2.
  2. Можно одновременно создавать распознаватели в нескольких потоках.
  3. Нельзя одновременно вызывать интерфейс одного объекта в нескольких потоках, то есть один объект нельзя использовать одновременно в нескольких потоках. Поскольку SeetaFace6 сам по себе не поддерживает многопоточные вызовы, библиотека ограничивает одновременные вызовы в каждом функциональном модуле, который не поддерживает параллельные операции. Можно считать, что каждый отдельный объект безопасен для потоков.

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, иначе это будет неэффективно.

5. ViewFaceCore API

5.1 Общие параметры конфигурации API

Таблица содержит общие параметры конфигурации, которые могут использоваться всеми API. Некоторые параметры могут не иметь эффекта.

Параметр конфигурации Тип Значение по умолчанию Описание
DeviceType Перечисление; поддерживает значения: AUTO, CPU, GPU AUTO Определяет тип используемого устройства для обнаружения. В настоящее время поддерживается только CPU. Для использования GPU требуется самостоятельная компиляция TenniS

5.2 FaceAntiSpoofing (обнаружение живого человека)

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)

Использование аналогично предыдущему.

5.3 FaceDetector (детектор лиц)

Детектирование лиц, ввод изображения для проверки, вывод положения каждого обнаруженного лица в виде прямоугольника. Для детектора лиц требуется модель 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();
        }
    }
}

5.4 FaceLandmarker (распознаватель ключевых точек лица)

На вход подаются исходное изображение и результаты распознавания лиц, на выходе — координаты ключевых точек на заданном лице.
В данном случае определяются координаты пяти точек: левый глаз, правый глаз, нос, левый угол рта и правый угол рта. Здесь «левый» и «правый» относятся к расположению на изображении, а не к человеку на нём.

Конфигурация 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();
}

5.6 FaceTracker (отслеживание лиц)

Отслеживание лиц используется для определения того, какие люди в видеопоследовательности являются одними и теми же людьми, и получения местоположения лица в видео. Результаты отслеживания лиц (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 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/view-face-core-ViewFaceCore.git
git@api.gitlife.ru:oschina-mirror/view-face-core-ViewFaceCore.git
oschina-mirror
view-face-core-ViewFaceCore
view-face-core-ViewFaceCore
main