Skip to main content

Python3 package to extract text information from images

Project description

English | 中文

Pix2Text

Pix2Text 期望成为 Mathpix免费开源 Python 替代工具,完成与 Mathpix 类似的功能。当前 Pix2Text 可识别截屏图片中的数学公式英文、或者中文文字。它的流程如下:

Pix2Text流程

Pix2Text首先利用图片分类模型来判断图片类型,然后基于不同的图片类型,把图片交由不同的识别系统进行文字识别:

  1. 如果图片类型为 formula ,表示图片为数学公式,此时调用 LaTeX-OCR 识别图片中的数学公式,返回其Latex表示;
  2. 如果图片类型为english,表示图片中包含的是英文文字,此时使用 CnOCR 中的英文模型识别其中的英文文字;英文模型对于纯英文的文字截图,识别效果比通用模型好;
  3. 如果图片类型为general,表示图片中包含的是常见文字,此时使用 CnOCR 中的通用模型识别其中的中或英文文字。

后续图片类型会依据应用需要做进一步的细分。

欢迎扫码加小助手为好友,备注 p2t,小助手会定期统一邀请大家入群:

微信群二维码

作者也维护 知识星球 P2T/CnOCR/CnSTD私享群 ,这里面的提问会较快得到作者的回复,欢迎加入。知识星球私享群也会陆续发布一些P2T/CnOCR/CnSTD相关的私有资料,包括更详细的训练教程未公开的模型不同应用场景的调用代码,使用过程中遇到的难题解答等。本群也会发布OCR/STD相关的最新研究资料。

使用说明

调用很简单,以下是示例:

from pix2text import Pix2Text

img_fp = './docs/examples/formula.jpg'
p2t = Pix2Text()
out_text = p2t(img_fp)  # 也可以使用 `p2t.recognize(img_fp)` 获得相同的结果
print(out_text)

返回结果 out_text 是个 dict,其中 key image_type 表示图片分类类别,而 key text 表示识别的结果。

以下是一些示例图片的识别结果:

图片 Pix2Text识别结果
formula
{"image_type": "formula",
 "text": "\\mathcal{L}_{\\mathrm{eyelid}}~\\longrightarrow"
 "\\sum_{t=1}^{T}\\sum_{v=1}^{V}\\mathcal{N}"
 "\\cal{M}_{v}^{\\mathrm{(eyelid}})"
 "\\left(\\left|\\left|\\hat{h}_{t,v}\\,-\\,"
 "\\mathcal{x}_{t,v}\\right|\\right|^{2}\\right)"}
english
{"image_type": "english",
 "text": "python scripts/screenshot_daemon_with_server\n"
         "2-get_model:178usemodel:/Users/king/.cr\n"
         "enet_lite_136-fc-epoch=039-complete_match_er"}
general
{"image_type": "general",
 "text": "618\n开门红提前购\n很贵\n买贵返差\n终于降价了\n"
          "100%桑蚕丝\n要买趁早\n今日下单188元\n仅限一天"}

模型下载

安装好 Pix2Text 后,首次使用时系统会自动下载 模型文件,并存于 ~/.pix2text目录(Windows下默认路径为 C:\Users\<username>\AppData\Roaming\pix2text)。

Note

如果已成功运行上面的示例,说明模型已完成自动下载,可忽略本节后续内容。

对于分类模型,系统会自动下载模型zip文件并对其解压,然后把解压后的模型相关目录放于~/.pix2text目录中。如果系统无法自动成功下载zip文件,则需要手动从 cnstd-cnocr-models/pix2text 下载此zip文件并把它放于 ~/.pix2text目录。如果下载太慢,也可以从 百度云盘 下载, 提取码为 p2t0

对于 LaTeX-OCR ,系统同样会自动下载模型文件并把它们存放于~/.pix2text/formula目录中。如果系统无法自动成功下载这些模型文件,则需从 百度云盘 下载文件 weights.pthimage_resizer.pth, 并把它们存放于~/.pix2text/formula目录中;提取码为 p2t0

安装

嗯,顺利的话一行命令即可。

pip install pix2text

安装速度慢的话,可以指定国内的安装源,如使用豆瓣源:

pip install pix2text -i https://pypi.doubanio.com/simple

如果是初次使用OpenCV,那估计安装都不会很顺利,bless。

Pix2Text 主要依赖 CnOCR>=2.2.2 ,以及 LaTeX-OCR 。如果安装过程遇到问题,也可参考它们的安装说明文档。

Warning

如果电脑中从未安装过 PyTorchOpenCV python包,初次安装可能会遇到不少问题,但一般都是常见问题,可以自行百度/Google解决。

接口说明

类初始化

主类为 Pix2Text ,其初始化函数如下:

class Pix2Text(object):
    def __init__(
        self,
        *,
        clf_config: Dict[str, Any] = None,
        general_config: Dict[str, Any] = None,
        english_config: Dict[str, Any] = None,
        formula_config: Dict[str, Any] = None,
        thresholds: Dict[str, Any] = None,
        device: str = 'cpu',  # ['cpu', 'cuda', 'gpu']
        **kwargs,
    ):

