Downloads · 30 days
87
21% of all-time downloads
Float16-cloud/typhoon-ocr1.5-2b-fp8
typhoon-ocr1.5-2b-fp8 is a image-text-to-text model from Float16-cloud. Use it for the image-text-to-text task on the model card, and read the license before you ship it in a product. It is set up for transformers. The card lists the license as apache-2.0.
A Smaller, More Robust, and Faster Vision-Language OCR for Thai Real-World Documents We’re thrilled to announce Typhoon OCR v1.5, the next evolution of our open-source vision-language document parsing model for Englis…
Downloads · 30 days
87
21% of all-time downloads
All-time downloads
424
Public
Parameters
2.4B
10.6 GB on disk
Likes
0
Public
Click a slice to open those files.
.safetensors7.7 GB · 100%
How the weights are stored.
F8_E4M31.4B · 58%
From the Hugging Face model README
A Smaller, More Robust, and Faster Vision-Language OCR for Thai Real-World Documents We’re thrilled to announce Typhoon OCR v1.5, the next evolution of our open-source vision-language document parsing model for English and Thai. Built on top of Qwen3-VL 2B, this release delivers faster inference, improved understanding of handwritten and form-based documents, and enhanced handling of both text-rich and image-rich pages—all in a smaller, more efficient package.
Try our demo available on Demo
Code / Examples available on Github
Release Blog available on OpenTyphoon Blog
*Remark: This model is intended to be used with a specific prompt only; it will not work with any other prompts.
*Remark: If you want to run the model locally, we recommend using the Ollama build at https://ollama.com/scb10x. We’ve found that the GGUF files for llama.cpp or LM Studio may suffer from accuracy issues.
Typhoon OCR v1.5 continues to produce structured, machine-friendly outputs optimized for downstream AI and document intelligence tasks.
<figure> – for figures, charts, and diagrams<figure>
A bar chart comparing domestic and export revenue growth
between Q1 and Q2 2025.
</figure>
<page_number> – for preserving page number<page_number>1</page_number>
This standardized output format allows seamless integration into RAG systems, LLM pipelines, and structured databases.



