back to home

lukas-blecher / LaTeX-OCR

pix2tex: Using a ViT to convert images of equations into LaTeX code.

16,255 stars
1,288 forks
157 issues
PythonJavaScriptJupyter Notebook

AI Architecture Analysis

This repository is indexed by RepoMind. By analyzing lukas-blecher/LaTeX-OCR in our AI interface, you can instantly generate complete architecture diagrams, visualize control flows, and perform automated security audits across the entire codebase.

Our Agentic Context Augmented Generation (Agentic CAG) engine loads full source files into context on-demand, avoiding the fragmentation of traditional RAG systems. Ask questions about the architecture, dependencies, or specific features to see it in action.

Source files are only loaded when you start an analysis to optimize performance.

Embed this Badge

Showcase RepoMind's analysis directly in your repository's README.

[![Analyzed by RepoMind](https://img.shields.io/badge/Analyzed%20by-RepoMind-4F46E5?style=for-the-badge)](https://repomind.in/repo/lukas-blecher/LaTeX-OCR)
Preview:Analyzed by RepoMind

Repository Overview (README excerpt)

Crawler view

pix2tex - LaTeX OCR The goal of this project is to create a learning based system that takes an image of a math formula and returns corresponding LaTeX code. Using the model To run the model you need Python 3.7+ If you don't have PyTorch installed. Follow their instructions here. Install the package : Model checkpoints will be downloaded automatically. There are three ways to get a prediction from an image. • You can use the command line tool by calling . Here you can parse already existing images from the disk and images in your clipboard. • Thanks to @katie-lim, you can use a nice user interface as a quick way to get the model prediction. Just call the GUI with . From here you can take a screenshot and the predicted latex code is rendered using MathJax and copied to your clipboard. Under linux, it is possible to use the GUI with (which comes with multiple monitor support). For other Wayland compositers, and will be used for wlroots-based Wayland compositers and for KDE Plasma. Note that is not compatible with wlroots or Qt based compositers. Since will be preferred when available, you may have to set the environment variable to or in these cases (other available values are and ). If the model is unsure about the what's in the image it might output a different prediction every time you click "Retry". With the parameter you can control this behavior (low temperature will produce the same result). • You can use an API. This has additional dependencies. Install via and run to start a Streamlit demo that connects to the API at port 8502. There is also a docker image available for the API: https://hub.docker.com/r/lukasblecher/pix2tex To also run the streamlit demo run and navigate to http://localhost:8501/ • Use from within Python The model works best with images of smaller resolution. That's why I added a preprocessing step where another neural network predicts the optimal resolution of the input image. This model will automatically resize the custom image to best resemble the training data and thus increase performance of images found in the wild. Still it's not perfect and might not be able to handle huge images optimally, so don't zoom in all the way before taking a picture. Always double check the result carefully. You can try to redo the prediction with an other resolution if the answer was wrong. **Want to use the package?** I'm trying to compile a documentation right now. Visit here: https://pix2tex.readthedocs.io/ Training the model Install a couple of dependencies . • First we need to combine the images with their ground truth labels. I wrote a dataset class (which needs further improving) that saves the relative paths to the images with the LaTeX code they were rendered with. To generate the dataset pickle file run To use your own tokenizer pass it via (See below). You can find my generated training data on the Google Drive as well (formulae.zip - images, math.txt - labels). Repeat the step for the validation and test data. All use the same label text file. • Edit the (and ) entry in the config file to the newly generated file. Change other hyperparameters if you want to. See for a template. • Now for the actual training run If you want to use your own data you might be interested in creating your own tokenizer with Don't forget to update the path to the tokenizer in the config file and set to your vocabulary size. Model The model consist of a ViT [1] encoder with a ResNet backbone and a Transformer [2] decoder. Performance | BLEU score | normed edit distance | token accuracy | | ---------- | -------------------- | -------------- | | 0.88 | 0.10 | 0.60 | Data We need paired data for the network to learn. Luckily there is a lot of LaTeX code on the internet, e.g. wikipedia, arXiv. We also use the formulae from the im2latex-100k [3] dataset. All of it can be found here Dataset Requirements In order to render the math in many different fonts we use XeLaTeX, generate a PDF and finally convert it to a PNG. For the last step we need to use some third party tools: • XeLaTeX • ImageMagick with Ghostscript. (for converting pdf to png) • Node.js to run KaTeX (for normalizing Latex code) • Python 3.7+ & dependencies (specified in ) Fonts Latin Modern Math, GFSNeohellenicMath.otf, Asana Math, XITS Math, Cambria Math TODO • [x] add more evaluation metrics • [x] create a GUI • [ ] add beam search • [ ] support handwritten formulae (kinda done, see training colab notebook) • [ ] reduce model size (distillation) • [ ] find optimal hyperparameters • [ ] tweak model structure • [ ] fix data scraping and scrape more data • [ ] trace the model (#2) Contribution Contributions of any kind are welcome. Acknowledgment Code taken and modified from lucidrains, rwightman, im2markup, arxiv_leaks, pkra: Mathjax, harupy: snipping tool References [1] An Image is Worth 16x16 Words [2] Attention Is All You Need [3] Image-to-Markup Generation with Coarse-to-Fine Attention