【问题标题】:Detect Eye Blink Using Google Vision API使用 Google Vision API 检测眨眼
【发布时间】:2016-01-04 07:29:51
【问题描述】:

我正在使用视觉 API 进行人脸检测,现在我想实现眨眼,但是 Still vision api 在一只眼睛关闭时检测眼睛。

请帮助我如何实现眨眼功能。

【问题讨论】:

    标签: android google-play-services android-vision


    【解决方案1】:

    面部的“睁眼概率”值是检测眨眼的关键。此外,您可以使用 Tracker 随时间跟踪眼睛状态,以检测指示眨眼的事件序列:

    双眼睁开->双眼闭合->双眼睁开

    这是一个示例跟踪器:

    public class BlinkTracker extends Tracker<Face> {
      private final float OPEN_THRESHOLD = 0.85;
      private final float CLOSE_THRESHOLD = 0.15;
    
      private int state = 0;
    
      public void onUpdate(Detector.Detections<Face> detections, Face face) {
        float left = face.getIsLeftEyeOpenProbability();
        float right = face.getIsRightEyeOpenProbability();
        if ((left == Face.UNCOMPUTED_PROBABILITY) ||
            (right == Face.UNCOMPUTED_PROBABILITY)) {
          // At least one of the eyes was not detected.
          return;
        }
    
        switch (state) {
          case 0:
            if ((left > OPEN_THRESHOLD) && (right > OPEN_THRESHOLD)) {
              // Both eyes are initially open
              state = 1;
            }
            break;
    
            case 1:
              if ((left < CLOSE_THRESHOLD) && (right < CLOSE_THRESHOLD)) {
                // Both eyes become closed
                state = 2;
              }
              break;
    
            case 2:
              if ((left > OPEN_THRESHOLD) && (right > OPEN_THRESHOLD)) {
                // Both eyes are open again
                Log.i("BlinkTracker", "blink occurred!");
                state = 0;
              }
            break;
        }
      }
    
    }
    

    请注意,您还需要启用“分类”才能让检测器指示眼睛是否睁开/闭合:

    FaceDetector detector = new FaceDetector.Builder(context)
        .setClassificationType(FaceDetector.ALL_CLASSIFICATIONS)
        .build();
    

    然后添加跟踪器作为处理器,用于从检测器接收随时间推移的面部更新。例如,此配置将用于跟踪视野中最大的人脸是否眨眼:

    detector.setProcessor(
        new LargestFaceFocusingProcessor(detector, new BlinkTracker()));
    

    或者,如果您有兴趣检测所有面部(不仅仅是最大的面部)的眨眼,您可以使用 MultiProcessor 代替 LargestFaceFocusingProcessor。

    【讨论】:

      【解决方案2】:

      此答案假定您已经拥有运行检测面部的代码。

      Face 类有函数float getIsLeftEyeOpenProbability()float getIsRightEyeOpenProbability(),您可以在每一帧上使用它们来查找是否有一只眼睛眨了眨,如果一个函数返回一个大值而另一个返回一个较小的值价值。

      Face类的官方文档可以找到here

      【讨论】:

      • hello shiva...这是检测眨眼的正确方法吗?
      • @Sangha_development:理想情况下,这应该足够好,因为 android-vision 库中提供的 API 没有专门的函数来检测眨眼。所以你的实现应该能够处理所有边缘情况比如当值不是 EyeOpenProbility 时没有检测到它会默认为零等。
      【解决方案3】:

      here 是我使用 FaceDetectorAPi() 实现的眼部检测应用程序,测试时准确率超过 90%

      private double leftEyeOpenProbability = -1.0;
      private double rightEyeOpenProbability = -1.0;
      
      private boolean isEyeBlinked(){
      
          if(mFaces.size()==0)
              return false;
      
          Face face = mFaces.valueAt(0);
          float currentLeftEyeOpenProbability = face.getIsLeftEyeOpenProbability();
          float currentRightEyeOpenProbability = face.getIsRightEyeOpenProbability();
          if(currentLeftEyeOpenProbability== -1.0 || currentRightEyeOpenProbability == -1.0){
              return false;
          }
      
          if(leftEyeOpenProbability>0.9 || rightEyeOpenProbability > 0.9){
              boolean blinked = false;
              if(currentLeftEyeOpenProbability<0.6 || rightEyeOpenProbability< 0.6){
                  blinked = true;
              }
              leftEyeOpenProbability = currentLeftEyeOpenProbability;
              rightEyeOpenProbability = currentRightEyeOpenProbability;
              return blinked;
          }else{
              leftEyeOpenProbability = currentLeftEyeOpenProbability;
              rightEyeOpenProbability = currentRightEyeOpenProbability;
              return false;
          }
      }
      

      【讨论】:

      • 嘿murali,如果用户睁一只眼闭另一只眼,你的条件就不起作用了。但是如果你把||改成&amp;&amp;if(leftEyeOpenProbability&gt;0.9 &amp;&amp; rightEyeOpenProbability &gt; 0.9){就可以了。
      • 您好,我可以在 Web 应用程序中使用 eyeopenprobablity 功能吗?云视觉 api 是否支持此功能?
      • 我可以在 Web 应用程序中使用它吗?
      • @KaranAhuja 不,因为这是一个Android库,可能有相应的云api,但由于网络延迟,它不会实时
      猜你喜欢
      • 1970-01-01
      • 2015-11-27
      • 2015-12-11
      • 2012-11-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-28
      • 2023-04-02
      • 2019-03-14
      相关资源
      最近更新 更多