0

Android Studio 3.6,Firebase 机器学习套件。

我创建了需要扫描图像并从中提取文本的 Android 应用程序。为此,我使用 Firebase ML Kit。

在我的应用程序/build.gradle 中:

 dependencies {
        implementation fileTree(dir: 'libs', include: ['*.jar'])
        implementation 'com.google.android.material:material:1.2.0-alpha03'
        implementation 'com.google.android.gms:play-services-maps:17.0.0'
        implementation "com.otaliastudios:cameraview:2.5.0"
        implementation('com.crashlytics.sdk.android:crashlytics:2.10.1@aar') { transitive = true; }
        implementation 'com.google.firebase:firebase-ml-vision:24.0.1'
        implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk7:$kotlin_version"
        implementation 'com.synnapps:carouselview:0.1.4'
        implementation 'androidx.appcompat:appcompat:1.1.0'

这是我的活动:

import android.Manifest
import android.content.DialogInterface
import android.content.Intent
import android.graphics.Bitmap
import android.os.Bundle
import android.widget.Toast
import androidx.databinding.DataBindingUtil
import com.google.firebase.ml.vision.FirebaseVision
import com.google.firebase.ml.vision.common.FirebaseVisionImage
import com.google.firebase.ml.vision.text.FirebaseVisionText
private fun runDetector(bitmap: Bitmap?) {
        val image = FirebaseVisionImage.fromBitmap(bitmap!!)
        val detector = FirebaseVision.getInstance().onDeviceTextRecognizer

        val result = detector.processImage(image)
            .addOnSuccessListener { firebaseVisionText ->
                processTextResult(firebaseVisionText)
            }
            .addOnFailureListener { e ->
            }
    }

    private fun processTextResult(firebaseVisionText: FirebaseVisionText) {
        var detectedText = "\n"
        firebaseVisionText.textBlocks.forEach {         
            detectedText += it.text + "\n"
        }
        Debug.d(TAG, "processTextResult: detectedText_start\n")
        Debug.d(TAG, detectedText)
        Debug.d(TAG, "processTextResult: detectedText_end")

这是扫描 3 次相同图像(带文本)后的结果:

  1. “某些公司名称 CF O081 0operator U1 Latte 1111111111111 17.00 C 17.00 C 3.08 C 1.000 X 17,00 1.000 X 17.00 1.060 X 3.08 Latte dDte 37 .00 OAL TVA C 10.00% NUMERAR 3.08 37 !! ! 183654 23-12-2819 15:14 BON F ISCAL: 0131 ZKe0682347 Ser. N. Inr N F702822971"

2.

"some company name
C.F
C                            
F                            
9881                         
Latte                        
1111111111111
Operator 81                  
1.000 X 17.00                
1,008 X 17.00                
17.00 C                      
17.00 C                      
3.00 C                       
Latte                        
apte                         
1.060 X 3.08                 
31.86                        
UIAL                         
TVA C 10.00%                 
NUMERAR                      
B. .36                       
,00                          
ART                          
37                           
883                          
MUL TUMIM !                  
15:14                        
103654                       
BON FISCAL: 6131             
23-12-2819                   
ZKO0682347                   
Ser.N                        
N.Inr                        
F782022971"
  1. "一些公司名称
    F
    1111111111111 o01 操作员 81
    Lotte
    1.808 X 17.00
    1.008 X 17.00
    1.060 x 3,08
    17.00 C
    17.00 C
    3.00 C
    Latte
    apte
    0AL
    NUME RAR
    37.00

  2. .36
    .00
    803 ART
    VA C 10.00%
    37
    MUL TUMIM !!!
    103654
    23-12-2819
    15:14
    BON F ISCAL: 0131
    ZKO0602347
    Ser .N
    N.
    Inr F702022971"

正如您在每次扫描同一图像后看到的那样,我得到不同的结果。

问题:

  • 每次扫描后是否有可能得到相同的结果?

  • 如何达到最相同的结果?

4

2 回答 2

0

这是因为扫描时相机的角度不同,要检查大多数相同的结果,您必须编写复杂的代码

于 2019-12-25T16:43:18.963 回答
0

我很确定 ML Kit 用于其文本提取的模型是确定性的:对于完全相同的输入,它应该给出完全相同的输出。

所以很可能你为每个结果提供了一个稍微不同的图像,例如通过从你的相机提供图像并移动它。即使您稍微移动相机,图像也会有所不同,ML Kit 提取的文本也会有所不同。

我总是从这些 ML 模型中看到这种行为。例如,当您缓慢移动相机时,谷歌翻译也很容易受到其解释的细微差异的影响。所以我怀疑这是你可以调整/配置模型的东西。

我能想到的两个选择是:

  1. 训练一个自定义模型,看看你是否可以摆脱相似图像的输出差异。鉴于我上面给出的示例,我承认我对一般图像上出现这种情况的可能性持怀疑态度。但是您的数据集可能具有较少的小变化,或者甚至可能添加了预处理步骤。
  2. 使用统计 OCR 工具,它采用完全不同的方法来检测和识别文本。我过去使用过 Abby,它在扫描文本上工作得非常准确。现在的一些搜索暗示 Tesseract 也可能是一个可行的开源替代方案。
于 2019-12-25T16:39:41.680 回答