Android 我们如何改进Firebase ML kit在设备上的文本识别输出结果?

Android 我们如何改进Firebase ML kit在设备上的文本识别输出结果?,android,firebase,ocr,firebase-mlkit,Android,Firebase,Ocr,Firebase Mlkit,我正在尝试将OCR集成到移动设备中,以便从图像中提取数字。为此,我决定使用Firebase ml kit,因为它提供了一个设备上的解决方案(当您没有internet连接来与API通信时,它非常有用) 我将Firebase ml kit集成到我的应用程序中,并使用GetOnDevicetExtRecognitor()函数来执行OCR部分,但返回的结果一点也不好 正如您在示例中看到的,即使您提供了相当好的图像作为输入,结果也很差 这是用于运行OCR的示例代码(与官方文档中提供的代码非常相似) 公共

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

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

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

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

公共类PictureActivity扩展了AppCompativity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
试一试{
FirebaseVisionImage=FirebaseVisionImage.fromFilePath(getApplicationContext(),Uri.parse(“android.resource://“+getPackageName()+”/“+R.drawable.test2));
识别文本(图像);
}捕获(IOEX异常){
Log.d(“异常”、“测试”);
}
}
私有void recognizeText(FirebaseVisionImage图像){
//[启动获取检测器\u默认值]
FireBaseVisionExtRecognizer检测器=FirebaseVision.getInstance()
.GetOnDevicetExtRecognitor();
//[结束获取检测器\u默认值]
//[启动运行检测器]
任务结果=
检测器。处理图像(图像)
.addOnSuccessListener(新的OnSuccessListener(){
@凌驾
成功时公共无效(FirebaseVisionText FirebaseVisionText){
//任务已成功完成
//[开始时不包括]
//[开始获取文本]
对于(FirebaseVisionText.TextBlock:FirebaseVisionText.getTextBlocks()){
Rect boundingBox=block.getBoundingBox();
Point[]cornerPoints=block.getCornerPoints();
String text=block.getText();
日志d(“测试”,文本);
setContentView(R.layout.activity_图片);
TextView输出=findViewById(R.id.outputResult);
output.setText(文本);
对于(FirebaseVisionText.Line:block.getLines()){
// ...
对于(FirebaseVisionText.Element:line.getElements()){
// ...
}
}
}
//[结束获取文本]
//[完]
}
})
.addOnFailureListener(
新的OnFailureListener(){
@凌驾
public void onFailure(@NonNull异常e){
//任务失败,出现异常
// ...
}
});
//[终端运行检测器]
}
我想知道是否有一些参数我们可以更改,以优化我们案例的OCR,就像您可以使用tesseract那样。我查看了文档,但没有找到任何有用的建议

此外,我并不关注Firebase ml kit。因此,如果您有其他可以在移动设备上工作的建议(无需请求internet API),请随意分享


Tesseract是一个很好的替代方案,但是找到的所有android包装都不再维护。

尝试使用基于云的模式, FireBaseVisionExtRecognizer检测器=FirebaseVision.getInstance() .getCloudTextRecognitor()

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

有关详细信息,请查看下面的链接

正如我提到的,基于云的解决方案不适合我的需要,因为我在寻找一个设备上的解决方案。关于定制模式,这是另一个解决方案,但说99%是过于乐观的,除非你过于适合你的模式……嗨@Loic,有什么解决办法吗?您好,不太合适。离线模式确实有限制。你可以改进一下结果但是应用图像变换并不是万能的。你可以创建你自己的模型,看看它是否工作得更好。但是正如我在回答中提到的,在这类问题上达到99%是过于乐观的,或者你的模型不代表实际情况
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]
    }