继续收到此错误 "Failed to initialize detector"。我没有正确加载 tflite 模型吗?

Keep receiving this error "Failed to initialize detector". Am I not loading the tflite model correctly?

我正在尝试使用我的 Android 应用设置 ImageAnalyzer,以便我可以使用 Google 的 ML 套件 API 运行 object 分类。正如标题所暗示的,我目前面临的问题是不断看到错误“无法初始化检测器”。

我已经重新阅读 this tutorial about three times now and followed 关于面临相同错误的人(尽管出于不同的原因)无济于事。我还确保 CameraX API 的所有内容(我稍后将展示的 ImageAnalyzer 代码除外)都按预期工作。

如 ML Kit 文档中所述,这是我关于设置 LocalModelCustomObjectDetectorOptionsObjectDetector 的代码:

        LocalModel localModel = new LocalModel.Builder()
                .setAssetFilePath("mobilenet_v1_1.0_224_quantized_1_metadata_1.tflite")
                .build();
        CustomObjectDetectorOptions customObjectDetectorOptions =
                new CustomObjectDetectorOptions.Builder(localModel)
                        .setDetectorMode(CustomObjectDetectorOptions.STREAM_MODE)
                        .enableClassification()
                        .setClassificationConfidenceThreshold(0.5f)
                        .setMaxPerObjectLabelCount(3)
                        .build();
        ObjectDetector objectDetector = ObjectDetection.getClient(customObjectDetectorOptions);

这是我的 ImageAnalyzer 代码,它基本上通过 processImage 辅助方法调用 ML Kit API:

    // Creates an ImageAnalysis for analyzing the camera preview feed
        ImageAnalysis imageAnalysis = new ImageAnalysis.Builder()
                .setTargetResolution(new Size(224, 224))
                .setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
                .build();
        imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this),
                new ImageAnalysis.Analyzer() {
                    @Override
                    public void analyze(@NonNull ImageProxy imageProxy) {
                        @SuppressLint("UnsafeExperimentalUsageError") Image mediaImage =
                                imageProxy.getImage();
                        if (mediaImage != null) {
                            Log.i(TAG, "Obtained ImageProxy object");
                            processImage(mediaImage, imageProxy)
                            .addOnCompleteListener(new OnCompleteListener<List<DetectedObject>>() {
                                @Override
                                public void onComplete(@NonNull Task<List<DetectedObject>> task) {
                                    imageProxy.close();
                                }
                            });
                        }
                    }
                });

这是 processImage 辅助方法,我实际上在其中调用了 objectDetector.process(...),实际上 运行 是 tflite 模型的代码行。

    private Task<List<DetectedObject>> processImage(Image mediaImage, ImageProxy imageProxy) {
        InputImage image =
                InputImage.fromMediaImage(mediaImage,
                        imageProxy.getImageInfo().getRotationDegrees());
        return objectDetector.process(image)
                .addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        String error = "Failed to process. Error: " + e.getMessage();
                        Log.i(TAG, error);
                    }
                })
                .addOnSuccessListener(new OnSuccessListener<List<DetectedObject>>() {
                    @Override
                    public void onSuccess(List<DetectedObject> results) {
                        String success = "Object(s) detected successfully!";
                        Log.i(TAG, success);
                        for (DetectedObject detectedObject : results) {
                            Rect boundingBox = detectedObject.getBoundingBox();
                            Integer trackingId = detectedObject.getTrackingId();
                            for (DetectedObject.Label label : detectedObject.getLabels()) {
                                String text = label.getText();
                                int index = label.getIndex();
                                float confidence = label.getConfidence();
                                Log.i(TAG, "Object detected: " + text + "; "
                                        + "Confidence: " + confidence);
                            }
                        }
                    }
                });
    }

基本上,一旦我 运行 应用程序,logcat 就会重复记录这两行。我知道这意味着 ImageAnalyzer 不断尝试分析图像输入,但由于某种原因 LocalModel 无法处理输入

2021-01-21 22:02:24.020 9328-9328/com.example.camerax I/MainActivity: Obtained ImageProxy object

2021-01-21 22:02:24.036 9328-9328/com.example.camerax I/MainActivity: Failed to process. Error: Failed to initialize detector.

我才刚刚开始使用 Android,尤其是 Android 中的 ML,因此我们将不胜感激!

我设法在有人回答之前解决了我的问题,但如果有人像我一样刚开始学习Android,我会把我的解决方案留在这里。

基本上,记得在 /src/main 目录 而不是 /src/androidTest 目录中创建资产文件夹:P

一旦我这样做了,模型就正确加载了,现在我只需要弄清楚如何在我的应用程序中显示结果。

// Do NOT compress tflite model files (need to call out to developers!)
aaptOptions {
    noCompress "tflite"
}

在构建 gradle 中为应用添加此行 android 标签