如何使用 pytesseract 获得每一行的信心

Posted

技术标签:

【中文标题】如何使用 pytesseract 获得每一行的信心【英文标题】:How to get confidence of each line using pytesseract 【发布时间】:2019-08-19 18:41:12 【问题描述】:

我已成功设置 Tesseract 并且可以将图像转换为文本...

text = pytesseract.image_to_string(Image.open(image))

但是,我需要获取每一行的置信度值。我找不到使用 pytesseract 的方法。有人知道怎么做吗?

我知道使用 PyTessBaseAPI 可以做到这一点,但是我不能使用它,我已经花了好几个小时试图设置它,但没有运气,所以我需要一种方法来使用 pytesseract.

【问题讨论】:

【参考方案1】:

经过大量搜索,我想出了一个方法。而不是image_to_string,应该使用image_to_data。但是,这将为您提供每个单词的统计信息,而不是每一行...

text = pytesseract.image_to_data(Image.open(file_image), output_type='data.frame')

所以我所做的就是将其保存为数据框,然后使用pandasblock_num 分组,因为每一行都使用 OCR 分组为块,我还删除了所有没有置信度值的行 (-1) ...

text = text[text.conf != -1]
lines = text.groupby('block_num')['text'].apply(list)

使用相同的逻辑,您还可以通过计算同一块内所有单词的平均置信度来计算每行的置信度...

conf = text.groupby(['block_num'])['conf'].mean()

【讨论】:

【参考方案2】:

@Srikar Appalaraju 是对的。以下面的示例图片为例:

现在使用以下代码:

text = pytesseract.image_to_data(gray, output_type='data.frame')
text = text[text.conf != -1]
text.head()

请注意,所有五行都有相同的block_num,因此如果我们使用该列进行分组,则所有 5 个单词(文本)将被分组在一起。但这不是我们想要的,我们只想对属于第一行的前 3 个单词进行分组,并且为了正确(以通用方式)对足够大的图像进行分组,我们需要按所有 4 列进行分组@ 987654327@、block_numpar_numline_num 模拟,以便计算第一行的置信度,如以下代码 sn-p 所示:

lines = text.groupby(['page_num', 'block_num', 'par_num', 'line_num'])['text'] \
                                     .apply(lambda x: ' '.join(list(x))).tolist()
confs = text.groupby(['page_num', 'block_num', 'par_num', 'line_num'])['conf'].mean().tolist()
    
line_conf = []
    
for i in range(len(lines)):
    if lines[i].strip():
        line_conf.append((lines[i], round(confs[i],3)))

具有以下所需的输出:

[('Ying Thai Kitchen', 91.667),
 ('2220 Queen Anne AVE N', 88.2),
 ('Seattle WA 98109', 90.333),
 ('« (206) 285-8424 Fax. (206) 285-8427', 83.167),
 ('‘uw .yingthaikitchen.com', 40.0),
 ('Welcome to Ying Thai Kitchen Restaurant,', 85.333),
 ('Order#:17 Table 2', 94.0),
 ('Date: 7/4/2013 7:28 PM', 86.25),
 ('Server: Jack (1.4)', 83.0),
 ('44 Ginger Lover $9.50', 89.0),
 ('[Pork] [24#]', 43.0),
 ('Brown Rice $2.00', 95.333),
 ('Total 2 iten(s) $11.50', 89.5),
 ('Sales Tax $1.09', 95.667),
 ('Grand Total $12.59', 95.0),
 ('Tip Guide', 95.0),
 ('TEK=$1.89, 18%=62.27, 20%=82.52', 6.667),
 ('Thank you very much,', 90.75),
 ('Cone back again', 92.667)]

【讨论】:

【参考方案3】:

当前接受的答案并不完全正确。使用 pytesseract 获取每个line 的正确方法是

text.groupby(['block_num','par_num','line_num'])['text'].apply(list)

我们需要根据这个答案来做这个:Does anyone knows the meaning of output of image_to_data, image_to_osd methods of pytesseract?

    Column block_num:检测到的文本或项目的块号 列par_num:检测到的文本或项目的段落编号 Column line_num:检测到的文本或项目的行号 Column word_num:检测到的文本或项目的字数

但以上所有 4 列是相互连接的。如果项目来自新行,则单词编号将从 0 重新开始计数,它不会从上一行最后一个单词编号继续。 line_num、par_num、block_num 也是如此。

【讨论】:

以上是关于如何使用 pytesseract 获得每一行的信心的主要内容,如果未能解决你的问题,请参考以下文章

如何在vscode中的每一行上获得光标

如何获得二维数组中每一列和每一行的总和?

如何获得每组的第一行?

如何每隔一行读取 CSV 文件

pyspark 数据框为每一行获得第二低的值

如何使用 CSS 为 jQuery 表中的每一行设置不同的图像