使用 Dlib.Net(FaceRecognition.Net) 检测人脸是不是倒置

Posted

技术标签:

【中文标题】使用 Dlib.Net(FaceRecognition.Net) 检测人脸是不是倒置【英文标题】:Detecting if a Face is Upside down with Dlib.Net(FaceRecognition.Net)使用 Dlib.Net(FaceRecognition.Net) 检测人脸是否倒置 【发布时间】:2021-08-26 05:19:28 【问题描述】:

基本上,我正在尝试使用此库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;

问题是即使图像没有倒置,眼睛坐标也小于人脸坐标。这是因为图像中检测到假脸。如何克服这个问题?

【问题讨论】:

【参考方案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 模型,您需要自己训练它。选择用于训练的数据集当然非常重要。如果您已经进行了训练,更多/更好的训练数据可能会提高准确性。

【讨论】:

我试过CNN 模型。但是使用这个模型会使库崩溃。你试过了吗? 不,我没有,抱歉我帮不上忙。

以上是关于使用 Dlib.Net(FaceRecognition.Net) 检测人脸是不是倒置的主要内容,如果未能解决你的问题,请参考以下文章

Dlib is a modern C++ toolkit(非常全面的类库)

在 Visual Studio 2012 中使用 dlib

Dlib - 如何使用 loss_mean_squared_multioutput 训练标签类型?

如何使用 dlib 训练或合并多个 .svm 并检测多个类

为啥 DLIB 计算 LBP 统一描述符的平方根?

为 python 安装 Dlib 库时出错