Android 为什么每次扫描后结果差别不大?

Android 为什么每次扫描后结果差别不大?,android,firebase-mlkit,Android,Firebase Mlkit,Android Studio 3.6,Firebase ML工具包 我创建的Android应用程序需要扫描图像并从中提取文本。 为此,我使用Firebase ML工具包 在我的应用程序/build.gradle中: dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) implementation 'com.google.android.material:material:

Android Studio 3.6,Firebase ML工具包

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

在我的应用程序/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次后的结果同一图像(带文本):

  • “一些公司名称 C.F O081 0操作员U1 拿铁 1111111111111 17.00摄氏度 17.00摄氏度 3.08摄氏度 1.000 X 17,00 1.000 X 17.00 1.060 X 3.08 拿铁 滴滴涕 三十七 OAL TVA C 10.00% 数字 3. 37 36 .00 803艺术 穆尔图米!!! 183654 23-12-2819 15:14 BON F ISCAL:0131 ZKe0682347 瑟。 印度卢比 N F70282971“

  • 二,

  • “一些公司名称
    F
    1111111111111 o01操作员81
    乐天
    1.808 X 17.00
    1.008x17.00
    1.060 x 3,08
    17.00摄氏度
    17.00摄氏度
    3.00摄氏度
    拿铁咖啡
    apte
    0AL
    NUME RAR
    37.00

  • .36
    .00
    803艺术
    VA C 10.00%
    37
    MUL TUMIM!!!
    103654
    23-12-2819
    15:14
    苯教:0131
    ZKO0602347
    序列号N
    N.印度卢比
    F702022971“
  • 正如您在每次扫描相同图像后所看到的,我得到的结果不同

    问题:

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

    • 如何获得最一致的结果


    我非常确定ML工具包用于文本提取的模型是确定性的:对于完全相同的输入,它应该给出完全相同的输出

    因此,很可能您正在为每个结果向其提供稍微不同的图像,例如,从您的相机向其提供图像并移动该图像。即使稍微移动相机,图像也会不同,ML Kit提取的文本也会不同

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

    我能想到的两个选择是:

  • 训练一个自定义模型,看看是否可以消除类似图像输出的差异。我承认,鉴于我上面给出的例子,我对一般图像上出现这种情况的可能性有点怀疑。但有可能您的数据集具有较少的小变化,甚至可能添加预处理步骤
  • 使用统计OCR工具,它采用完全不同的方法来检测和识别文本。我以前使用过Abby,它对扫描文本的处理非常准确。一些搜索现在暗示Tesseract可能也是一个可行的开源替代方案

  • 这是因为相机的角度在扫描时不一样,为了检查最相同的结果,必须编写复杂的代码

    "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"