android - 我们如何改进设备上的 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 包装器都不再维护。
解决方案
尝试使用基于云的模式,FirebaseVisionTextRecognizerdetector = FirebaseVision.getInstance() .getCloudTextRecognizer();
如果您有特定类型的图像,那么您可以制作自定义机器学习模型并将该模型上传到 firebase,那么您将获得 99% 的准确率。
有关详细信息,请查看以下链接 https://firebase.google.com/docs/ml-kit/android/use-custom-models
推荐阅读
- cmake - 将 CMakeLists.txt 的生成集成到所述 CMakeLists.txt
- javascript - 如何将外部 js 文件中的方法导入和使用到 AngularJS?
- azure-cognitive-search - search.highlight 的预期行为 - 每个标记包围的标记还是一个标记包围的多个标记?
- java - 我怎样才能表明一个泛型类是从一个类或另一个类扩展而来的?
- apache-spark - 在 CASE WHEN 中使用 IN 运算符的 Spark SQL 查询无法转换为 SparkPlan
- jestjs - 如何在 beforeAll() 中调用 DB 连接并在 afterAll() 中关闭 DB 连接
- jersey - 泽西岛的 SSE:在 javax.ws.rs.sse.Sse 类中找不到合适的构造函数
- ios - iOS:显示元素宽度不同的水平列表
- python-3.x - 如何找到两个文档之间的相似性
- python - 将重复的行附加为单个记录 - 熊猫