Firebase MLKit Facedetection Slow для Android

Я хочу обнаружить лицо из галереи изображений (растровое изображение).

вопросы

  1. Я заметил, что Firebase MLKIT работает очень медленно на растровом изображении галереи.
  2. Могу ли я по-прежнему использовать мобильный видение API для обнаружения лица на изображении (я хочу только обнаружить лицо, не хочу глаза, нос и т. Д.)
  3. Что я должен сделать, чтобы улучшить производительность для обнаружения лица с помощью Firebase MLKIT.
  4. Я использовал Firebase Image Labeling. Маркировка изображений в Firebase выполняется быстро, но сравнительно медленно распознавание лиц.

Я попробовал с помощью Mobile vision Api и успешно определил лицо. На сайте мобильного видения API, они упомянули о Firebase MLKIT. Я также попробовал комплект ML Firebase и успешно обнаружил лицо. Я пошел по этой ссылке для демонстрации: [ 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) {
    }

Я делаю что-то не так?

0 ответов

Я думаю, вы можете изменить .setPerformanceMode(FirebaseVisionFaceDetectorOptions.ACCURATE) на.setPerformanceMode(FirebaseVisionFaceDetectorOptions.FAST)

Может быть, это улучшит скорость обнаружения

У меня та же проблема, но с распознаванием текста, очень медленным на Android, около 1 изображения в секунду (Huawei Y6 2018), но невероятно быстрым на iOS, я легко могу запускать 10 кадров в секунду на iPhone 6s. Я пробовал все форматы изображений, которые поддерживает Firebase, во время моих тестов самый быстрый вариант - ByteBuffer, поэтому я конвертирую Bitmap в ByteBuffer перед началом распознавания.

Детектор лиц Firebase работает очень медленно, если вы создадите экземпляр своегоFirebaseVisionImage непосредственно из растрового изображения, как в:

FirebaseVisionImage visionImage = FirebaseVisionImage.fromBitmap(bitmap);

Решение состоит в том, чтобы преобразовать растровое изображение в массив байтов (byte[]) и используйте этот другой конструктор для создания FirebaseVisionImage:

FirebaseVisionImage visionImage = FirebaseVisionImage.fromByteArray(byteArray, metadata);

Этот факт не задокументирован. Я нашел это в комментарии к этой проблеме GitHub и использовал предложенную технику, сократив время обнаружения лиц примерно в 6 раз. Также в этой ссылке есть фрагмент кода от пользователя GitHubjllarraz преобразовать растровое изображение в nv21 байтовый массив.

Спасибо за вышеуказанное решение, но, наконец, я могу использовать детектор лиц очень быстро. Я просто вычисляю размер растрового изображения и уменьшаю размер растрового изображения. Поскольку размер растрового изображения очень мал, он может обрабатывать обнаружение лиц намного быстрее, а затем, как только я получил координату, снова сопоставьте эту координату с исходным изображением, умножив 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;
}
Другие вопросы по тегам