使用 Dlib.Net(FaceRecognition.Net) 检测人脸是否上下颠倒

问题描述 投票:0回答:3

基本上,我正在尝试使用此库检查图像中的脸部是否颠倒https://github.com/takuya-takeuchi/FaceRecognitionDotNet。 以下图为例

这是使用 FaceRecognition.Net 库成功检测到的图像。该图像是上下颠倒的。我已经用蓝色椭圆标记了图像中的所有面部标志。

这是我遵循的方法

 // Finding faceparts
var faceparts = dparameters._FaceRecognition.FaceLandmark(dparameters.FCImage);

// Drawing Ellipses over all points got from faceparts

foreach(var facepart in faceparts) {
  foreach(var mypoint in facepart.Values) {
    foreach(var x in mypoint) {
      tempg.DrawEllipse(Pens.Blue, x.Point.X, x.Point.Y, 2, 2);
    }
  }
}

现在我通过比较嘴唇和眼点的最大 Y 坐标来检查图像是否旋转

var temp = faceparts.FirstOrDefault();
IEnumerable < FacePoint > lippoints;
temp.TryGetValue(FacePart.BottomLip, out lippoints);

IEnumerable < FacePoint > eyepoints;
temp.TryGetValue(FacePart.LeftEye, out eyepoints);

var lippoint = lippoints.Max(r => r.Point.Y);
var topeyepoint = eyepoints.Max(r => r.Point.Y);
if (lippoint > topeyepoint) {
  bool isinverted = true;
} else {
  bool isinverted = false;
}

问题是,即使图像不是上下颠倒的,眼坐标也小于人脸坐标。这是因为图像中的轮廓检测到了假脸。如何解决这个问题?

c# .net face-detection dlib
3个回答
1
投票

看起来这个库没有提供结果的置信比。否则,我建议尝试输入及其翻转的副本,并在进行“眼高于嘴”检查之前以更高的置信度获取其中一个。

所以也许有帮助的是:

  • 使用CNN模型,在原始库中它被称为
face_locations = face_recognition.face_locations(image, number_of_times_to_upsample=0, model="cnn")

在 C# 端口中应该是

_FaceRecognition.FaceLocations(image, 0, Model.Cnn)

这应该会给你一个更准确的面部边界框,然后你可以将其与地标的边界框进行比较。如果您对图像的翻转副本执行相同的操作,则可以“模拟”我之前提到的置信度并假设框匹配得更好的方向。然后你可以通过“眼高于嘴”测试来识别方向。

  • 据我注意到,该库不提供预先训练的数据,因此为了使用
    Cnn
    模型,您需要自己训练它。训练数据集的选择当然非常重要。如果您已经进行了训练,更多/更好的训练数据可能会提高准确性。

1
投票

@Isolin建议方法的实现

尝试输入及其翻转副本,并以更高的置信度选择一个

可能如下所示。我使用库 FaceAiSharp (NuGet) 而不是 FaceRecognitionDotNet,因为它提供了所需的置信度值。请注意,此方法无法处理生产中可能感兴趣的某些情况,例如“如果根本没有(检测到)人脸怎么办?”。

dotnet new console
dotnet add package FaceAiSharp.Bundle
dotnet add package Microsoft.ML.OnnxRuntime

Program.cs

using FaceAiSharp;
using SixLabors.ImageSharp;
using SixLabors.ImageSharp.PixelFormats;
using SixLabors.ImageSharp.Processing;

bool IsUpsideDown(Image<Rgb24> img)
{
    var imgFlip = img.Clone(x => x.Flip(FlipMode.Vertical));

    var det = FaceAiSharpBundleFactory.CreateFaceDetector();
    var faces = det.DetectFaces(img);
    var facesFlip = det.DetectFaces(imgFlip);
    FaceDetectorResult? face = faces.Count > 0 ? faces.MaxBy(x => x.Confidence) : null;
    FaceDetectorResult? faceFlip = facesFlip.Count > 0 ? facesFlip.MaxBy(x => x.Confidence) : null;

    if (!faceFlip.HasValue)
    {
        return false;
    }

    if (!face.HasValue)
    {
        return true;
    }

    return (face.Value.Confidence < faceFlip.Value.Confidence);
}

var img1 = Image.Load<Rgb24>(@"face.jpg");

if (IsUpsideDown(img1))
{
    Console.WriteLine("Upside-down");
}
else
{
    Console.WriteLine("Normal");
}

免责声明:我是FaceAiSharp的作者。它是麻省理工学院许可的。如果某些内容不适合您或需要改进,请随时提出问题


0
投票

FaceKitpytorch-PCN 是检测旋转脸部的最佳替代方案。

它可以在pytorch或tensorflow和python下运行。它还给出了所有面的比例和角度。

© www.soinside.com 2019 - 2024. All rights reserved.