如何使用 pytesseract 获得每一行的置信度
How to get confidence of each line using pytesseract
我已成功设置 Tesseract 并且可以将图像转换为文本...
text = pytesseract.image_to_string(Image.open(image))
但是,我需要获取每一行的置信度值。我找不到使用 pytesseract 执行此操作的方法。有人知道怎么做吗?
我知道这可以使用 PyTessBaseAPI,但我不能使用它,我花了几个小时试图设置它但没有成功,所以我需要一种方法来做这使用 pytesseract.
经过多方查找,我找到了一个方法。应该使用 image_to_data
而不是 image_to_string
。但是,这将为您提供每个单词的统计信息,而不是每一行...
text = pytesseract.image_to_data(Image.open(file_image), output_type='data.frame')
所以我所做的是将它保存为数据框,然后使用 pandas
按 block_num
分组,因为每行都使用 OCR 分组为块,我也删除了所有没有的行置信度值 (-1)...
text = text[text.conf != -1]
lines = text.groupby('block_num')['text'].apply(list)
使用相同的逻辑,您还可以通过计算同一块内所有单词的平均置信度来计算每行的置信度...
conf = text.groupby(['block_num'])['conf'].mean()
当前接受的答案并不完全正确。使用 pytesseract 获取每个 line
的正确方法是
text.groupby(['block_num','par_num','line_num'])['text'].apply(list)
我们需要根据这个答案来做:
- 列block_num:检测到的文本或项目的块号
- 列par_num:检测到的文本或项目的段落编号
- 列line_num:检测到的文本或项目的行号
- 列word_num:检测到的文本或项目的字数
但上面所有4列都是interconnected.If项目来自新行然后字数将从0开始重新计数,它不会从上一行的最后一个字数继续。同样适用于 line_num、par_num、block_num.
@Srikar Appalaraju 是对的。以下面的示例图片为例:
现在使用以下代码:
text = pytesseract.image_to_data(gray, output_type='data.frame')
text = text[text.conf != -1]
text.head()
请注意,所有五行都具有相同的 block_num
,因此如果我们使用该列进行分组,则所有 5 个单词(文本)将被分组在一起。但这不是我们想要的,我们只想对属于第一行的前 3 个单词进行分组,为了正确地(以通用方式)对足够大的图像进行分组,我们需要按所有 4 列进行分组 [ =14=、block_num
、par_num
和 line_num
同时计算第一行的置信度,如以下代码片段所示:
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 .50', 89.0),
('[Pork] [24#]', 43.0),
('Brown Rice .00', 95.333),
('Total 2 iten(s) .50', 89.5),
('Sales Tax .09', 95.667),
('Grand Total .59', 95.0),
('Tip Guide', 95.0),
('TEK=.89, 18%=62.27, 20%=82.52', 6.667),
('Thank you very much,', 90.75),
('Cone back again', 92.667)]
我已成功设置 Tesseract 并且可以将图像转换为文本...
text = pytesseract.image_to_string(Image.open(image))
但是,我需要获取每一行的置信度值。我找不到使用 pytesseract 执行此操作的方法。有人知道怎么做吗?
我知道这可以使用 PyTessBaseAPI,但我不能使用它,我花了几个小时试图设置它但没有成功,所以我需要一种方法来做这使用 pytesseract.
经过多方查找,我找到了一个方法。应该使用 image_to_data
而不是 image_to_string
。但是,这将为您提供每个单词的统计信息,而不是每一行...
text = pytesseract.image_to_data(Image.open(file_image), output_type='data.frame')
所以我所做的是将它保存为数据框,然后使用 pandas
按 block_num
分组,因为每行都使用 OCR 分组为块,我也删除了所有没有的行置信度值 (-1)...
text = text[text.conf != -1]
lines = text.groupby('block_num')['text'].apply(list)
使用相同的逻辑,您还可以通过计算同一块内所有单词的平均置信度来计算每行的置信度...
conf = text.groupby(['block_num'])['conf'].mean()
当前接受的答案并不完全正确。使用 pytesseract 获取每个 line
的正确方法是
text.groupby(['block_num','par_num','line_num'])['text'].apply(list)
我们需要根据这个答案来做:
- 列block_num:检测到的文本或项目的块号
- 列par_num:检测到的文本或项目的段落编号
- 列line_num:检测到的文本或项目的行号
- 列word_num:检测到的文本或项目的字数
但上面所有4列都是interconnected.If项目来自新行然后字数将从0开始重新计数,它不会从上一行的最后一个字数继续。同样适用于 line_num、par_num、block_num.
@Srikar Appalaraju 是对的。以下面的示例图片为例:
现在使用以下代码:
text = pytesseract.image_to_data(gray, output_type='data.frame')
text = text[text.conf != -1]
text.head()
请注意,所有五行都具有相同的 block_num
,因此如果我们使用该列进行分组,则所有 5 个单词(文本)将被分组在一起。但这不是我们想要的,我们只想对属于第一行的前 3 个单词进行分组,为了正确地(以通用方式)对足够大的图像进行分组,我们需要按所有 4 列进行分组 [ =14=、block_num
、par_num
和 line_num
同时计算第一行的置信度,如以下代码片段所示:
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 .50', 89.0),
('[Pork] [24#]', 43.0),
('Brown Rice .00', 95.333),
('Total 2 iten(s) .50', 89.5),
('Sales Tax .09', 95.667),
('Grand Total .59', 95.0),
('Tip Guide', 95.0),
('TEK=.89, 18%=62.27, 20%=82.52', 6.667),
('Thank you very much,', 90.75),
('Cone back again', 92.667)]