我有一个包含扫描文本的PDF的大集合,我想要OCR。
没有任何商业工具(Abby、PhantomPDF、Acrobat )、服务(Google )或开源(使用tesseract、kraken)进行过预培训的模型能够以足够准确的方式对文本进行OCR。
我有一些PDF的原始形式(与完整的文本),这意味着我有一个合理的数量,地面真相训练数据,在字体,页面结构等巨大的重叠。
似乎每一种训练您自己的OCR模型的方法都要求您的训练数据逐行设置,这意味着我需要在训练中将每一行数百页的PDF裁剪成单独的图像(然后我可以简单地将培训中的文本分割-PDF逐行创建相应的gt.txt文件,以便用于tesseract或kraken)。
我使用工具将PDF按页拆分,并将每个页面转换/保存为图像文件,但我一直未能找到一种方法来自动逐行执行相同的事情。但是,R的{pdftools}使得得到每条线的y坐标是可能的.
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中,这起作用是:
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)
}
}
}
}这绝对不是最佳选择。
发布于 2021-02-04 13:35:26
索尔福德大学有一个模式识别和图像分析(PRImA)研究实验室。这是他们的计算,科学和工程学院的一部分。他们开发了一些名为Aletheia的软件,旨在帮助从图像中创建基本的真理文本。这些可以用来训练特斯拉版本3或4。
https://stackoverflow.com/questions/60698339
复制相似问题