| | | API | | |
.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 ) |
Windows x64 Demo
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
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
SeetaFace6src/SeetaFace/index https://github.com/ViewFaceCore/SeetaFace6OpenBinary/releases
src
SeetaFace
index
build
bin
x64
x86
cmake
include
lib
arm
arm64
x64
x86
lib64
https://github.com/ViewFaceCore/ViewFaceCore/blob/main/docs/SeetaFace_Build.md
3.3.13.3.2SeetaFace6VS->SeetaFaceBridge
3.3.13.3.2SeetaFace6 LinuxSeetaFaceBridgeWSLRemote Linuxbuilding~
C#Hello World
SeetaFace6ViewFaceBridgeC#C++SeetaFace6nugetnugetwindows x64nugetViewFaceCore.runtime.win.x64
runtimeruntime
nuget
DirectoryNotFoundException: Can not found library path.
runtimenuget
ViewFaceCore
Nuget | ||
---|---|---|
ViewFaceCore.Extension.SkiaSharp | SkiaSharp | |
ViewFaceCore.Extension.ImageSharp | ImageSharp | |
ViewFaceCore.Extension.SystemDrawing | System.DrawingSystem.Drawing |
1.3 http://leanote.com/blog/post/5e7d6cecab64412ae60016ef#title-11
nugetnuget nuget:
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++ViewFaceBridgeGetFaceDetectorHandler
SeetaFace6seeta::v6::FaceDetector
IntPtr
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;
}
FaceDetector
DisposeNativeDisposeFaceDetector``seeta::v6::FaceDetector
View_Api void DisposeFaceDetector(seeta::v6::FaceDetector *handler)
{
_dispose(handler);
}
using``Dispose
SeetaFace6
1.12 2. 3. 1.5 http://leanote.com/blog/post/5e7d6cecab64412ae60016ef#title-11
SeetaFace6
AVX2GlobalConfig
static void Config()
{
//
GlobalConfig.SetLog((msg) =>
{
Console.WriteLine($"[]{msg}");
});
}
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
API
DeviceType | AUTOCPUGPU | AUTO | CPUGPUTenniS |
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) | (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)
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
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();
}
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();
}
FaceTrackInfo``FaceInfo
FaceTrackInfo``FaceInfo
PIDPIDPIDPID
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);
}
}
Unable to load DLL 'ViewFaceBridge' or one of its dependencies
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
Copyright (c) 2021, View | Copyright (c) 2019, SeetaTech
[] >
SeetaFace
[email protected]