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