Firebase MLKit Facedetection Slow для Android

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

Проблемы

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

Я пробовал использовать Mobile Vision 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) {
    }

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


person sanket Thakare    schedule 19.08.2019    source источник
comment
кто-нибудь, пожалуйста, помогите мне   -  person sanket Thakare    schedule 19.08.2019


Ответы (4)


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

Возможно, это улучшит скорость обнаружения

person Tejas    schedule 15.11.2019

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

person Never_be    schedule 24.10.2019

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

FirebaseVisionImage visionImage = FirebaseVisionImage.fromBitmap(bitmap);

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

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

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

person Ballenato    schedule 27.03.2020

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