其中的各参数说明如下:

  • clf_config (dict): 分类模型对应的配置信息;默认为 None,表示使用默认配置:

    {
         'base_model_name': 'mobilenet_v2',
         'categories': IMAGE_TYPES,
         'transform_configs': {
             'crop_size': [150, 450],
             'resize_size': 160,
             'resize_max_size': 1000,
         },
         'model_dir': Path(data_dir()) / 'clf',
         'model_fp': None  # 如果指定,直接使用此模型文件
    }
    
  • general_config (dict): 通用模型对应的配置信息;默认为 None,表示使用默认配置:

    {}
    
  • english_config (dict): 英文模型对应的配置信息;默认为 None,表示使用默认配置:

    {'det_model_name': 'en_PP-OCRv3_det', 'rec_model_name': 'en_PP-OCRv3'}
    
  • formula_config (dict): 公式识别模型对应的配置信息;默认为 None,表示使用默认配置:

    {
        'config': LATEX_CONFIG_FP,
        'checkpoint': Path(data_dir()) / 'formular' / 'weights.pth',
        'no_resize': False
    }
    
  • thresholds (dict): 识别阈值对应的配置信息;默认为 None,表示使用默认配置:

    {
        'formula2general': 0.65,  # 如果识别为 `formula` 类型,但得分小于此阈值,则改为 `general` 类型
        'english2general': 0.75,  # 如果识别为 `english` 类型,但得分小于此阈值,则改为 `general` 类型
    }
    
  • device (str): 使用什么资源进行计算,支持 ['cpu', 'cuda', 'gpu'];默认为 cpu

  • **kwargs (): 预留的其他参数;目前未被使用

识别类函数

通过调用类 Pix2Text 的类函数 .recognize() 完成对指定图片的文字或Latex识别。类函数 .recognize() 说明如下:

    def recognize(self, img: Union[str, Path, Image.Image]) -> Dict[str, Any]:
        """

        Args:
            img (str or Image.Image): an image path, or `Image.Image` loaded by `Image.open()`

        Returns: a dict, with keys:
           `image_type`: 图像类别;
           `text`: 识别出的文字或Latex公式

        """

其中的输入参数说明如下:

  • img (str or Image.Image):待识别图片的路径,或者利用 Image.open() 已读入的图片 Image

返回结果说明如下:

  • image_type:识别出的图像类别;取值为 formulaenglish 或者 general
  • text:识别出的文字或Latex公式 。

如前面给出的一个示例结果:

{"image_type": "general",
 "text": "618\n开门红提前购\n很贵\n买贵返差\n终于降价了\n"
          "100%桑蚕丝\n要买趁早\n今日下单188元\n仅限一天"}

Pix2Text 类也实现了 __call__() 函数,其功能与 .recognize() 函数完全相同。所以才会有以下的调用方式:

from pix2text import Pix2Text

img_fp = './docs/examples/formula.jpg'
p2t = Pix2Text()
out_text = p2t(img_fp)  # 也可以使用 `p2t.recognize(img_fp)` 获得相同的结果
print(out_text)

HTTP服务

Pix2Text 加入了基于 FastAPI 的HTTP服务。开启服务需要安装几个额外的包,可以使用以下命令安装:

pip install pix2text[serve]

安装完成后,可以通过以下命令启动HTTP服务(-p 后面的数字是端口,可以根据需要自行调整):

p2t serve -p 8503

服务开启后,可以使用以下方式调用服务。

命令行

比如待识别文件为 docs/examples/english.jpg,如下使用 curl 调用服务:

> curl -F image=@docs/examples/english.jpg http://0.0.0.0:8503/pix2text

Python

使用如下方式调用服务:

import requests

image_fp = 'docs/examples/english.jpg'
r = requests.post(
    'http://0.0.0.0:8503/pix2text', files={'image': (image_fp, open(image_fp, 'rb'), 'image/png')},
)
out = r.json()['results']
print(out)

其他语言

请参照 curl 的调用方式自行实现。

脚本运行

脚本 scripts/screenshot_daemon.py 实现了自动对截屏图片调用 Pixe2Text 进行公式或者文字识别。这个功能是如何实现的呢?

以下是具体的运行流程(请先安装好 Pix2Text):

  1. 找一个喜欢的截屏软件,这个软件只要支持把截屏图片存储在指定文件夹即可。比如Mac下免费的 Xnip 就很好用。

  2. 除了安装Pix2Text外,还需要额外安装一个Python包 pyperclip,利用它把识别结果复制进系统的剪切板:

    $ pip install pyperclip
    
  3. 下载脚本文件 scripts/screenshot_daemon.py 到本地,编辑此文件 "SCREENSHOT_DIR" 所在行(第 17 行),把路径改为你的截屏图片所存储的目录。

  4. 运行此脚本:

    $ python scripts/screenshot_daemon.py
    

好了,现在就用你的截屏软件试试效果吧。截屏后的识别结果会写入当前文件夹的 out-text.html 文件,只要在浏览器中打开此文件即可看到效果。

更详细使用介绍可参考视频:《Pix2Text: 替代 Mathpix 的免费 Python 开源工具》。

微信群二维码

Note

感谢我的同事帮忙完成了此页面的大部分工作。这个页面还有很大改进空间,欢迎对前端熟悉的朋友帮忙提PR优化此页面。

给作者来杯咖啡

开源不易,如果此项目对您有帮助,可以考虑 给作者加点油🥤,鼓鼓气💪🏻


官方代码库:https://github.com/breezedeus/pix2text

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

pix2text-0.1.1.tar.gz (34.1 kB view hashes)

Uploaded Source

Built Distribution

pix2text-0.1.1-py3-none-any.whl (36.5 kB view hashes)

Uploaded Python 3

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page