【问题标题】:Decreasing Tesseract OCR Execution time减少 Tesseract OCR 执行时间
【发布时间】:2020-06-30 06:20:40
【问题描述】:

我使用 Tesseract 制作了一个光学字符识别程序,但是它的运行速度比预期的要慢。我使用我在 github 上找到的 ocrb 训练数据,我相信创建自己的训练数据更小会提高执行速度。我对 OCR 比较陌生,所以你有什么提高时间效率的技巧吗?也许是 Pix 的替代品?

在我的电脑上它的运行时间是 0.1 秒,如果它低于 0.066 就完美了。这是我的功能:

 std::string imageToText() {

    tesseract::TessBaseAPI api;
    api.Init("./tessdata", "ocrb_int");
    Pix* image = pixRead("randommrz.jpg");
    api.SetImage(image);

    return api.GetUTF8Text();
}

我也知道缺乏垃圾收集

【问题讨论】:

  • @AlanBirtles Typo,编辑了问题。感谢您的通知
  • 首先要检查的是您在构建代码时是否启用了编译器优化。默认情况下,几乎所有编译器都会生成未经优化的调试版本,以便于调试。这样的构建相当缓慢。您要确保测试优化的发布版本。

标签: c++ computer-vision ocr tesseract


【解决方案1】:

如果您对提高速度感兴趣,则必须衡量每一步和整个过程。这可以让您更好地了解可能发生的情况:

  1. tesseract 初始化 - 较小的数据 (ocrb_int) 会有所帮助,但磁盘访问是有限的(例如访问 tesseract 库)。此外,删除一些 tesseract 功能可能会减小 tesseract 的大小 - 在互联网上搜索)
  2. 图像加载 - 磁盘访问和图像大小是您的限制。你可以玩不同的图像格式
  3. OCR 处理本身 - 图像预处理可以在这个阶段提供帮助(但无论如何它会花费你一些钱)

【讨论】:

  • 您好,谢谢您的回答。 3. step 让我从另一个角度看,这导致了成功。我正在写我在答案中更改/添加的内容
【解决方案2】:

好的,所以我能够将运行时间减少到 0.036 秒,我正在为未来的开发人员编写我的步骤 :)

  1. 我使用了 CMAKE 并且只包含了必要的库,我不知道这对运行时间有多大影响,但我想这是一个很好的做法。

  2. 我用 tesseract 训练了我自己的数据,经历了很多尝试/错误,但最终设法创建了一个新的数据,并在时间/准确性之间取得了良好的平衡。

  3. 我使用 OpenCV 手动进行了预处理,没有使用 leptonica (pixRead() 等) 我在这一步遇到的第一个问题是:tessApi->SetImage() 函数采用 Pix* object,但是有一个重载选项,您可以像这样使用:

    tesseract::TessBaseAPI* tess = new tesseract::TessBaseAPI();
    cv::Mat image = cv::imread("filename.png");
    /*
    Preprocessing
    */
    tess->SetImage(image.data, image.cols, image.rows, 3, image.step);
    
    return tessApi->GetUTF8Text();
    

希望这会有所帮助!

【讨论】:

  • 如果您在其他地方不需要 OpenCV - 不要使用它。 leptonica 更轻,tesseract 使用它并创建了 PIX。因此,将图像读取到 OpenCV 而不是将其转换为 PIX,可能是无用的一步。
  • 嘿,我在机读区检测步骤中使用 OpenCV,在我的代码中 cv::Mat image 对象是从整个图像中提取的机读区区域。我没有包括制作简单的那部分。感谢您的反馈!
【解决方案3】:

根据this tesseract 有一些 OpenCl 支持,因此在 GPU 中运行它可以提高性能。

如果这不是一个选项,您可以最小化要处理的数据。尽量不要加载完整的图像,而只加载包含文本的部分。这称为CRAFT,但我主要可以找到python 实现。

【讨论】:

  • 嘿尼克,谢谢你的回答。不幸的是,在 GPU 中运行对我来说不是一个选项,我将使用 JNI 将此函数包装到 Java 中,并且我目前正在使用仅包含文本部分的裁剪图像。我还将在之前实现 OpenCV 部分来检测文本块,然后识别里面的任何内容。我相信提高时间效率的唯一方法是使用更好的训练数据。 Google Vision API 如何在几毫秒内完成这项工作,这让我抓狂。
猜你喜欢
  • 2012-12-31
  • 1970-01-01
  • 2018-02-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 2020-09-25
  • 1970-01-01
相关资源
最近更新 更多