首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将PDF分割成逐行图像(OCR模型训练)

将PDF分割成逐行图像(OCR模型训练)
EN

Stack Overflow用户
提问于 2020-03-15 22:32:56
回答 1查看 354关注 0票数 1

我有一个包含扫描文本的PDF的大集合,我想要OCR。

没有任何商业工具(Abby、PhantomPDF、Acrobat )、服务(Google )或开源(使用tesseract、kraken)进行过预培训的模型能够以足够准确的方式对文本进行OCR。

我有一些PDF的原始形式(与完整的文本),这意味着我有一个合理的数量,地面真相训练数据,在字体,页面结构等巨大的重叠。

似乎每一种训练您自己的OCR模型的方法都要求您的训练数据逐行设置,这意味着我需要在训练中将每一行数百页的PDF裁剪成单独的图像(然后我可以简单地将培训中的文本分割-PDF逐行创建相应的gt.txt文件,以便用于tesseract或kraken)。

我使用工具将PDF按页拆分,并将每个页面转换/保存为图像文件,但我一直未能找到一种方法来自动逐行执行相同的事情。但是,R的{pdftools}使得得到每条线的y坐标是可能的.

代码语言:javascript
复制
pdftools::pdf_data(pdf_path)[[3]][1:4, ]
#>   width height   x  y space     text
#> 1    39     17 245 44  TRUE    Table
#> 2    13     17 288 44  TRUE       of
#> 3    61     17 305 44 FALSE Contents
#> 4    41     11  72 74 FALSE Overview

..。但我不清楚如何调整它以匹配任何PDF到图像例程的分辨率缩放。

所有这些都是..。

  • 是否有一个已经这样做的工具?
  • 如果没有,我应该往哪个方向去构建自己的?

看起来Magick完全能够做到这一点(一旦我开始摸索如何导航像素),但这并不能解决如何将y-坐标从像{pdftools}这样的东西转换到使用DPI参数生成的图像中的像素位置的问题(就像每一个?PDF到图像转换工具)。

编辑# 1:

事实证明,坐标是基于PDF“对象”位置的,这并不一定意味着应该在同一行上的文本(在视觉上是这样的)总是这样反映的。意味着同一行的文本可能会被关闭几个像素。

其次,最好的方法是在每个对象周围裁剪框。在R中,这起作用是:

代码语言:javascript
复制
build_training_data <- function(pdf_paths, out_path = "training-data") {
  out_path_mold <- "%s/%s-%d-%d.%s"

  for (pdf_path in pdf_paths) {
    prefix <- sub(".pdf", "", basename(pdf_path), fixed = TRUE)

    pdf_data <- pdftools::pdf_data(pdf_path)
    pdf_text <- pdftools::pdf_text(pdf_path)
    pdf_heights <- pdftools::pdf_pagesize(pdf_path)$height

    for (i_page in seq_along(pdf_data)) {
      page_text <- pdf_text[[i_page]]
      line_text <- strsplit(page_text, "\n")[[1L]]

      page_image <- magick::image_read_pdf(pdf_path, pages = i_page)
      image_stats <- magick::image_info(page_image)

      scale_by <- image_stats$height / pdf_heights[[i_page]]

      page_data <- pdf_data[[i_page]]

      for (j_object in seq_len(nrow(page_data))) {
        cat(sprintf("\r- year: %s, page: %d, object: %d        ",
                    prefix, i_page, j_object))
        image_path <- sprintf(out_path_mold, prefix, i_page, j_object)
        text_path <- sprintf(out_path_mold, prefix, i_page, j_object)

        geom <- magick::geometry_area(
          height = page_data$height[[j_object]] * scale_by * 1.2,
          width = page_data$width[[j_object]] * scale_by * 1.1,
          x_off = page_data$x[[j_object]] * scale_by,
          y_off = page_data$y[[j_object]] * scale_by
        )

        line_image <- magick::image_crop(page_image, geom)

        magick::image_write(line_image, format = "png", 
                            path = image_path)

        writeLines(page_data$text[[j_object]], text_path)
      }

    }

  }

}

这绝对不是最佳选择。

EN

回答 1

Stack Overflow用户

发布于 2021-02-04 13:35:26

索尔福德大学有一个模式识别和图像分析(PRImA)研究实验室。这是他们的计算,科学和工程学院的一部分。他们开发了一些名为Aletheia的软件,旨在帮助从图像中创建基本的真理文本。这些可以用来训练特斯拉版本3或4。

https://www.primaresearch.org/tools/Aletheia

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60698339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档