ViewFaceCore

C# 超简单的离线人脸识别库。( 基于 SeetaFace6 )

MIT License

Stars
781
Committers
3

ViewFaceCore

      GitHub stars    GitHub forks

 |  |  | API  |  |  |

1.

2.

2.1 .NET

.NET Framework 4.0 win ( x64/x86 )
.NET Standard 2.0 win ( x64/x86 )
.NET / .NET Core 3.15.06.07.0 win ( x64/x86 )linux ( arm/arm64/x64 )

2.2

Windows x64 Demo

  1. nuget
ViewFaceCore ViewFaceCore .NET
ViewFaceCore.all_models viewfacecore\models ()
ViewFaceCore.runtime.win.x64 viewfacecore\win\x64 Windows-x64
ViewFaceCore.Extension.SkiaSharp SkiaSharpImageSharpSkiaSharpSystem.Drawing
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();
        }
    }
}

Demo

3.

3.1

Bridges                                        #Bridges
  Linux                                       ##LinuxViewFaceBridge
  Shared                                      ##
  Windows                                     ##LinuxViewFaceBridge
Examples                                       #
  ViewFaceCore.Demo.ConsoleApp                ##
  ViewFaceCore.Demo.VideoForm                 ##Winform
  ViewFaceCore.Demo.WebApp                    ##ASP.NET Core web
Extensions                                     #
  ViewFaceCore.Extension.DependencyInjection  ##
  ViewFaceCore.Extension.ImageSharp           ##ImageSharp
  ViewFaceCore.Extension.Shared               ##
  ViewFaceCore.Extension.SkiaSharp            ##SkiaSharp
  ViewFaceCore.Extension.SystemDrawing        ##System.Drawing
Models                                         #
Runtimes                                       #
SeetaFace
  index                                       #SeetaFacebuild
Tests                                          #
ViewFaceCore                                   #ViewFaceCore

3.2

3.3 SeetaFace6

3.3.1 SeetaFace6~~~

SeetaFace6src/SeetaFace/index https://github.com/ViewFaceCore/SeetaFace6OpenBinary/releases

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

https://github.com/ViewFaceCore/ViewFaceCore/blob/main/docs/SeetaFace_Build.md

3.4 SeetaFaceBridge

3.4.1 WindowsSeetaFaceBridge

3.3.13.3.2SeetaFace6VS->SeetaFaceBridge

3.4.2 LinuxSeetaFaceBridge

3.3.13.3.2SeetaFace6 LinuxSeetaFaceBridgeWSLRemote Linuxbuilding~

3.5 ViewFaceCore

C#Hello World

4.

4.1 Runtime

SeetaFace6ViewFaceBridgeC#C++SeetaFace6nugetnugetwindows x64nugetViewFaceCore.runtime.win.x64runtimeruntime nuget

Nuget
ViewFaceCore.runtime.win.x64 viewfacecore/win/x64 Windowsx64
ViewFaceCore.runtime.win.x86 viewfacecore/win/x86 Windowsx86
ViewFaceCore.runtime.ubuntu.20.04.x64 viewfacecore/linux/x64 Linuxx64Ubuntu20.04+Debian10+Deepin20+debianLinux
ViewFaceCore.runtime.linux.arm viewfacecore/linux/arm Linuxarmhfnanopi
ViewFaceCore.runtime.linux.arm64 viewfacecore/linux/arm64 Linuxarm64nanopi

DirectoryNotFoundException: Can not found library path.runtimenuget

4.2

ViewFaceCore

Nuget
ViewFaceCore.Extension.SkiaSharp SkiaSharp
ViewFaceCore.Extension.ImageSharp ImageSharp
ViewFaceCore.Extension.SystemDrawing System.DrawingSystem.Drawing

4.3

1.3 http://leanote.com/blog/post/5e7d6cecab64412ae60016ef#title-11

nugetnuget nuget:

Nuget
ViewFaceCore.all_models 300MB
ViewFaceCore.model.age_predictor
ViewFaceCore.model.eye_state
ViewFaceCore.model.gender_predictor
ViewFaceCore.model.face_detector
ViewFaceCore.model.mask_detector
ViewFaceCore.model.face_landmarker_mask_pts5 5
ViewFaceCore.model.face_landmarker_pts5 5
ViewFaceCore.model.face_landmarker_pts68 68
ViewFaceCore.model.face_recognizer 68
ViewFaceCore.model.face_recognizer_light 5
ViewFaceCore.model.face_recognizer_mask
ViewFaceCore.model.fas_first
ViewFaceCore.model.fas_second
ViewFaceCore.model.pose_estimation
ViewFaceCore.model.quality_lbn

4.4

4.4.1

C#GCC#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.");
    }
}

NativeC++ViewFaceBridgeGetFaceDetectorHandlerSeetaFace6seeta::v6::FaceDetectorIntPtr ViewFaceBridgeGetFaceDetectorHandler

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_THRESHOLD, threshold);
	faceDetector->set(FaceDetector::Property::PROPERTY_MAX_IMAGE_WIDTH, maxWidth);
	faceDetector->set(FaceDetector::Property::PROPERTY_MAX_IMAGE_HEIGHT, maxHeight);
	return faceDetector;
}

FaceDetectorDisposeNativeDisposeFaceDetector``seeta::v6::FaceDetector

View_Api void DisposeFaceDetector(seeta::v6::FaceDetector *handler)
{
	_dispose(handler);
}

using``DisposeSeetaFace6

4.4.2

