web-dev-qa-db-fra.com

Android Le kit Studio ML ne peut pas charger le module OCR

Je travaille sur une Android qui implique un kit ML. J'ai suivi le tutoriel sur la façon de configurer Android Studio pour travailler avec Firebase. Ensuite, je me suis dirigé vers l'utilisation de l'API de reconnaissance de texte. Voici le code que j'ai dans un écouteur de clic sur un bouton:

        FirebaseVisionTextRecognizer detector = FirebaseVision.getInstance()
            .getOnDeviceTextRecognizer();
        Task<FirebaseVisionText> result = detector.processImage(
            FirebaseVisionImage.fromBitmap(BitmapFactory.decodeResource(getResources(), R.drawable.test))
        )
            .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
                @Override
                public void onSuccess(FirebaseVisionText firebaseVisionText) {
                    System.out.println(firebaseVisionText);
                }
            })
            .addOnFailureListener(new OnFailureListener() {
                @Override
                public void onFailure(@NonNull Exception e) {
                    e.printStackTrace();
                }
            });

J'obtiens les journaux suivants:

W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.dynamite.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.ocr:0 and remote module com.google.Android.gms.vision.ocr:0
E/Vision: Error loading module com.google.Android.gms.vision.ocr optional module true: com.google.Android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module found. Local version is 0 and remote version is 0.
D/TextNativeHandle: Broadcasting download intent for dependency ocr
W/TextNativeHandle: Native handle not yet available. Reverting to no-op handle.
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.dynamite.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.ocr:0 and remote module com.google.Android.gms.vision.ocr:0
E/Vision: Error loading module com.google.Android.gms.vision.ocr optional module true: com.google.Android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module found. Local version is 0 and remote version is 0.
W/System.err: com.google.firebase.ml.common.FirebaseMLException: Waiting for the text recognition model to be downloaded. Please wait.
        at com.google.Android.gms.internal.firebase_ml.zzrw.zzd(com.google.firebase:firebase-ml-vision@@24.0.0:21)
        at com.google.Android.gms.internal.firebase_ml.zzrw.zza(com.google.firebase:firebase-ml-vision@@24.0.0:39)
        at com.google.Android.gms.internal.firebase_ml.zzpd.zza(com.google.firebase:firebase-ml-common@@22.0.0:31)
        at com.google.Android.gms.internal.firebase_ml.zzpf.call(Unknown Source:8)
        at com.google.Android.gms.internal.firebase_ml.zzoz.zza(com.google.firebase:firebase-ml-common@@22.0.0:32)
        at com.google.Android.gms.internal.firebase_ml.zzoy.run(Unknown Source:4)
        at Android.os.Handler.handleCallback(Handler.Java:873)
W/System.err:     at Android.os.Handler.dispatchMessage(Handler.Java:99)
        at com.google.Android.gms.internal.firebase_ml.zze.dispatchMessage(com.google.firebase:firebase-ml-common@@22.0.0:6)
        at Android.os.Looper.loop(Looper.Java:193)
        at Android.os.HandlerThread.run(HandlerThread.Java:65)

J'ai parcouru Google pour voir comment je peux corriger l'une de ces erreurs:

W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.dynamite.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.ocr:0 and remote module com.google.Android.gms.vision.ocr:0
E/Vision: Error loading module com.google.Android.gms.vision.ocr optional module true: com.google.Android.gms.dynamite.DynamiteModule$LoadingException: No acceptable module found. Local version is 0 and remote version is 0.
W/System.err: com.google.firebase.ml.common.FirebaseMLException: Waiting for the text recognition model to be downloaded. Please wait.

Jusqu'à présent, j'ai essayé d'effacer les données des services Google Play (version 19.4.20), redémarrage/recréation de l'émulateur, modification des configurations Gradle (par exemple, ajout/suppression de firebase-core dépendance). Configuration au niveau du projet:

// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    repositories {
        google()
        jcenter()

    }
    dependencies {
        classpath 'com.Android.tools.build:gradle:3.5.1'
        classpath 'com.google.gms:google-services:4.3.2'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        jcenter()

    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

Configuration au niveau du module d'application:

apply plugin: 'com.Android.application'

Android {
    compileSdkVersion 29
    buildToolsVersion "29.0.2"
    defaultConfig {
        applicationId "com.example.user.app"
        minSdkVersion 24
        targetSdkVersion 29
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-Android-optimize.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'androidx.appcompat:appcompat:1.1.0'
    implementation 'androidx.constraintlayout:constraintlayout:1.1.3'
    implementation 'com.google.Android.gms:play-services-vision:19.0.0'
    implementation 'com.google.firebase:firebase-ml-vision:24.0.0'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'androidx.test:runner:1.2.0'
    androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0'

}

apply plugin: 'com.google.gms.google-services'

J'ai décidé d'essayer l'API Barcode et j'ai ajouté

implementation 'com.google.firebase:firebase-ml-vision-barcode-model:16.0.1'

comme dépendance. À ma grande surprise, lorsque je l'ai appelé par API, le listeur de succès a été atteint et les journaux suivants sont apparus:

I/DynamiteModule: Considering local module com.google.firebase.ml.vision.dynamite.barcode:10000 and remote module com.google.firebase.ml.vision.dynamite.barcode:0
    Selected local version of com.google.firebase.ml.vision.dynamite.barcode
W/is.moneytravel: Accessing hidden field Ljava/nio/Buffer;->address:J (light greylist, reflection)
I/tflite: Initialized TensorFlow Lite runtime.
I/native: barcode_detector_client.cc:222 Not using NNAPI

Alors que l'API OCR a toujours produit la même erreur. Je pense qu'il doit gérer les référentiels dans lesquels les bibliothèques sont récupérées. API de code à barres:

Considering local module com.google.firebase.ml.vision.dynamite.barcode:10000 and remote module com.google.firebase.ml.vision.dynamite.barcode:0

API OCR:

Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0

J'ai trop peu d'expérience avec Gradle et Firebase pour comprendre celui-ci. Pourquoi l'API OCR est-elle extraite de Android.gms, tandis que l'API Barcode provient de firebase.ml?

2
Big Monday

La solution était de mettre à jour l'application Google Play Services. Je ne considérais pas cela comme une option au départ, car je m'attendais à ce qu'un émulateur API 29 dispose d'un service Google Play mis à jour. Je me suis connecté à Google Play sur l'émulateur, j'ai recherché les services Google Play, l'ai désinstallé (il n'y avait pas d'option "mise à jour") et l'ai réinstallé. Il indique toujours que la version installée est 19.4.20 bien que la reconnaissance de texte ait commencé à fonctionner comme prévu. Voici quelques journaux pertinents:

W/DynamiteModule: Local module descriptor class for com.google.Android.gms.vision.dynamite.ocr not found.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.dynamite.ocr:0 and remote module com.google.Android.gms.vision.dynamite.ocr:0
D/TextNativeHandle: Cannot load feature, fall back to load dynamite module.
I/DynamiteModule: Considering local module com.google.Android.gms.vision.ocr:0 and remote module com.google.Android.gms.vision.ocr:1
I/DynamiteModule: Selected remote version of com.google.Android.gms.vision.ocr, version >= 1
V/DynamiteModule: Dynamite loader version >= 2, using loadModule2NoCrashUtils

1
Big Monday

Vérifiez avec moi ici avec votre code pour chacun ... Peut-être qu'il manque un

ManifestFile installLocation

<manifest xmlns:Android="http://schemas.Android.com/apk/res/Android"
    package="com.******.***"
    Android:installLocation="auto" <!-- make sure added this was missing for me -->
>

Métadonnées ManifestFile

<application
 ......
    <meta-data
        Android:name="com.google.Android.gms.version"
        Android:value="@integer/google_play_services_version" /> <!--version--><!-- make sure added-->
    <meta-data
        Android:name="com.google.Android.gms.vision.DEPENDENCIES"
        Android:value="barcode" /><!-- barcode,face,ocr make sure added-->
.......
</application>

vérifier la connexion Internet

Vérifier l'espace de stockage pour l'espace libre

si vous travaillez avec un émulateur

vérifier si un service google n'a pas de problème ==> ce n'est pas une solution, vous pouvez mettre à jour si besoin mais les étapes principales vérifient le code ci-dessus s'il est manquant (** la dernière pour l'émulateur n'est pas la solution pour l'application client réelle **)

0
Hassan Badawi