✍️

Pix2Textを使って手書きの数式をLaTeXに変換

2024/06/05に公開

手書きの画像からLaTeX数式を生成するサービスやアプリを探していて、良さげなものが見つかったので報告します。試した例では、GPT-4oよりも良い結果が出ています。

Pix2Text https://github.com/breezedeus/Pix2Text

Pix2TextはPDFファイルをMarkdownに変換するアプリです。

  • インストールやモデルのダウンロードを除けば、ローカルPCで動作します。
  • 数式を認識してLaTeX数式に変換する機能も含まれているので、今回はこれを利用します。
  • GitHubの紹介文によるとフリーでオープンソースです。ライセンスはMITです。

An Open-Source Python3 tool for recognizing layouts, tables, math formulas (LaTeX), and text in images, converting them into Markdown format. A free alternative to Mathpix, empowering seamless conversion of visual content into text-based representations. 80+ languages are supported.

動作確認はUbuntu 22.04で行いました。

インストール

インストールはpipで行いますが、PDFを入力するには別途easyocrも必要でした。

pip3 install pix2text
pip3 install easyocr

インストールすると、p2tというコマンドが利用できるようになります。

$ p2t -h
Usage: p2t [OPTIONS] COMMAND [ARGS]...

Options:
  -h, --help  Show this message and exit.

Commands:
  predict  Use Pix2Text (P2T) to predict the text information in an image...
  serve    Start the HTTP service.

(1) 手書きの数式を認識する

数式の画像ファイルをコマンドラインから与えます。

p2t predict --img-file-or-dir=画像ファイル

実行例:

$ p2t predict --img-file-or-dir=eq4.png
Fix size testing.
training chunk_sizes: [32]
.... (中略) ....
[INFO 2024-06-05 02:51:39,473 predict:218] In image: eq4.png
Outs: 

$$
\sum_{n=1}^{1 0} 3^{n}+\frac{1} {4^{n}}
$$

この例で与えた画像ファイルは次のものであり、

出力は\sum_{n=1}^{1 0} 3^{n}+\frac{1} {4^{n}}なので、正しくLaTeX数式が生成できています。

(2) PDFファイルをMarkdownに変換する

どちらかと言うと、これがPix2Textの本来の使い方ですね。OCR機能が含まれていて、コマンドラインから言語を指定したほうが結果が良いようです。

p2t predict -l 言語 --file-type=pdf --img-file-or-dir=PDFファイル

実行例:

$ p2t predict -l en,ja --file-type=pdf --img-file-or-dir=presen-p5.pdf
Fix size testing.
training chunk_sizes: [32]
.... (中略) ....
[INFO 2024-06-05 03:01:41,052 predict:218] In image: presen-p5.pdf
Outs: 
## 原因; コンテキスト長

![](figures/0-2-FIGURE.jpg)

## コンテキスト=プロンプト + 応答

LLMには処理できるコンテキストの長さ の制限 ( コンテキスト長) がある

コンテキスト長を超えると応答の内容が悪くなる

チャットuのLLMではプロンプトの 最大長を制限している

## 代表的なLLMのコンテキスト長 (200kトークンまでのものが多い)

| LLM | プロンプト長 |
| --- | --- |
| gpt-4 ※1 8k 128k |
| Gemini 1.5 Pro ※2 1m |
| Claude 3 ※3 2OOk |
| Llama 3 ※4 8k |
| MistralvO.2 ※5 32k |
| MixtralvO. | 5 64k |

1 hitps:llplatform_epenaicomldocslmodelsL

2 https:lai_ggggle_deylgemini_apildocslmodelslgemini2 hsja#gemini15_prg

※3 hitps lwww_anthrepic_comlnewslclaude-3-family

※5 https:Hhuggingface_colmistralailMistral_ZB_Instruct v0.2

この例で与えたPDFファイル(を画像ファイルに変換したもの)は次です。

2カラムだったり、画像やテーブルが入っていたりしますが、レイアウトもうまく認識されています。テーブルのセルの認識や、文字が小さいところを中心の文字化けしていたりしますが、ここまで生成してくれるならかなり助かります。

比較

GPT-4o

GPT-4oもかなりうまくLaTeX数式を生成できるようです。

上の(1)で利用した画像を与えて実行すると、出力はほぼ正解ですが、4^{n}であるべきところが4nになっていました。

llava-llama3

https://ollama.com/library/llava-llama3

llava-llama3をollamaから利用した場合には、なんとなく数式っぽいものが認識されている、くらいの結果でした。

$ ollama run llava-llama3 "convert it to LaTeX math expression: ./eq4.png"
Added image './eq4.png'
$\frac{3}{2} + 4$

pix2tex

https://github.com/lukas-blecher/LaTeX-OCR/

印刷物を前提としている?ためか、手書きの数式の認識は苦手なようです。

$ pix2tex eq4.png
/usr/lib/python3/dist-packages/paramiko/transport.py:237: CryptographyDeprecationWarning: Blowfish has been deprecated and will be removed in a future release
.... (中略) ....
/home/toshihiro/tmp/eq4.png: \sum_{\gamma\vdash}^{b}\mathcal{J}^{n}+\frac{i}{\mathcal{W}^{\flat}}

感想

まだ開発段階でオプションが一部認識されなかったり、マニュアルが中国語のものだけでとっつきにくいといった点はありますが、現時点でも使いでがあるアプリだと思いました。

Discussion