如何在人脸的两个点集之间添加度量以将其用于数字图像中的对象检测以进行人脸识别

Posted

技术标签:

【中文标题】如何在人脸的两个点集之间添加度量以将其用于数字图像中的对象检测以进行人脸识别【英文标题】:How to add metric between two point sets on face to use it for object detection in digital images for face recognization 【发布时间】:2015-12-19 00:48:27 【问题描述】:

我想在面部的两个点集之间添加度量以将其用于数字图像中的对象检测,我们将其限制为二维,如下所示

我可以使用如下图所示识别面部特征:

 -(void)markFaces:(UIImageView *)facePicture
 
     // draw a CI image with the previously loaded face detection picture
     CIImage* image = [CIImage imageWithCGImage:facePicture.image.CGImage];

     // create a face detector - since speed is not an issue we'll use a high accuracy
     // detector
     CIDetector* detector = [CIDetector detectorOfType:CIDetectorTypeFace
                                          context:nil options:     [NSDictionary dictionaryWithObject:CIDetectorAccuracyHigh forKey:CIDetectorAccuracy]];

     // create an array containing all the detected faces from the detector
     NSArray* features = [detector featuresInImage:image];

     // we'll iterate through every detected face.  CIFaceFeature provides us
     // with the width for the entire face, and the coordinates of each eye
     // and the mouth if detected.  Also provided are BOOL's for the eye's and
     // mouth so we can check if they already exist.
     for(CIFaceFeature* faceFeature in features)
     
         // get the width of the face
         CGFloat faceWidth = faceFeature.bounds.size.width;

         // create a UIView using the bounds of the face
         UIView* faceView = [[UIView alloc] initWithFrame:faceFeature.bounds];

         // add a border around the newly created UIView
         faceView.layer.borderWidth = 1;
         faceView.layer.borderColor = [[UIColor redColor] CGColor];

         // add the new view to create a box around the face
    [self.view addSubview:faceView];

         if(faceFeature.hasLeftEyePosition)
         
             // create a UIView with a size based on the width of the face
             UIView* leftEyeView = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.leftEyePosition.x-faceWidth*0.15, faceFeature.leftEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
             // change the background color of the eye view
             [leftEyeView setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
             // set the position of the leftEyeView based on the face
             [leftEyeView setCenter:faceFeature.leftEyePosition];

           // round the corners
             leftEyeView.layer.cornerRadius = faceWidth*0.15;
             // add the view to the window
             [self.view addSubview:leftEyeView];
         

         if(faceFeature.hasRightEyePosition)
         
             // create a UIView with a size based on the width of the face
             UIView* leftEye = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.rightEyePosition.x-faceWidth*0.15, faceFeature.rightEyePosition.y-faceWidth*0.15, faceWidth*0.3, faceWidth*0.3)];
             // change the background color of the eye view
             [leftEye setBackgroundColor:[[UIColor blueColor] colorWithAlphaComponent:0.3]];
             // set the position of the rightEyeView based on the face
             [leftEye setCenter:faceFeature.rightEyePosition];
             // round the corners
             leftEye.layer.cornerRadius = faceWidth*0.15;
             // add the new view to the window
             [self.view addSubview:leftEye];
              

         if(faceFeature.hasMouthPosition)
         
             // create a UIView with a size based on the width of the face
             UIView* mouth = [[UIView alloc] initWithFrame:CGRectMake(faceFeature.mouthPosition.x-faceWidth*0.2, faceFeature.mouthPosition.y-faceWidth*0.2, faceWidth*0.4, faceWidth*0.4)];
             // change the background color for the mouth to green
             [mouth setBackgroundColor:[[UIColor greenColor] colorWithAlphaComponent:0.3]];

             // set the position of the mouthView based on the face
             [mouth setCenter:faceFeature.mouthPosition];

              // round the corners
             mouth.layer.cornerRadius = faceWidth*0.2;

             // add the new view to the window
             [self.view addSubview:mouth];
              
          
      

      -(void)faceDetector
      
          // Load the picture for face detection
          //UIImageView* image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"facedetectionpic.jpg"]];
          UIImageView* image = [[UIImageView alloc] initWithImage:[UIImage imageNamed:@"timthumb.png"]];
          // Draw the face detection image
          [self.view addSubview:image];

          // Execute the method used to markFaces in background
          [self performSelectorInBackground:@selector(markFaces:) withObject:image];

          // flip image on y-axis to match coordinate system used by core image
          [image setTransform:CGAffineTransformMakeScale(1, -1)];

          // flip the entire window to make everything right side up
          [self.view setTransform:CGAffineTransformMakeScale(1, -1)];


      

现在我想在上传到数据库之前添加点来定位眼睛、鼻子等的参考。稍后可以根据这些度量点位置将这些图像与现有图像进行比较,如下所示

我已经推荐了This Link,但无法实现这个..如果有人知道这个请给我建议

谢谢

【问题讨论】:

【参考方案1】:

恐怕这并不简单。查看文档 CIDetector 不包括用于其他面部标志的检测器。您将需要在一组手动注释的图像上训练自己。有几个开源项目可以做到这一点。一个非常好的(准确和快速)是 dlib:http://blog.dlib.net/2014/08/real-time-face-pose-estimation.html

【讨论】:

感谢您的回复。但我想用objective c来实现这个 dlib 是一个 C++ 库,但您仍然可以在您的 Objective C 代码 (drdobbs.com/cpp/interoperating-between-c-and-objective-c/…) 中调用它。

以上是关于如何在人脸的两个点集之间添加度量以将其用于数字图像中的对象检测以进行人脸识别的主要内容,如果未能解决你的问题,请参考以下文章

iPhone不同的图像用于不同的标注

如何在我的文本上应用 z-index 以将其浮动在我的图像上

如何从天气 api 中提取此数字以将其转换为华氏温度?

javascript 此脚本可用于NR Synthetics,以将服务器度量标准复制到Insights事件中。

如何查找选择了哪个 ListView 项以将其添加到 ArrayList

测量系统 Roc 的性能