prompt = """Extract all text from the image.
Instructions:
- Only return the clean Markdown.
- Do not include any explanation or extra text.
- You must include all information on the page.
Formatting Rules:
- Tables: Render tables using <table>...</table> in clean HTML format.
- Equations: Render equations using LaTeX syntax with inline ($...$) and block ($$...$$).
- Images/Charts/Diagrams: Wrap any clearly defined visual areas (e.g. charts, diagrams, pictures) in:
<figure>
Describe the image's main elements (people, objects, text), note any contextual clues (place, event, culture), mention visible text and its meaning, provide deeper analysis when relevant (especially for financial charts, graphs, or documents), comment on style or architecture if relevant, then give a concise overall summary. Describe in Thai.
</figure>
- Page Numbers: Wrap page numbers in <page_number>...</page_number> (e.g., <page_number>14</page_number>).
- Checkboxes: Use ☐ for unchecked and ☑ for checked boxes."""
Full inference code available on Colab Using Typhoon-OCR Package
pip install typhoon-ocr -U
from typhoon_ocr import ocr_document
# please set env TYPHOON_OCR_API_KEY or OPENAI_API_KEY to use this function
markdown = ocr_document("test.png", model = "typhoon-ocr", figure_language = "Thai", task_type = "v1.5")
print(markdown)
Local Model via vllm (GPU Required):
pip install vllm
vllm serve scb10x/typhoon-ocr1.5-2b --max-model-len 49152 --served-model-name typhoon-ocr-1-5 # OpenAI Compatible at http://localhost:8000 (or other port)
# then you can supply base_url in to ocr_document
from typhoon_ocr import ocr_document
markdown = ocr_document('image.png', model = "typhoon-ocr" , figure_language = "Thai" , task_type="v1.5", base_url='http://localhost:8000/v1', api_key='no-key')
print(markdown)
To read more about vllm
Local Model - Transformers (GPU Required):
from transformers import AutoModelForImageTextToText, AutoProcessor
from PIL import Image
def resize_if_needed(img, max_size):
width, height = img.size
# Only resize if one dimension exceeds max_size
if width > 300 or height > 300:
if width >= height:
scale = max_size / float(width)
new_size = (max_size, int(height * scale))
else:
scale = max_size / float(height)
new_size = (int(width * scale), max_size)
img = img.resize(new_size, Image.Resampling.LANCZOS)
print(f"{width, height}==> {img.size}")
return img
else:
return img
model = AutoModelForImageTextToText.from_pretrained(
"scb10x/typhoon-ocr1.5-2b", dtype="auto", device_map="auto"
)
processor = AutoProcessor.from_pretrained("scb10x/typhoon-ocr1.5-2b")
img = Image.open("image.png")
#This is important because the model is trained with a fixed image dimension of 1800 px
img = resize_if_needed(img, 1800)
messages = [
{
"role": "user",
"content": [
{
"type": "image",
"image": img,
},
{
"type": "text",
"text": prompt
}
],
}
]
# Preparation for inference
inputs = processor.apply_chat_template(
messages,
tokenize=True,
add_generation_prompt=True,
return_dict=True,
return_tensors="pt"
)
inputs = inputs.to(model.device)
# Inference: Generation of the output
generated_ids = model.generate(**inputs, max_new_tokens=10000)
generated_ids_trimmed = [
out_ids[len(in_ids) :] for in_ids, out_ids in zip(inputs.input_ids, generated_ids)
]
output_text = processor.batch_decode(
generated_ids_trimmed, skip_special_tokens=True, clean_up_tokenization_spaces=False
)
print(output_text[0])
We recommend to inference typhoon-ocr using vllm instead of huggingface transformers, and using typhoon-ocr library to ocr documents. To read more about vllm
pip install vllm
vllm serve scb10x/typhoon-ocr1.5-2b --max-model-len 49152 --served-model-name typhoon-ocr-1-5 # OpenAI Compatible at http://localhost:8000
# then you can supply base_url in to ocr_document
from typhoon_ocr import ocr_document
markdown = ocr_document('image.png', model = "typhoon-ocr" , figure_language = "Thai", task_type="v1.5", base_url='http://localhost:8000/v1', api_key='no-key')
print(markdown)
We recommend running Typhoon-OCR on-device using Ollama.
This is a task-specific model intended to be used only with the provided prompts. It does not include any guardrails or VQA capability. Due to the nature of large language models (LLMs), a certain level of hallucination may occur. We recommend that developers carefully assess these risks in the context of their specific use case.
https://twitter.com/opentyphoon
@misc{typhoon2,
title={Typhoon 2: A Family of Open Text and Multimodal Thai Large Language Models},
author={Kunat Pipatanakul and Potsawee Manakul and Natapong Nitarach and Warit Sirichotedumrong and Surapon Nonesung and Teetouch Jaknamon and Parinthapat Pengpun and Pittawat Taveekitworachai and Adisai Na-Thalang and Sittipong Sripaisarnmongkol and Krisanapong Jirayoot and Kasima Tharnpipitchai},
year={2024},
eprint={2412.13702},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2412.13702},
}
@misc{nonesung2025thaiocrbenchtaskdiversebenchmarkvisionlanguage,
title={ThaiOCRBench: A Task-Diverse Benchmark for Vision-Language Understanding in Thai},
author={Surapon Nonesung and Teetouch Jaknamon and Sirinya Chaiophat and Natapong Nitarach and Chanakan Wittayasakpan and Warit Sirichotedumrong and Adisai Na-Thalang and Kunat Pipatanakul},
year={2025},
eprint={2511.04479},
archivePrefix={arXiv},
primaryClass={cs.CL},
url={https://arxiv.org/abs/2511.04479},
}