Обнаружение лиц Firebase ML Kit: не удалось получить идентификатор экземпляра - PullRequest
0 голосов
/ 27 мая 2020

Я пытался настроить Po C, где я обнаруживаю лица по прямой трансляции с камеры. Пока камера работает нормально, но распознавание лиц не запускается из-за следующей ошибки: W/FA: Failed to Retrieve Firebase Instance ID. Я проверил связанные вопросы, но, похоже, все они вращаются вокруг службы обмена сообщениями, которой я не пользуюсь.

Вот мои зависимости:

implementation fileTree(dir: 'libs', include: ['*.jar'])
annotationProcessor 'com.google.auto.value:auto-value:1.4'
implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
implementation 'androidx.appcompat:appcompat:1.1.0'
implementation 'androidx.core:core-ktx:1.2.0'
implementation 'com.google.android.material:material:1.1.0'
implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
implementation 'androidx.navigation:navigation-fragment-ktx:2.2.2'
implementation 'androidx.navigation:navigation-ui-ktx:2.2.2'
implementation 'androidx.legacy:legacy-support-v4:1.0.0'
implementation 'com.github.d-max:spots-dialog:1.1@aar'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'androidx.test.ext:junit:1.1.1'
androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'
implementation 'com.android.support:appcompat-v7:28.0.0'
implementation 'com.android.support:multidex:1.0.3'
implementation 'com.camerakit:camerakit:1.0.0-beta3.11'
implementation 'com.camerakit:jpegkit:0.1.0'
implementation 'org.jetbrains.kotlin:kotlin-stdlib-jdk7:1.3.72'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.0'
implementation 'com.google.firebase:firebase-analytics:17.4.2'
implementation 'com.google.firebase:firebase-ml-vision:24.0.3'
implementation 'com.google.firebase:firebase-ml-vision-face-model:20.0.1'

Вот мой код активности

 @Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_face_recognition);

    FirebaseOptions options = new FirebaseOptions.Builder()
            .setDatabaseUrl("https://mobile-fitness-787c0.firebaseio.com")
            .build();

    FirebaseApp.initializeApp(this, options);

    if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) !=
            PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(
                this,
                new String[] {Manifest.permission.CAMERA},
                50
        );
    }

    faceDetectButton = (Button)findViewById(R.id.capture_button);
    graphicOverlay = (GraphicOverlay)findViewById(R.id.graphic_overlay);
    cameraKitView = (CameraKitView)findViewById(R.id.camera_frame);

    alertDialog = new SpotsDialog.Builder()
            .setContext(this)
            .setMessage("Please wait, Loading...")
            .setCancelable(false).build();
    cameraKitView.setFacing(CameraKit.FACING_FRONT);
    cameraKitView.startVideo();


    faceDetectButton.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            cameraKitView.captureImage(new CameraKitView.ImageCallback() {
                @Override
                public void onImage(CameraKitView cameraKitView, byte[] bytes) {
                    alertDialog.show();
                    Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
                    Bitmap mutableBitmap = bmp.copy(Bitmap.Config.ARGB_8888, true);
                    mutableBitmap = Bitmap.createScaledBitmap(mutableBitmap,
                            cameraKitView.getWidth(),
                            cameraKitView.getHeight(),
                            true
                    );

                    processFaceDetection(mutableBitmap);
                }
            });
            cameraKitView.invalidate();
        }
    });
}
private void processFaceDetection(Bitmap bitmap) {
    FirebaseVisionImage fbvImage = FirebaseVisionImage.fromBitmap(bitmap);

    FirebaseVisionFaceDetectorOptions fbvOptions = new FirebaseVisionFaceDetectorOptions
            .Builder().setClassificationMode(FirebaseVisionFaceDetectorOptions.ALL_CLASSIFICATIONS)
            .enableTracking().build();

    FirebaseVisionFaceDetector fbvDetector = FirebaseVision.getInstance()
            .getVisionFaceDetector(fbvOptions);

    fbvDetector.detectInImage(fbvImage).addOnSuccessListener(new OnSuccessListener<List<FirebaseVisionFace>>() {
        @Override
        public void onSuccess(List<FirebaseVisionFace> firebaseVisionFaces) {
            getFaceResults(firebaseVisionFaces);
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Toast.makeText(FaceActivity.this, "Error: " + e, Toast.LENGTH_LONG).show();
        }
    });
}

private void getFaceResults(List<FirebaseVisionFace> fvbFaces) {
    int counter = 0;
    for (FirebaseVisionFace face : fvbFaces) {
        Rect rect = face.getBoundingBox();
        RectOverlay rectOverlay = new RectOverlay(graphicOverlay, rect);
        counter++;
        graphicOverlay.add(rectOverlay);
        alertDialog.dismiss();
    }
}

Мой манифест:

 <uses-permission android:name="android.permission.CAMERA"/>
<uses-permission
    android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
<uses-feature android:name="android.hardware.camera.front" android:required="false" />

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <uses-library android:name="org.apache.http.legacy" android:required="false"/>
    <activity android:name=".FaceActivity">
        <meta-data
            android:name="com.google.firebase.ml.vision.DEPENDENCIES"
            android:value="face" />
    </activity>
    <activity
        android:name=".GameActivity"
        android:configChanges="orientation|keyboardHidden|screenSize"
        android:label="@string/title_activity_game"
        android:theme="@style/FullscreenTheme" />
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

Я пробовал больше всего предложений в других вопросах, безрезультатно. Действие загружается, открывается передняя камера, и я вижу прямую видеотрансляцию, но нет распознавания лиц, и я получаю указанную выше ошибку. Нажатие кнопки с clickListener срабатывает, но cameraKitView не захватывает изображение и не анализирует его.

Что мне делать?

1 Ответ

1 голос
/ 04 июня 2020

Если ваше приложение использует только функциональность ML Kit на устройстве, теперь вы можете использовать новый автономный API ML Kit , который может быть добавлен только с зависимостью от Gradle и не требует идентификатора экземпляра Firebase.

Вы также можете выбрать между объединением модели с вашим приложением:

implementation 'com.google.mlkit:face-detection:16.0.0'

или позволить службам Google Play доставить ее отдельно и уменьшить размер вашего приложения

implementation 'com.google.android.gms:play-services-mlkit-face-detection:16.0.0'

Если вы выбрали использование сервисов Google Play, не забудьте добавить тег метаданных в свой AndroidManifest.xml

<application ...>
    ...
  <meta-data
      android:name="com.google.mlkit.vision.DEPENDENCIES"
      android:value="face" />
  <!-- If you use multiple ML Kit models via Google Play Services:
       android:value="face,model2,model3" -->
</application>
...