Firebase MLKit Facedetection Slow для Android
Я хочу обнаружить лицо из галереи изображений (растровое изображение).
вопросы
- Я заметил, что Firebase MLKIT работает очень медленно на растровом изображении галереи.
- Могу ли я по-прежнему использовать мобильный видение API для обнаружения лица на изображении (я хочу только обнаружить лицо, не хочу глаза, нос и т. Д.)
- Что я должен сделать, чтобы улучшить производительность для обнаружения лица с помощью Firebase MLKIT.
- Я использовал 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;
}