使用OCR库Pix2Text执行p2t.recognize()时出现list index out of range的错误信息(附有Pix2Text识别图片内容和laTex公式的代码)

简介: 有时候报错并不是你代码有问题,源码出错也是很常见的情况,比如之前使用mxgraph也出现了不知名bug,最后也是修改的源码解决的。有疑问欢迎交流~ 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~


一、OCR和Pix2Text

1.1、OCR是什么

       OCR(Optical Character Recognition,光学字符识别)是一种技术,它能够将不同来源的图像文件中的文字转换成可编辑的文本数据。OCR技术可以识别印刷体文字,也可以识别手写体文字,但后者的识别准确率通常较低。OCR技术广泛应用于文档数字化、数据录入、以及自动化处理等领域。

       OCR技术的基本流程包括以下几个步骤:

  1. 预处理:对图像进行去噪、二值化、旋转校正等操作,以提高识别的准确性。
  2. 文字检测:在图像中定位文字的位置,这可能包括文字区域的检测和文字行的分割。
  3. 字符分割:将检测到的文字行进一步分割成单个字符或单词。
  4. 特征提取:从分割后的字符中提取有助于识别的特征。
  5. 分类识别:利用机器学习模型,根据提取的特征将字符分类识别成相应的文字。
  6. 后处理:对识别结果进行校正,比如通过语言模型来纠正可能的错误。

1.2、关于Pix2Text

       Pix2Text是一种特定的OCR技术,它通常指的是将图像中的文字内容转换为文本的过程。这个术语并不是一个特定的产品或技术,而是一个通用的描述,用来表示将图像中的文字信息转换为可编辑文本的技术或服务。Pix2Text可以是任何OCR技术的实现,可以是软件、应用程序或在线服务。

       OCR技术的关键点在于其准确性和速度,随着机器学习和深度学习技术的发展,现代OCR系统在识别多种语言和复杂文档格式方面取得了显著的进步。这些系统能够更好地处理不同的字体、大小、颜色以及图像质量,从而提供更高的识别准确率和更广泛的应用场景。

二、Pix2Text正常识别图片内容的代码

  先上源码,这是一个通过Pix2Text来识别图片内容的脚本,Pix2Text识别精度和速度都还不错,主要是能有效识别公式,并生成laTex代码。

import os
import glob
from pix2text import Pix2Text, merge_line_texts
# 获取待识别的图片列表
img_fp_list = glob.glob(r'E:\code\python\textRecognition\data\test\pic1.*.png')
for img_fp in img_fp_list:
    # 新建pix2text对象,mfd是默认模式
    p2t = Pix2Text(analyzer_config=dict(model_name='mfd'))
    try:
        print("---start to recognize---")
        # 开始识别,得到该图片的识别结果
        outs = p2t.recognize(img_fp)  # can also use `p2t.recognize(img_fp)`  or 'p2t(img_fp, resized_shape=600)'
        print("---over---")
    except Exception as e:
        print("---error---")
        print(e)
    if outs:
        # 将内容拼接到一起
        img_name = img_fp.split('\\')[-1]
        out_fp = img_fp.replace(img_name, 'pix2text.txt')
        with open(out_fp, 'a', encoding='utf-8') as f:
            f.write(outs)
        outs = None

image.gif

  这个源码大多数情况都能执行,有需要的兄弟请自取。(注意,有博客说outs = p2t.recognize(img_fp)的返回值是一个字典,但是我的返回值是个字符串,可能和版本有关,这个看具体的情况来修改读取和拼接的代码)

三、对于部分图片执行时出现的“list index out of range”报错

  通过try-except是报这个错,如果不try直接跑应该会直接报源码的错,但是源码报错一般都是自己代码写错了,很难判断具体的原因。

  这篇博客是要解决一个莫名其妙的bug,在双列识别时,内容量过多所出现的“list index out of range”报错。

  举个例子,笔者识别这些图片都没问题

image.gif 编辑

image.gif 编辑

       但是同一篇论文,同一种格式的图片产出,这样的图片就会报错

image.gif 编辑

  经过测试,发现只要是内容满满荡荡的就会报错,稍微有点空行、图片、表格什么的还是能正常识别,追溯到源码,发现问题出在源码的utils.py的merge_line_text当中。

3.1、解决方案(小白操作版,后面有原因推测)

  现在提供一种解决的思路:

①先ctrl+点击p2t.recognize,进入到pix_to_text.py

image.gif 编辑

image.gif 编辑

②在pix_to_text.py中,找到344行的merge_line_texts方法,ctrl+点击它进入utils.py(如果找不到这个方法直接ctrl+f搜索也是可以的)

image.gif 编辑

③在utils.py中,大概在710+行的位置,找到这个循环,将if(我注释掉的就是原代码)改成while即可。

image.gif 编辑

3.2、原因推测

  简单说一下报错原因,这里其实是pix2Text的开发者在遍历识别结果_out,按照line_number和type的值拿出不同的内容,但是可能存在空行或者其他原因,经常会出现line_number并没有递增,而是突然从15变成17这样的情况,那么后面执行的时候,out_texts扩容速度跟不上导致out_texts[line_number]这个操作超出数组限制,导致报错。于是开发者添加了一个判断,如果在某一轮次出现了len(out_texts) <= line_number的情况,就给out_texts多扩容一次,但这里有个逻辑错误,if判断只能执行一次,事实上只有len(out_texts) = line_number的时候扩容一次是有效的,所有len(out_texts) < line_number的情况扩容一次是解决不了问题的。恰好我就遇到了这种情况,于是将if改成wihle,不断地扩容直到刚好len(out_texts) > line_number,这样就能正常运行了。

  至于为什么一定是内容满满当当的论文图片才会有这种错误,这就要看Pix2Text所依赖的OCR引擎CnOCR的执行逻辑了,这个我目前还没有过深的接触,有懂的大佬可以在评论区解释一下。

