Firebase MLKit 人脸检测在 Android 上速度较慢

3

我想从图库图像(位图)中检测人脸。

问题

  1. 我发现Firebase MLKIT在图库图像位图上执行非常缓慢。
  2. 我是否仍可以使用移动视觉 API 检测图像中的人脸(我只想检测人脸,不需要眼睛、鼻子等)。
  3. 如何提高使用 Firebase MLKIT 检测人脸的性能。
  4. 我使用了 Firebase 图像标记。与人脸检测相比,Firebase 图像标记的执行速度很快,但人脸检测相对较慢。

我尝试使用移动视觉 API 成功地检测到了人脸。在移动视觉 API 的网站上,他们提到了Firebase MLKIT。 我还尝试了Firebase ML Kit,并成功检测到了人脸。我按照此链接进行演示: [https://github.com/hitanshu-dhawan/FirebaseMLKit]

库版本:

implementation 'com.google.firebase:firebase-core:17.0.1'
implementation 'com.google.firebase:firebase-ml-vision:22.0.0'
implementation 'com.google.firebase:firebase-ml-vision-face-model:18.0.0'
implementation 'com.google.firebase:firebase-ml-vision-image-label-model:18.0.0' 

    FirebaseVisionFaceDetectorOptions option =
     new FirebaseVisionFaceDetectorOptions.Builder()
    .setPerformanceMode(FirebaseVisionFaceDetectorOptions.ACCURATE)
    .setLandmarkMode(FirebaseVisionFaceDetectorOptions.ALL_LANDMARKS)
    .setClassificationMode(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
    .build();

    FirebaseVisionFaceDetector detector = FirebaseVision.getInstance()
                .getVisionFaceDetector(option);

        detector.detectInImage(image).addOnSuccessListener(
                new OnSuccessListener<List<FirebaseVisionFace>>() {
                    @Override
                    public void onSuccess(List<FirebaseVisionFace> faces) {
    }

我做错了什么吗?

4个回答

1

我认为你可以将

.setPerformanceMode(FirebaseVisionFaceDetectorOptions.ACCURATE)

换成

.setPerformanceMode(FirebaseVisionFaceDetectorOptions.FAST)

也许这样可以提高检测速度。


0
Firebase人脸检测器如果直接从位图实例化你的FirebaseVisionImage对象,会非常慢速。
FirebaseVisionImage visionImage = FirebaseVisionImage.fromBitmap(bitmap);

一个解决方案是将位图转换为字节数组(byte[]),然后使用另一个构造函数创建FirebaseVisionImage:
FirebaseVisionImage visionImage = FirebaseVisionImage.fromByteArray(byteArray, metadata);

这个事实似乎没有被记录下来。我在这个GitHub问题的评论中发现了它,并使用了建议的技术,将人脸检测时间缩短了约6倍。此外,在那个链接中还有一个代码片段,来自GitHub用户jllarraz,用于将位图转换为nv21字节数组。

0
我遇到了相同的问题,但是是与文本识别相关的,Android上速度非常慢,在华为Y6 2018上大约每秒处理1张图像,但在iOS上非常快,我可以在iPhone 6s上轻松运行10帧每秒。 我尝试了Firebase支持的所有图像格式,在我的测试中最快的变量是ByteBuffer,所以在开始识别之前我将Bitmap转换为ByteBuffer。

0

感谢以上的解决方案,但最终我成功地使用了非常快速的人脸检测器。我只是计算了位图的insamplesize并减小了位图的大小。由于位图大小非常小,能够更快地处理人脸检测,然后一旦我得到了坐标,再通过乘以insamplesize将该坐标映射到原始图像上。这样我就实现了使用FirebaseVisionFaceDetectorOptions进行图像处理的快速速度。以下是计算insamplesize的代码。

public static int calculateInSampleSize(
            BitmapFactory.Options options, int reqWidth, int reqHeight) {
    // Raw height and width of image
    final int height = options.outHeight;
    final int width = options.outWidth;
    int inSampleSize = 1;

    if (height > reqHeight || width > reqWidth) {

        final int halfHeight = height / 2;
        final int halfWidth = width / 2;

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while ((halfHeight / inSampleSize) >= reqHeight
                && (halfWidth / inSampleSize) >= reqWidth) {
            inSampleSize *= 2;
        }
    }

    return inSampleSize;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接