Model reference · open weights
ArmorOCR is an open-weight language model from inclusionAI. ArmorOCR-GGUF (GGUF) weighs 5.0 GB; the smallest configuration that runs it is RTX 3060 12 GB.
Summary of the inclusionAI/ArmorOCR model card, 2026-10-01. The estimate below is for another build of the family.
What it is
| Released by | inclusionAI |
|---|---|
| Released | 2026-08-20 |
| Parameters | 8.8B |
| VRAM | 5.0 GB for the weights |
What it runs on
How much memory each request adds isn't estimated yet for this architecture. The weights need at least the cards below, plus room for the context.
| Card | Weights alone |
|---|---|
| RTX 3060 12 GB | fits |
| RTX 4060 Ti 16 GB | fits |
| RTX 3090 24 GB | fits |
| RTX 4090 24 GB | fits |
| RTX 5090 32 GB | fits |
| L40S 48 GB | fits |
| A100 80 GB | fits |
| H100 80 GB | fits |
| RTX PRO 6000 Blackwell 96 GB | fits |
| DGX Spark (GB10) 128 GB unified | fits |
| H200 141 GB | fits |
| B200 180 GB | fits |
Builds
From the model card
ArmorOCR is a two-stage framework for grounded adversarial OCR perception built on Qwen3-VL-8B-Instruct. It enables single-pass inference on the original image, without any inference-time visual transformations or tool assistance.
📖 For training details, the AdvSpot benchmark, and evaluation scripts, please visit the GitHub repo.
pip install transformers==4.57.1 accelerate
from transformers import Qwen3VLForConditionalGeneration, AutoProcessor
model = Qwen3VLForConditionalGeneration.from_pretrained(
"inclusionAI/ArmorOCR", dtype="auto", device_map="auto",
)
processor = AutoProcessor.from_pretrained("inclusionAI/ArmorOCR")
messages = [{
"role": "user",
"content": [
{"type": "image", "image": "path/to/image.png"},
{"type": "text",
"text": ("Please identify the text in the image. "
"Put your reasoning inside "
"and your final recognized text inside .")},
],
}]
inputs = processor.apply_chat_template(
messages, tokenize=True, add_generation_prompt=True,
return_dict=True, return_tensors="pt",
).to(model.device)
out = model.generate(**inputs, max_new_tokens=256)
trimmed = [o[len(i):] for i, o in zip(inputs.input_ids, out)]
print(processor.batch_decode(trimmed, skip_special_tokens=True))
Released under the Apache License 2.0. Use is additionally subject to the license and acceptable-use policy of the base model Qwen/Qwen3-VL-8B-Instruct.
@misc{cao2026armorocrgroundedadversarialvisual,
title={ArmorOCR: Grounded Adversarial Visual Perception via Observation-Transferred Self-Distillation},
author={Linhan Cao and Siyuan Li and Jun Lan and Liangbo He and Guannan Li and Xiaolei Huang and Jun Jia and Shuheng Zhou and Huijia Zhu and Weiqiang Wang and Wei Sun},
year={2026},
eprint={2608.20122},
archivePrefix={arXiv},
primaryClass={cs.CV},
url={https://arxiv.org/abs/2608.20122},
}
Quoted from the model card on Hugging Face. The full card is behind the Hugging Face link above.