四、总结

       有时候报错并不是你代码有问题,源码出错也是很常见的情况,比如之前使用mxgraph也出现了不知名bug,最后也是修改的源码解决的。有疑问欢迎交流~

       更多OCR方面的小技巧和经验贴:各种常用OCR,分享特殊情况下的OCR解决方案

       博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~

相关文章
|
2月前
|
机器学习/深度学习 文字识别 Java
Python实现PDF图片OCR识别:从原理到实战的全流程解析
本文详解2025年Python实现扫描PDF文本提取的四大OCR方案(Tesseract、EasyOCR、PaddleOCR、OCRmyPDF),涵盖环境配置、图像预处理、核心识别与性能优化,结合财务票据、古籍数字化等实战场景,助力高效构建自动化文档处理系统。
541 0
|
11月前
|
JSON 文字识别 数据可视化
Qwen2-VL微调实战:LaTex公式OCR识别任务(完整代码)
《SwanLab机器学习实战教程》推出了一项基于Qwen2-VL大语言模型的LaTeX OCR任务,通过指令微调实现多模态LLM的应用。本教程详述了环境配置、数据集准备、模型加载、SwanLab集成及微调训练等步骤,旨在帮助开发者轻松上手视觉大模型的微调实践。
|
7月前
|
存储 人工智能 JSON
传统OCR集体阵亡!Versatile-OCR-Program:开源多语言OCR工具,精准解析表格和数学公式等复杂结构
本文解析开源OCR工具Versatile-OCR-Program的技术实现,其基于多模态融合架构实现90%以上识别准确率,支持数学公式与图表的结构化输出,为教育资料数字化提供高效解决方案。
916 5
传统OCR集体阵亡!Versatile-OCR-Program:开源多语言OCR工具,精准解析表格和数学公式等复杂结构
|
8月前
|
机器学习/深度学习 人工智能 文字识别
Umi-OCR:31K Star!离线OCR终结者!公式+二维码+多语种,开源免费吊打付费
Umi-OCR 是一款免费开源的离线 OCR 文字识别工具,支持截图、批量图片、PDF 扫描件的文字识别,内置多语言识别库,提供命令行和 HTTP 接口调用功能。
713 0
Umi-OCR:31K Star!离线OCR终结者!公式+二维码+多语种,开源免费吊打付费
|
10月前
|
机器学习/深度学习 人工智能 文字识别
Zerox:AI驱动的万能OCR工具,精准识别复杂布局并输出Markdown格式,支持PDF、DOCX、图片等多种文件格式
Zerox 是一款开源的本地化高精度OCR工具,基于GPT-4o-mini模型,支持PDF、DOCX、图片等多种格式文件,能够零样本识别复杂布局文档,输出Markdown格式结果。
884 4
Zerox:AI驱动的万能OCR工具,精准识别复杂布局并输出Markdown格式,支持PDF、DOCX、图片等多种文件格式
|
10月前
|
编解码 文字识别 自然语言处理
如何使用OCR技术批量识别图片中的文字并重命名文件,OCR 技术批量识别图片中的文字可能出现的错误
### 简介 【批量识别图片内容重命名】工具可批量识别图片中的文字并重命名文件,方便高效处理大量图片。然而,OCR 技术面临字符识别错误(如形近字混淆、生僻字识别不佳)、格式错误(段落错乱、换行问题)和语义理解错误等挑战。为提高准确性,建议提升图片质量、选择合适的 OCR 软件及参数,并结合自动校对与人工审核,确保最终文本的正确性和完整性。
1342 12
如何使用OCR技术批量识别图片中的文字并重命名文件,OCR 技术批量识别图片中的文字可能出现的错误
|
8月前
|
文字识别 UED Python
对双栏 | 单双栏混合 | 图表文字混合的复杂布局的图片OCR识别(对布局复杂的整个pdf进行OCR识别)
这个故事告诉我们要多尝试不同的库和引擎,尤其是需求比较偏门或者少见的时候。同一个方向不同的库所擅长的领域是不一样的。 博客不应该只有代码和解决方案,重点应该在于给出解决方案的同时分享思维模式,只有思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
人工智能 文字识别 开发工具
印刷文字识别使用问题之是否支持识别并返回文字在图片中的位置信息
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
人工智能 JSON 文字识别
印刷文字识别使用问题之如何数电发票进行识别
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。
|
文字识别 数据安全/隐私保护 iOS开发
印刷文字识别使用问题之如何识别礼品册上的卡号、密码信息
印刷文字识别产品,通常称为OCR(Optical Character Recognition)技术,是一种将图像中的印刷或手写文字转换为机器编码文本的过程。这项技术广泛应用于多个行业和场景中,显著提升文档处理、信息提取和数据录入的效率。以下是印刷文字识别产品的一些典型使用合集。

热门文章

最新文章