admin 管理员组

文章数量: 887007

利用python进行数学公式识别

利用python进行数学公式识别

提到数学公式识别,相信大家第一时间肯定能想到神器Mathpix,虽然它很好用很好用很好用,但是价格着实有点贵。虽然Mathpix也提供了接口方便调用,但需要支付绑定费用,价格也从1美元涨到了20美元。

对于频繁使用公式识别的用户,购买一年的Pro账户或者购买api也是可以接受的。但大部分同学应该和我一样,可能在某段时间使用频繁,购买就显得很冤啊。

所以我开始尝试有没有可替代的开源项目,百度总计1000次免费额度(不考虑),腾讯和讯飞的每月有1000次免费额度,但是试用后发现效果不甚理想,而且输出的latex有莫名多的空格。

那就去程序员的宝藏(github)库里翻一翻吧,虽然大多数都是以Mathpix的api进行二次开发的,但还是有不少替代的开源项目,例如Pix2Text。试用过后发现效果较为理想,以下为python代码:

利用Pix2Text进行公式识别

在开始前,先介绍下虚拟环境。虚拟环境相当于独立分支,该环境下的安装包是独立的,不影响其他环境。由于本安装包的依赖较多,且与当前部分包产生版本冲突。因此采取新增一个虚拟环境进行试用

创建虚拟环境

  • 安装包:conda install ipykernel,conda install nb_conda

  • 设置虚拟环境:conda create -n p2t python=3.8

  • 重启juuyter

  • 在jupyter新建中选择刚才创建的虚拟环境p2t

安装过程可能会有些问题,如果是初次使用OpenCV,那估计安装都不会很顺利(作者原话)。以下是我安装过程爬过的坑,如果有同样的情况可以参考。其他情况只能自行谷歌/百度了,一般都能解决。

pip install numpy -- 提前安装好numpy
pip install requests -- 提前安装好requests
pip install pix2text
# 最新版要求os 11,否则报ImportError: dlopen... 错误
# 本机为os 10.15 不考虑折腾mac版本,选择安装旧版本,因此先删除依赖自动安装的最新版opencvpip uninstall opencv-python -y
pip install opencv-python==4.2.0.34 # 指定4.2旧版本

万事具备,开始根据作者的教程走。安装好 Pix2Text 后,首次使用时系统会自动下载模型文件,并存于 ~/.pix2text目录

def pic2latex(img):from pix2text import Pix2Textimg_fp = imgp2t = Pix2Text()out_text = p2t(img_fp)print(out_text['text'])
# 首次运行时系统会自动下载模型文件,只需等待即可
pic2latex('1.png')
100%|███████████████████████████████████████████| 1/1 [00:00<00:00, 21.21it/s]f(x)=\frac{1}{\sqrt{2\pi}\sigma}\mathrm{e}^{-\frac{(x-\mu)^{2}}{2\sigma^{2}}}

复制该latex文本写入markdown,可以正常识别: f ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x)=\frac{1}{\sqrt{2\pi}\sigma}\mathrm{e}^{-\frac{(x-\mu)^{2}}{2\sigma^{2}}} f(x)=2π ​σ1​e−2σ2(x−μ)2​

为了检验效果,这里在网上下了几张公式的图片,验证下识别效果

本文图片来源于网上,读者可自行网络搜集或点击保存图片,如果需要也可微信公众号关注HsuHeinrich,回复关键字【公式识别】自动获取

# 循环识别以下图片
from PIL import Image
import matplotlib.pyplot as plt
import numpy as npfor i in range(1,5):img = Image.open(f'{i}.png')m = np.asarray(img)plt.figure(figsize=(18,24))plt.imshow(m)plt.show()print('识别结果'+'*'*30)pic2latex(f'{i}.png')

识别结果******************************100%|███████████████████████████████████████████| 1/1 [00:00<00:00, 21.77it/s]f(x)={\frac{1}{\sqrt{2\pi}\sigma}}\mathrm{e}^{-{\frac{(x-\mu)^{2}}{2\sigma^{2}}}}

识别结果******************************100%|███████████████████████████████████████████| 1/1 [00:00<00:00, 23.07it/s]\begin{array}{c}{{f_{x}(x)=\int_{-\infty}^{\infty}f(x,y)\,\mathrm{d}y=\int_{0}^{1}{\frac{x+2y}{4}}\,\mathrm{d}y}}\\ {{\ }}\\ {{\ }}\\ {{\ }}\\ {{={\frac{x y+y^{2}}{4}}{\binom{x}{4}}\end{array}^{1}{\binom{x+1}{4}}}}\end{array}

识别结果******************************100%|███████████████████████████████████████████| 1/1 [00:00<00:00, 23.38it/s]十(-1)0-
tanh(-6.
8厂
eaD sinh 3.z2)(e一告J1 -11+ 2esD cosh(麦6.72

识别结果******************************100%|███████████████████████████████████████████| 1/1 [00:00<00:00, 21.11it/s]I(Y|X)=\sum_{x\in{\mathcal{A}},\mathfrak{p}\in{\mathcal{Y}}}p(x,y)\log\left({\frac{p(x)}{p(x,y)}}\right)
  • f ( x ) = 1 2 π σ e − ( x − μ ) 2 2 σ 2 f(x)={\frac{1}{\sqrt{2\pi}\sigma}}\mathrm{e}^{-{\frac{(x-\mu)^{2}}{2\sigma^{2}}}} f(x)=2π ​σ1​e−2σ2(x−μ)2​

  • 识别异常

  • 明显不对

  • I ( Y ∣ X ) = ∑ x ∈ A , p ∈ Y p ( x , y ) log ⁡ ( p ( x ) p ( x , y ) ) I(Y|X)=\sum_{x\in{\mathcal{A}},\mathfrak{p}\in{\mathcal{Y}}}p(x,y)\log\left({\frac{p(x)}{p(x,y)}}\right) I(Y∣X)=∑x∈A,p∈Y​p(x,y)log(p(x,y)p(x)​)

发现第二张图片和第三张图片无法识别/识别错误。

站在巨人的肩膀上

前面发现Pix2Text在特别复杂的公式识别上较差,那有没有更好的开源项目呢?应该是有的,感兴趣的同学可以自行在github中挖掘哈,如果挖掘到宝了还望不吝赐教。

这里介绍两个大佬自行开发的在线公式识别网站:

  • simpletex:无限制次数,无需登录,识别效果优于Pix2Text
  • LaTeX公式编辑器:B 站科普UP主(妈咪说MommyTalk)搭建,采用Mathpix的API。需要登陆,每日免费次数2次,可付费增加使用次数,识别效果优于simpletex(Mathpix果然是神器)

自学成才

当然了,还有一种一劳永逸的办法,就是学会latex语法。这个LaTeX公式编辑器的帮助文档写的很清晰,可以学习学习。不过对于复杂的数学公式,还是建议利用这几种方法进行识别。对于简单的数学公式自己手写就足够了,也不是很复杂。

总结

数学公式识别无论是做科研、学习笔记、技术分享都是必不可少的,不差钱或者频繁使用的的建议买个Mathpix,使用体验极佳,偶尔使用或者不想花钱的就可以尝试本文的几种方法。个人建议掌握基础的latex语法,对于简单的公式可以自行手写,稍微复杂的公式可以使用Pix2Text识别或者simpletex在线识别,过于复杂的使用LaTeX公式编辑器在线识别

共勉~

本文标签: 利用python进行数学公式识别