Java - 带有轮廓的 Android Mobile Vision 人脸检测

Posted

技术标签:

【中文标题】Java - 带有轮廓的 Android Mobile Vision 人脸检测【英文标题】:Java - Android Mobile Vision face detection with contours 【发布时间】:2019-08-04 10:37:47 【问题描述】:

我正在试验 Mobile Vision API 的人脸检测。我正在尝试获取面部地标的轮廓。但是在构建 FaceDetector 时,它给了我这个例外:

E/androidRuntime: FATAL EXCEPTION: main
    Process: com.example.camera2tut, PID: 27106
    java.lang.IllegalArgumentException: Invalid build options

FaceDetector 告诉我“非自拍模式不支持轮廓”。这是我设置 FaceDetector 的代码:

import com.google.android.gms.vision.face.FaceDetector;
[...]
mFaceDetector = new FaceDetector.Builder(this)
            .setTrackingEnabled(true)
            .setMinFaceSize((float)0.4)
            .setLandmarkType(FaceDetector.CONTOUR_LANDMARKS)
            .setClassificationType(FaceDetector.NO_CLASSIFICATIONS)
            .setProminentFaceOnly(true)
            .setMode(FaceDetector.ACCURATE_MODE)
            .build();

对于 FaceDetector.Builder,没有设置“自拍模式”的选项: https://developers.google.com/android/reference/com/google/android/gms/vision/face/FaceDetector.Builder

尽管 FaceDetector 有一个常量 SELFIE_MODE: https://developers.google.com/android/reference/com/google/android/gms/vision/face/FaceDetector

从这个常量的描述来看,.setProminentFaceOnly(true) 似乎最接近自拍模式,但似乎并没有启用它。

如果我只用.setLandmarkType(FaceDetector.ALL_LANDMARKS) 检测地标,就可以构建检测器。但是怎么用这种不祥的“自拍”模式,轮廓怎么弄?

【问题讨论】:

您是否设法让面部轮廓发挥作用? 还没有,见下文。 它正在工作。在下面查看我的答案 【参考方案1】:

你试过了吗

.setMode(FaceDetector.SELFIE_MODE)

【讨论】:

我已经尝试过使用与上述类似的配置。但是,我仍然没有从面部检测器中得到任何轮廓。如果您查看 FaceDetector.Builder setMode 的文档,它实际上并没有说您可以使用 SELFIE_MODE。 developers.google.com/android/reference/com/google/android/gms/… 感谢您向我指出这一点,@hsienting!它似乎不在文档中,出于某种原因,我忽略了它与 Android Studio 一起使用。但是,它仍然无法正常工作。我现在使用这两个选项:'.setLandmarkType(FaceDetector.CONTOUR_LANDMARKS)'、'.setMode(FaceDetector.SELFIE_MODE)',并且我禁用了分类,因为轮廓显然不能与它们一起使用,但我的轮廓列表是空的.我现在可以初始化人脸检测器,但这并没有给我任何帮助:'List faceContours = face.getContours();' 有其他人注意到更新了吗?我正在使用“...gms:play-services-vision:17.0.2”。面部区域现在是正方形(相对于矩形)。我似乎可以通过在 Play 商店中主动搜索更新来强制在其他设备上进行此更改。我似乎也无法在同一个应用程序的两个活动中使用面部跟踪器,即初始化面部跟踪器,在活动暂停时释放它,然后在我切换到的另一个活动中重新初始化它。我没有收到错误,但它不会在第二个活动中检测到任何面孔。我现在的项目真的需要这个选项。【参考方案2】:

像这样创建您的检测器:

new FaceDetector.Builder(ctx).setTrackingEnabled(true) //can be false too
.setLandmarkType(FaceDetector.CONTOUR_LANDMARKS)
.setMode(FaceDetector.SELFIE_MODE)
.setProminentFaceOnly(true)
.build();
如果需要完整的代码来捕获轮廓点,请告诉我。 我的毕业生:
implementation 'com.google.firebase:firebase-ml-vision:24.0.3'

【讨论】:

以上是关于Java - 带有轮廓的 Android Mobile Vision 人脸检测的主要内容,如果未能解决你的问题,请参考以下文章

openCV android 获取描绘物体轮廓的点坐标

在Java中用轮廓绘制字符串有啥更好的方法吗?

关于计算机学习的书(doc,mobi,epub,pdf四种格式)

带有弯曲边缘的 Android 矩形

将带有 PostScript 轮廓的 OpenTypeFonts 转换为 TrueType 字体

带有文本笔画/轮廓的 UIButton