1.12 2. 3. 1.5 http://leanote.com/blog/post/5e7d6cecab64412ae60016ef#title-11

SeetaFace6

4.4.3

AVX2GlobalConfig

4.4.3.1
static void Config()
{
    //
    GlobalConfig.SetLog((msg) =>
    {
        Console.WriteLine($"[]{msg}");
    });
}
4.4.3.2

x86AVX2FMAtennisCPUIntelJNAVX2AVX2FMACPU0x00007FFC3FDD104E (tennis.dll) (ConsoleApp1.exe ): 0xC000001D: IllegInstruction tennistennis

tennis.dll AVX2FMA
tennis_haswell.dll AVX2FMA
tennis_sandy_bridge.dll AVX2
tennis_pentium.dll SSE2

tennisViewFaceCoretennis

static void Config()
{
    //SSE2
    GlobalConfig.SetInstruction(X86Instruction.SSE2);
}

API

5. ViewFaceCore API

5.1 API

API

DeviceType AUTOCPUGPU AUTO CPUGPUTenniS

5.2 FaceAntiSpoofing

API +``Global``True` ViewFaceCore.model.fas_second +ViewFaceCore.model.fas_firstViewFaceCore.model.fas_second`

FaceAntiSpoofingConfig

VideoFrameCount int 10 PredictVideo10
BoxThresh float 0.8
Threshold FaceAntiSpoofingConfigThreshold (0.3, 0.8) (clarity)FUZZYreality
Global bool true LinuxbugFALSE

FaceAntiSpoofingConfigThreshold

Clarity float 0.3 (clarity)(clarity)FUZZY
Reality float 0.8 (clarity)

AntiSpoofing

public AntiSpoofingResult AntiSpoofing(FaceImage image, FaceInfo info, FaceMarkPoint[] points)
image FaceImage object -
info FaceInfo object -
points FaceMarkPoint[] struct -

AntiSpoofingResult

AntiSpoofingStatus - ErrorRealSpoofFuzzyDetecting
Clarity float -
Reality 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}ms");

    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
Threshold 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)
image FaceImage object -
FaceInfo struct -

FaceInfo

Score float -
Location FaceRect -

FaceRect

X int -
Y int -
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($"No.\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

5

FaceLandmarkConfig

MarkType Light

MarkType

Normal ViewFaceCore.model.face_landmarker_pts68 68
Light ViewFaceCore.model.face_landmarker_pts5 5
Mask ViewFaceCore.model.face_landmarker_mask_pts5

5555 2.2 http://leanote.com/blog/post/5e7d6cecab64412ae60016ef#title-15

Mark

public FaceMarkPoint[] Mark(FaceImage image, FaceInfo info) 
image FaceImage object -
info FaceInfo struct -
FaceMarkPoin[] struct -

FaceMarkPoin

X int -
Y int -

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}ms");
    foreach (var item in markPoints)
    {
        Console.WriteLine($"X:{item.X}, Y:{item.Y}");
    }
    Console.WriteLine();
}

5.5 FaceRecognizer

FaceRecognizeConfig

FaceType Normal
Threshold FaceType.Normal0.62FaceType.Mask0.4FaceType.Light0.55

ThresholdGetThreshold``SetThreshold

Extract

public float[] Extract(FaceImage image, FaceMarkPoint[] points)
image FaceImage object -
points FaceMarkPoint - FaceLandmarker.Mark
float[] array -

floatCompare

Compare

public float Compare(float[] lfs, float[] rfs)
lfs float[] array -
rfs float[] array -
float float -

IsSelf

public bool IsSelf(float similarity)

public bool IsSelf(float[] lfs, float[] rfs)
lfs float[] array -
rfs float[] array -
similarity float float -
bool bool - truefalse

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``FaceInfoPIDPIDPIDPID 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

Track

public FaceTrackInfo[] Track(FaceImage image)
image FaceImage struct -
FaceTrackInfo struct -

Reset ResetPID

public void Reset()
static void FaceTrackDemo()
{
    using var faceImage = SKBitmap.Decode(imagePath0).ToFaceImage();
    using FaceLandmarker faceMark = new FaceLandmarker();
    using FaceTracker faceTrack = new FaceTracker(new FaceTrackerConfig(faceImage.Width, faceImage.Height));
    var result = faceTrack.Track(faceImage);
    if (result == null || !result.Any())
    {
        Console.WriteLine("");
        return;
    }
    foreach (var item in result)
    {
        FaceInfo faceInfo = item.ToFaceInfo();
        //
        var points = faceMark.Mark(faceImage, faceInfo);
    }
}

5.7 MaskDetector

5.7.1

5.7.2

5.8 FaceQuality

5.9 AgePredictor

5.10 GenderPredictor

5.11 EyeStateDetector

6.

7.

  1. Unable to load DLL 'ViewFaceBridge' or one of its dependencies

    1. nugetviewfacecorewindows x64viewfacecorewin/x64*.dll
    2. vc++nugetViewFaceCore.runtime.win.vc.
  2. 0x00007FFC3FDD104E (tennis.dll) (ConsoleApp1.exe ): 0xC000001D: IllegInstruction https://github.com/ViewFaceCore/ViewFaceCore/tree/main#4432-%E7%89%B9%E5%AE%9A%E6%8C%87%E4%BB%A4%E9%9B%86%E6%94%AF%E6%8C%81

8.

Copyright (c) 2021, View | Copyright (c) 2019, SeetaTech

[] > SeetaFace [email protected]