{
 "schema_version": "1.0",
 "page_kind": "article",
 "pack_kind": "generate",
 "slug": "how-ocr-differs-from-vision",
 "title": "How OCR differs from vision: a field guide, with eight images read three ways",
 "dek": "OCR reads the characters in a picture and cannot invent a word; a vision model describes the picture and can.",
 "published": "2026-10-28",
 "series": [
  "guide"
 ],
 "licence": "CC BY 4.0, except every output of Indra OCR the page quotes, in its tables and in its text, which is shared under that model's own licence, the AI PUBS OPEN RAIL-M LICENSE (MODIFIED), version 0.1 of 2 March 2023, and under no other; a copy of that licence is served beside the page, at https://research.strata2signal.com/how-ocr-differs-from-vision/indra-ocr-LICENSE.txt",
 "status": "pending-judge",
 "pack_note": "no judge is seated, so every chip is held",
 "notice": "items with published:false are held and are not this page's published words",
 "source": {
  "url": "https://research.strata2signal.com/how-ocr-differs-from-vision/",
  "md_url": "https://research.strata2signal.com/how-ocr-differs-from-vision/index.md",
  "md_sha": "763f5a7d6b2ffe313230c11a33cf37fa2c1d12cd9d051f10f152617baddeeecc",
  "html_sha": "e5ca2cacce7e6c853e506751b43c3292f66fa0f625afd593ed0b05b355525b4e",
  "anchors_sha": "990aa26d48c2d093fc395dcc690c5ca87956b445116f07e21b71be07a5d7d1c9"
 },
 "short": {
  "paragraph": "OCR, optical character recognition, finds the lines of text in an image and writes out their characters. It returns nothing else, and it cannot make up a word it did not see, though it can misread one. A vision model, more fully a vision-language model, turns the picture into tokens a language model can read, then writes prose about it: the objects, the scene, the style and, if asked, the text. Its answers are fluent and often right, but composed, not copied. On our notice with small print it quoted a footer line that is not on the page, differently under each of two prompts, at temperature 0; on the same page Tesseract dropped the small print and Indra OCR misread it believably. Only the vision model saw the cup in the picture with the cup, and only it called our leafy seadragon a \"seahorse\". Searching scanned pages wants OCR. Asking what a picture shows wants vision. Anything you will quote or cite wants checking against the page, whichever reader produced it: the vision model invented a line, and Indra OCR turned \"3 February\" into \"2 February\".",
  "from_dek": false,
  "counts": {
   "words": 4408,
   "minutes": 20,
   "tables": 5,
   "kit": false
  },
  "bullets": []
 },
 "sections": [
  {
   "id": "the-readers",
   "heading": "The three readers, named",
   "level": 2,
   "span": [
    2479,
    3723
   ],
   "chunks": [
    [
     2479,
     3723
    ]
   ],
   "chars": 1244,
   "digest": "the article identifies three readers: Indra OCR 1.1.2, Tesseract 5.5.0 with tessdata_best, and gemma4:26b. Indra and Tesseract are OCR engines running on a laptop CPU, while gemma4:26b is a 26 billion parameter vision-language model served by ollama on an inference server. gemma4:26b uses two specific prompts, read and describe, at temperature 0.",
   "digest_skipped": null
  },
  {
   "id": "what-ocr-does",
   "heading": "What OCR is and does",
   "level": 2,
   "span": [
    3723,
    4798
   ],
   "chunks": [
    [
     3723,
     4798
    ]
   ],
   "chars": 1075,
   "digest": "OCR involves three steps: finding text lines, reading characters, and outputting strings in reading order. Its strength is reporting exact characters and glyphs without opinion. Its blind spots include non-text elements, small print, stylised lettering, and rotation.",
   "digest_skipped": null
  },
  {
   "id": "what-a-vision-model-does",
   "heading": "What a vision model is and does",
   "level": 2,
   "span": [
    4798,
    5964
   ],
   "chunks": [
    [
     4798,
     5964
    ]
   ],
   "chars": 1166,
   "digest": "A vision-language model uses an image encoder to turn pictures into tokens for a language model to process alongside a prompt. It excels at naming objects, styles, and moods, but lacks exactness, as it may paraphrase or invent plausible text.",
   "digest_skipped": null
  },
  {
   "id": "where-they-overlap",
   "heading": "Where they overlap",
   "level": 2,
   "span": [
    5964,
    6810
   ],
   "chunks": [
    [
     5964,
     6810
    ]
   ],
   "chars": 846,
   "digest": "Vision-language models can read clean, normal-sized text exactly. The difference lies in failure modes: an OCR engine returns characters or nothing, while a vision model returns fluent but potentially incorrect text that fits its expectations.",
   "digest_skipped": null
  },
  {
   "id": "the-demo",
   "heading": "The demo: eight images, one run each",
   "level": 2,
   "span": [
    6810,
    24139
   ],
   "chunks": [
    [
     6810,
     24139
    ]
   ],
   "chars": 17329,
   "digest": null,
   "digest_skipped": null
  },
  {
   "id": "which-to-use-when",
   "heading": "Which to use when",
   "level": 2,
   "span": [
    24139,
    25209
   ],
   "chunks": [
    [
     24139,
     25209
    ]
   ],
   "chars": 1070,
   "digest": "OCR is best for searching scanned pages where findable words are required. Vision models are better for describing scenes or styles. For exact numbers or citations, vision model transcriptions should never be trusted unchecked.",
   "digest_skipped": null
  },
  {
   "id": "what-this-cannot-say",
   "heading": "What this cannot say",
   "level": 2,
   "span": [
    25209,
    26064
   ],
   "chunks": [
    [
     25209,
     26064
    ]
   ],
   "chars": 855,
   "digest": "The article does not address the frequency of failures, other readers or settings, real scans with blur or skew, the reason for specific vision model inventions, or any information about speed.",
   "digest_skipped": null
  },
  {
   "id": "the-images-and-the-licences",
   "heading": "The images, the fonts and the licences",
   "level": 2,
   "span": [
    26064,
    27754
   ],
   "chunks": [
    [
     26064,
     27754
    ]
   ],
   "chars": 1690,
   "digest": null,
   "digest_skipped": "credits"
  },
  {
   "id": "who-ran-this-and-thanks",
   "heading": "Who ran this, and thanks",
   "level": 2,
   "span": [
    27754,
    28318
   ],
   "chunks": [
    [
     27754,
     28318
    ]
   ],
   "chars": 564,
   "digest": null,
   "digest_skipped": "credits"
  },
  {
   "id": "sources",
   "heading": "Sources",
   "level": 2,
   "span": [
    28318,
    29682
   ],
   "chunks": [
    [
     28318,
     29682
    ]
   ],
   "chars": 1364,
   "digest": null,
   "digest_skipped": null
  }
 ],
 "chips": [
  {
   "id": "c-132e0c51",
   "q": "which models were used for the comparison?",
   "a": "The comparison involves Indra OCR 1.1.2, Tesseract 5.5.0 with tessdata_best, and gemma4:26b. The latter is a 26 billion parameter vision-language model served by ollama.",
   "cites": [
    "the-readers"
   ],
   "published": false,
   "publish_state": "held",
   "quote": "",
   "quote_cite": ""
  },
  {
   "id": "c-29303b92",
   "q": "how does an ocr engine process an image?",
   "a": "An OCR engine finds lines of text by drawing boxes around character runs, reads the characters within those boxes to turn pixels into strings, and outputs the strings in a specific reading order. Some engines also determine the page orientation first.",
   "cites": [
    "what-ocr-does"
   ],
   "published": false,
   "publish_state": "held",
   "quote": "",
   "quote_cite": ""
  },
  {
   "id": "c-414e2642",
   "q": "how does a vision-language model interpret images?",
   "a": "An image encoder converts a picture into patches and tokens, which the language model then reads alongside a prompt to generate a prose answer one token at a time.",
   "cites": [
    "what-a-vision-model-does"
   ],
   "published": false,
   "publish_state": "held",
   "quote": "",
   "quote_cite": ""
  },
  {
   "id": "c-fae9de6d",
   "q": "when is ocr preferred over a vision model?",
   "a": "OCR is preferred when searching scanned pages or when words must be findable later, as it returns resolved characters without composing sentences. Vision models are better for describing objects, styles, or moods.",
   "cites": [
    "which-to-use-when"
   ],
   "published": false,
   "publish_state": "held",
   "quote": "",
   "quote_cite": ""
  },
  {
   "id": "c-85abe045",
   "q": "what limitations does this demonstration have?",
   "a": "The article does not establish how often these failures occur, nor does it provide data on speed, other readers, or how these models would perform on real-world scans involving blur and lighting.",
   "cites": [
    "what-this-cannot-say"
   ],
   "published": false,
   "publish_state": "held",
   "quote": "",
   "quote_cite": ""
  }
 ],
 "related": [
  {
   "slug": "how-a-vision-model-sees",
   "why": "shares ground with § What a vision model is and does · § What an image becomes on the way in"
  },
  {
   "slug": "compression-is-the-objective",
   "why": "shares ground with § What this cannot say · § What to take with you"
  },
  {
   "slug": "the-dog-the-dice-and-the-painter",
   "why": "shares ground with § What a vision model is and does · § The photograph"
  }
 ],
 "thanks": "## Who ran this, and thanks {#who-ran-this-and-thanks}\n\nThanks to Datalab for Indra OCR, to the Tesseract project, to Google for the Gemma models and to the ollama project. The OCR engines ran on one laptop's CPU, each inside a sandbox with no network access; the vision model ran on our inference server, already loaded, its state read before and after the run and unchanged. A small human team asked the question and will approve this page; a fleet of AI agents made the pages, ran the readers, kept the records and drafted this page under that team's rulings.",
 "kit": null,
 "seat_class": {
  "writer": "gemma-class",
  "judge": null,
  "writer_runtime": "vllm"
 },
 "bench": {
  "bullets_written": 3,
  "bullets_kept": 0,
  "digests_written": 8,
  "digests_kept": 6,
  "chips_written": 8,
  "chips_kept": 5,
  "chips_grounded": 0,
  "chips_published": 0,
  "dropped_by": {
   "new_noun": 0,
   "figure": 2,
   "length": 0,
   "cite": 0,
   "judge": 0,
   "quote": 0,
   "directive": 0,
   "redaction": 0,
   "profanity": 0,
   "identifier": 0,
   "bare_figure": 0,
   "house_voice": 0,
   "editorial": 0,
   "hand-edit": 6
  },
  "new_noun_tokens_checked": [
   "0",
   "1.1.2",
   "2026-10-28",
   "26",
   "26b",
   "4",
   "5",
   "5.5.0",
   "CPU",
   "Gemma",
   "Indra",
   "OCR",
   "Tesseract",
   "UTC",
   "gemma4"
  ],
  "new_noun_tokens_withheld": 0,
  "figure_definition": "v3",
  "figure_boundary": "guarded",
  "drops": [
   {
    "kind": "bullet",
    "reason": "figure",
    "item": "the vision model was a Gemma 4 model with 26b",
    "detail": "terminal token not verbatim in the cited span"
   },
   {
    "kind": "bullet",
    "reason": "figure",
    "item": "the vision model used a prompt that ended with no lettering, no text",
    "detail": "terminal token carries no figure"
   },
   {
    "kind": "bullet",
    "reason": "hand-edit",
    "item": null,
    "item_chars": 44,
    "text_sha": "9a3a8a89240c",
    "figure": "2026-10-28",
    "withheld": "one bullet removed from this pack by hand",
    "removed_utc": "2026-10-28",
    "why": "says the images were \"run\" on 2026-10-28 and drops the page's (UTC): the readers ran on the images, and the section says \"Everything ran on 2026-10-28 (UTC).\"; a date alone tells a reader nothing the demo found",
    "detail": "Carried forward by --carry-hand-edits on 2026-10-28: the writer produced this line again and the pack on disk records it removed by hand on 2026-10-28 (matched on its terminal figure). The earlier record reads: removed from this pack by hand on 2026-10-28 (UTC), after the writer ran and after the gates had counted: says the images were \"run\" on 2026-10-28 and drops the page's (UTC): the readers ran on the images, and the section says \"Everything ran on 2026-10-28 (UTC).\"; a date alone tells a reader nothing the demo found. Not a gate drop, and recorded here so the ledger adds up."
   },
   {
    "kind": "digest",
    "reason": "hand-edit",
    "item": null,
    "item_chars": 236,
    "text_sha": "78ef7cc53425",
    "section": "the-demo",
    "withheld": "one section digest removed from this pack by hand",
    "removed_utc": "2026-10-28",
    "why": "calls the three plates \"oil plates\" (one is oil; the others are picture-book and cut-paper) and gives the vision model's two prompts as tasks of all three readers (\"reading and describing\"), where the OCR engines only read; it carries none of the section's findings",
    "detail": "Carried forward by --carry-hand-edits on 2026-10-28: the writer produced this line again and the pack on disk records it removed by hand on 2026-10-28 (matched on its section). The earlier record reads: removed from this pack by hand on 2026-10-28 (UTC), after the writer ran and after the gates had counted: calls the three plates \"oil plates\" (one is oil; the others are picture-book and cut-paper) and gives the vision model's two prompts as tasks of all three readers (\"reading and describing\"), where the OCR engines only read; it carries none of the section's findings. Not a gate drop, and recor…"
   },
   {
    "kind": "digest",
    "reason": "hand-edit",
    "item": null,
    "item_chars": 148,
    "text_sha": "1e83107a4d48",
    "section": "sources",
    "withheld": "one section digest removed from this pack by hand",
    "removed_utc": "2026-10-28",
    "why": "reads the list's \"Read 2026-10-28 (UTC)\", the day the sources were read, as the day the runs occurred, and lists ollama among the code-and-weights links, where its line is the program's repository only",
    "detail": "Carried forward by --carry-hand-edits on 2026-10-28: the writer produced this line again and the pack on disk records it removed by hand on 2026-10-28 (matched on its section). The earlier record reads: removed from this pack by hand on 2026-10-28 (UTC), after the writer ran and after the gates had counted: reads the list's \"Read 2026-10-28 (UTC)\", the day the sources were read, as the day the runs occurred, and lists ollama among the code-and-weights links, where its line is the program's repository only. Not a gate drop, and recorded here so the ledger adds up."
   },
   {
    "kind": "chip",
    "reason": "hand-edit",
    "item": null,
    "item_chars": 202,
    "text_sha": "be69ef3d175c",
    "chip_id": "c-fc7fe59b",
    "withheld": "one chip removed from this pack by hand",
    "removed_utc": "2026-10-28",
    "why": "asks where the raw data can be found and answers that the page points to its own records, leaving out that they are not published (no data kit ships, because the records name the workshop's machines); and it calls the demonstration a study",
    "detail": "Carried forward by --carry-hand-edits on 2026-10-28: the writer produced this line again and the pack on disk records it removed by hand on 2026-10-28 (matched on its question). The earlier record reads: removed from this pack by hand on 2026-10-28 (UTC), after the writer ran and after the gates had counted: asks where the raw data can be found and answers that the page points to its own records, leaving out that they are not published (no data kit ships, because the records name the workshop's machines); and it calls the demonstration a study. Not a gate drop, and recorded here so the ledger add…"
   },
   {
    "kind": "chip",
    "reason": "hand-edit",
    "item": null,
    "item_chars": 284,
    "text_sha": "9e6d9516d223",
    "chip_id": "c-d00ee946",
    "withheld": "one chip removed from this pack by hand",
    "removed_utc": "2026-10-28",
    "why": "lists OCR's failures as gaps, garbled characters and missing lines and leaves out the misread that looks right, which the page shows twice (Indra's \"2 February\" for \"3 February\" and \"committee desk 45.\" for \"committee desk 4B,\") and which its check corrected the draft to say",
    "detail": "removed from this pack by hand on 2026-10-28 (UTC), after the writer ran and after the gates had counted: lists OCR's failures as gaps, garbled characters and missing lines and leaves out the misread that looks right, which the page shows twice (Indra's \"2 February\" for \"3 February\" and \"committee desk 45.\" for \"committee desk 4B,\") and which its check corrected the draft to say. Not a gate drop, and recorded here so the ledger adds up."
   },
   {
    "kind": "chip",
    "reason": "hand-edit",
    "item": null,
    "item_chars": 203,
    "text_sha": "fee78231d8f4",
    "chip_id": "c-ab9f05fe",
    "withheld": "one chip removed from this pack by hand",
    "removed_utc": "2026-10-28",
    "why": "says the demo's three plates are \"oil-painted\"; one is oil and the others picture-book and cut-paper, the same leafy seadragon in three styles",
    "detail": "removed from this pack by hand on 2026-10-28 (UTC), after the writer ran and after the gates had counted: says the demo's three plates are \"oil-painted\"; one is oil and the others picture-book and cut-paper, the same leafy seadragon in three styles. Not a gate drop, and recorded here so the ledger adds up."
   }
  ]
 },
 "generated_utc": "2026-10-28T12:03:58Z"
}
