Pix2Text (P2T) V1.0
发布,其中新的公式识别模型(MFR)精度得到极大提高,应该是当前精度最高的开源公式识别模型了。
Pix2Text (P2T)
[1]
的目标是成为
Mathpix
[2]
的
免费开源 Python 替代工具。Pix2Text
差不多是 2023 年 2 月份发布的初版,距离现在刚一年,GitHub stars 也刚突破 1000,这是个典型的缓慢积累的项目。
过去的一年中,大模型(LLM 或 LMM)发展迅速,很自然也有人尝试利用大模型来解决版面分析或数学公式识别问题。其中最受关注的当属 Meta 开源的模型
Nougat
[3]
。之后又出了号称精度更高的
Texify
[4]
。这两个项目对应的模型文件大小在 1G 左右。后来旷视又出了更大的 7B 模型
Vary
[5]
,以及后续的 2B 模型
Vary-toy
[6]
。这些模型对标准排版的图片,尤其对英文文字背景下的标准排版图片,其识别精度还是很高的。但是对于非标准排版的图片,比如中学试题,PPT,或者来自 Word 的各种奇葩排版,识别精度还是挺差的。这些大模型的另一个缺点是识别速度慢,它们基本都要求在 GPU 上才能批量运行。
如我之前所说,
Pix2Text
是坚持走
小模型 + 开源 的路线,模型大小得保证在一般的 CPU 机器上能跑得动,代码和基础模型都开源
,同时也提供精度更高的付费模型供购买后个人或商业使用。
过去的半年中 Pix2Text 的进步还是蛮大的。我在 2023 年 6 月份先是训练了
新的公式检测(MFD)模型
[7]
,然后接着在 2023 年 7 月份训练了
新的公式识别(MFR)模型
[8]
,免费使用的
P2T 网页版
[9]
也一直在缓慢进步中。在 2024 年 1 月份发布的
V0.3
[10]
中,Pix2Text 的文字识别引擎支持
80+
种语言,如英文、简体中文、繁体中文、越南语、法语等。
这次新发布的
Pix2Text V1.0
[11]
,最大变化是
MFR
使用了新的模型架构,精度得到极大提升
。之前的模型架构来自于
Latex-OCR
[12]
,可惜这个项目基本不更新了,其代码质量也很一般,各种依赖包也很陈旧,维护成本太高。所以 Pix2Text V1.0 移除了对 Latex-OCR 这个项目的依赖,新的 MFR 模型架构使用了微软的
TrOCR
[13]
。
Pix2Text V1.0 开源的 MFR 模型,其识别数学公式图片的精度已经远超我所知的各种开源模型
,如 Latex-OCR,Texify,和 Pix2Text 之前版本的所有 MFR 模型(包括付费模型),已经可以与 Mathpix 以外的其他商用模型掰掰手腕了。具体说明如下。
不同 MFR 模型精度对比
测试数据对应的原始图片来源于
Pix2Text 网页版
[14]
用户上传的真实数据。首先选取一段时间内用户的真实数据,然后利用 Pix2Text 中数学公式检测模型(MFD)检测出这些图片中的数学公式并截取出对应的部分,再从中随机选取部分公式图片进行人工标注。就获得了用于测试的测试数据集了。下图是测试数据集中的部分样例图片。从中可以看出测试数据集中的图片比较多样,包括了各种不同长度和复杂度的数学公式,有单个字母的图片,也有公式组甚至矩阵图片。本测试数据集包括了
485
张图片。
以下是各个模型在此测试数据集上的
CER(字错误率,越小越好)
。其中对真实标注结果,以及每个模型的输出都首先进行了标准化,以保证不会因为空格等无关因素影响测试结果。对 Texify 的识别结果会首先去掉公式的首尾符号
$
或
$$
。
由上图可见,
Pix2Text V1.0 MFR 开源免费版模型已经大大优于之前版本的付费模型
。而相比 V1.0 MFR 开源免费模型,
Pix2Text V1.0 MFR 付费模型精度得到了进一步的提升
。
📌 如前所述,Texify 更适用于识别标准排版的图片,它对包含单字母的图片识别较差。这也是 Texify 在此测试数据集上效果比 Latex-OCR 还差的主要原因。
效果示例
接下来展示一些示例,可以看看新版 Pix2Text V1.0 MFR (Paid) 对公式的识别效果。
下图展示了模型在一些
印刷体公式
图片上的效果。其中左侧为原图(原图见
Pix2Text Github 仓库
[15]
),右侧为 MFR 识别后渲染后的效果图。
下图展示了模型在一些
手写体公式
图片上的效果。其中左侧为原图(原图见
Pix2Text Github 仓库
[16]
),右侧为 MFR 识别后渲染后的效果图。
P2T 网页版
所有人都可以免费使用
P2T 网页版
[17]
,每人每天可以免费识别 10000 个字符,正常使用应该够用了。
请不要批量调用接口,机器资源有限,批量调用会导致其他人无法使用服务。
受限于机器资源,网页版当前只支持
简体中文和英文
,要尝试其他语言上的效果,请使用以下的
在线 Demo
。
在线 Demo
可以使用
在线 Demo
[18]
尝试
P2T
在不同语言上的效果。但在线 Demo 使用的硬件配置较低,速度会较慢。如果是
简体中文或者英文
图片,建议使用
P2T 网页版
[19]
。
付费版模型购买
购买链接
鉴于
V1.0 MFR
开源模型精度足够高,个人使用应该足够,所以
V1.0
不再提供个人版的购买,只提供企业版购买。
Pix2Text V1.0 包含两种企业版
。它们的权益差异见下图。
企业 Basic 版
是一次性购买,之后有新模型需要重新购买。
企业 Basic 版
只允许企业内部使用或者对外提供免费的服务(如教育机构),不允许对外提供付费服务。
企业 Pro 订阅版
是按年订阅,订阅期内可以免费获取所有的新模型。
企业 Pro 订阅版
也提供模型的 PyTorch 版本,企业可以基于此模型利用自己的数据进行模型精调。
企业 Pro 订阅版
允许企业对外提供付费服务。
更详细说明请见
模型购买商店
[20]
(进入商品的详情页有具体说明)。
购买链接
见:
模型购买商店
[21]
(进入商品的详情页有具体说明)。
使用说明
首先,请确保你用开源的模型跑通了
Pix2Text
[22]
,否则你下载完付费模型也跑不起来。详细安装和使用说明看
Pix2Text
[23]
项目文档就行。遇到问题可以在这里评论,或者
加入群聊
[24]
与我沟通,但
请注意帮你跑通代码不在星主的服务范围之内
(参考
星球说明
[25]
)。
通过
模型购买商店
[26]
购买
企业 Basic 版
后,可以下载模型对应的 2 个压缩文件,其中以
p2t-mfd-
开头的文件为 MFD(数学公式检测)模型,以
p2t-mfr-
开头的文件为 MFR(数学公式识别)模型。MFD 模型压缩文件解压后会看到一个名为
yolov7-model
的文件夹,里面的文件即为模型文件,比如叫
mfd-yolov7-20230613.pt
。假定文件
p2t-mfr-20230702.pth
的路径为
abc/def/yolov7-model/p2t-mfr-20230702.pth
。MFR 模型压缩文件解压后会看到一个名为
mfr-pro-onnx
的文件夹,其中包含模型文件以及相关的配置文件。假定文件夹
mfr-pro-onnx
的路径为
abc/def/mfr-pro-onnx
。
那在初始化 Pix2Text 时应该如下传入参数。初始化后的使用方式和开源模型完全一样,检测和识别结果的结构也是一样的。
#! please install pix2text>=1.0: pip install pix2text>=1.0
from pix2text import Pix2Text, merge_line_texts
img_fp = './docs/examples/mixed.jpg'
p2t = Pix2Text(
analyzer_config=dict( # 声明 LayoutAnalyzer 的初始化参数
model_name='mfd',
model_type='yolov7', # 表示使用的是 YoloV7 模型,而不是 YoloV7_Tiny 模型
model_fp='abc/def/yolov7-model/mfd-yolov7-20230613.pt', # 注:修改成你的模型文件所存储的路径
),
formula_config = dict(
model_name='mfr-pro',
model_backend='onnx',
model_dir='abc/def/mfr-pro-onnx', # 注:修改成你的模型文件所存储的路径
),
)
outs = p2t.recognize(img_fp, resized_shape=768) # 也可以使用 `p2t(img_fp)` 获得相同的结果
print(outs)
# 如果只需要识别出的文字和Latex表示,可以使用下面行的代码合并所有结果
only_text = merge_line_texts(outs, auto_line_break=True)
print(only_text)
如果购买的是
企业 Pro 订阅版
,可以下载的模型文件会更多(当前是 5 个),除了包含 MFR 的 PyTorch 版本外,也会包含
CnOCR(文本 OCR)
中的最新付费模型(ONNX 和 PyTorch 版本),它对中英文文本的识别效果比免费模型更好。可以使用如下方式传入对应的模型。
#! please install pix2text>=1.0: pip install pix2text>=1.0
from pix2text import Pix2Text, merge_line_texts
img_fp = './docs/examples/mixed.jpg'
p2t = Pix2Text(
languages=('en', 'ch_sim'),
analyzer_config=dict