首页 > 解决方案 > 我们如何改进设备上的 Firebase ML 套件文本识别输出结果?

问题描述

我正在尝试将 OCR 集成到移动设备中以从图像中提取数字。为此,我决定使用Firebase ml 套件,因为它提供了设备上的解决方案(当您没有互联网连接来与 API 通信时非常有用)。

我将Firebase ml 套件集成到我的应用程序中,并使用getOnDeviceTextRecognizer()函数执行 OCR 部分,但返回的结果一点也不好。

正如您在示例中看到的那样,即使您提供了相当好的图像作为输入,结果也很差。

在此处输入图像描述

这是用于运行 OCR 的示例代码(与官方文档中提供的非常相似)

public class PictureActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        try {
            FirebaseVisionImage image = FirebaseVisionImage.fromFilePath(getApplicationContext(), Uri.parse("android.resource://" + getPackageName() + "/" + R.drawable.test2));
            recognizeText(image);

        } catch(IOException ex){
            Log.d("exception","test");
        }
    }

    private void recognizeText(FirebaseVisionImage image) {

        // [START get_detector_default]
        FirebaseVisionTextRecognizer detector = FirebaseVision.getInstance()
                .getOnDeviceTextRecognizer();
        // [END get_detector_default]

        // [START run_detector]
        Task<FirebaseVisionText> result =
                detector.processImage(image)
                        .addOnSuccessListener(new OnSuccessListener<FirebaseVisionText>() {
                            @Override
                            public void onSuccess(FirebaseVisionText firebaseVisionText) {
                                // Task completed successfully
                                // [START_EXCLUDE]
                                // [START get_text]
                                for (FirebaseVisionText.TextBlock block : firebaseVisionText.getTextBlocks()) {
                                    Rect boundingBox = block.getBoundingBox();
                                    Point[] cornerPoints = block.getCornerPoints();
                                    String text = block.getText();
                                    Log.d("TESTING", text);
                                    setContentView(R.layout.activity_picture);
                                    TextView output = findViewById(R.id.outputResult);
                                    output.setText(text);

                                    for (FirebaseVisionText.Line line: block.getLines()) {
                                        // ...
                                        for (FirebaseVisionText.Element element: line.getElements()) {
                                            // ...
                                        }
                                    }
                                }
                                // [END get_text]
                                // [END_EXCLUDE]
                            }
                        })
                        .addOnFailureListener(
                                new OnFailureListener() {
                                    @Override
                                    public void onFailure(@NonNull Exception e) {
                                        // Task failed with an exception
                                        // ...
                                    }
                                });
        // [END run_detector]
    }

我想知道是否有一些参数我们可以更改以针对我们的案例优化 OCR,例如您可以使用 tesseract 进行操作。我检查了文档,但没有找到任何有用的建议。

此外,我并不专注于 Firebase ml 套件。因此,如果您有其他可以在移动设备上运行的建议(无需向 Internet API 发出请求),请随时分享。

Tesseract是一个不错的选择,但所有找到的 android 包装器都不再维护。

标签: androidfirebaseocrfirebase-mlkit

解决方案


尝试使用基于云的模式,FirebaseVisionTextRecognizerdetector = FirebaseVision.getInstance() .getCloudTextRecognizer();

如果您有特定类型的图像,那么您可以制作自定义机器学习模型并将该模型上传到 firebase,那么您将获得 99% 的准确率。

有关详细信息,请查看以下链接 https://firebase.google.com/docs/ml-kit/android/use-custom-models


推荐阅读