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π σ1e−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π σ1e−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∈Yp(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进行数学公式识别
版权声明:本文标题:利用python进行数学公式识别 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.freenas.com.cn/jishu/1732357357h1534817.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论