OCR models for technical documents and labels: handwriting mixed with printed text
A stamped part number on curved metal under shop light and a handwritten torque value scribbled in a margin are not the same recognition problem, and no pipeline that treats them alike survives contact with a real equipment room.
Manuals, schematics, nameplates, drawings, maintenance sheets: surface, contrast, and font size vary before you ask who wrote on them, and what you're extracting is part numbers, warnings, measurements, and how a label relates to its value.
Point a vision-language model at the mess and it will happily untangle an ambiguous layout, and just as happily replace an uncertain sequence with language that sounds more natural than the document does.
That second habit is the one worth designing around.
region OCR first, generation second
The constraint that matters: decide whether a region is print, handwriting, a mark, or blank before interpreting what it means.
Start deterministic: high-resolution region OCR plus dictionaries that check whether a value is well-formed without correcting its identity.
A generative or multimodal pass earns its place only where it beats that baseline: hard handwriting, irregular layouts, associating a value with a distant label, or exceptions the deterministic stage can't resolve.
It should never replace the cheap stage that already handles the easy majority; that stage stays auditable, a model's guess does not.
Segment every region by type, tag what produced it, a stamp, a printer, a pen, and route low-confidence handwriting to a person.
what the log has to survive being asked about
Every stage needs a trail, because someone will eventually ask why a number changed:
source file hash, page, capture device
original dimensions, color, orientation
OCR/layout/VLM model and runtime revision
raw text, regions, reading order, confidence
normalized field, validation, reviewer change
The rule under that log is easy to break: normalization must never overwrite transcription.
If O or 0, or a decimal versus a stray mark, is ambiguous, store what the recognizer saw and what the rule proposed, separately.
I wouldn't lean on character or word error rate as the headline metric; both treat a dropped comma and a swapped account-number digit as the same mistake.
Exact-match accuracy on identifiers, dates, amounts, and units, plus a table-geometry score, beats a blended error rate hiding the wrong digit.
a wrong answer that looks exactly right
The failure I actually worry about isn't garbled output: it's a part number or safety label normalized into something familiar and wrong.
A strong printed-text score can paper over poor handwriting recognition, or assign a note to the nearest label because proximity looks like association.
Neither throws an error.
Language models continue plausible patterns, so a damaged surname or illegible total gets completed into whatever looks like real text, which is what a reviewer stops questioning.
Let the system say it doesn't know, and route there instead of guessing, when you hit:
- low-resolution or clipped regions
- glare across a printed or engraved surface
- handwriting nobody on the team can confidently read
- totals that contradict each other
Confidence scores are model-specific and often poorly calibrated, so pair them with image-quality checks and disagreement between independent passes.
Attach a page number and bounding polygon to every field that matters, then show the crop beside the value; that turns review into verification, not retyping.
Without coordinates, a reviewer hunts a whole page to check one digit.
reasoning is fine, acting is not
A vision-language model earns its keep connecting a distant label to its value, rebuilding a table split across a fold, or explaining why two totals disagree.
Ask it to keep raw observation separate from interpretation, and never let its output write to a database without outside validation.
Text printed inside a document is untrusted input, full stop, not permission to change your extraction instructions.
Multi-page work needs the same discipline: preserve page order, treat a repeated header as one header, and don't let the model merge invoices from an arbitrary page bundle.
Split documents deterministically, attach identifiers up front, and state whether a table may cross a page boundary, or one machine's record ends up glued to another's specs.
what changes when the model does
Score handwriting on its own, separate from print, and keep a clean unreadable state instead of forcing every field to hold a value.
Version the model, preprocessing, and validation rules together, because swapping one silently invalidates the others.
When any of them changes, replay a stratified set: clean pages, everyday noise, difficult layouts, critical fields, and a few cases that should be unreadable.
Local deployment keeps documents under your control and gets cheaper at steady volume, but you pay in storage, backups, model memory, and maintenance no spec sheet lists.
Hosted document APIs and frontier vision models buy elasticity and a higher exception ceiling, at the cost of upload time, retention, residency, and a bill indifferent to your quarter.
Hybrid routing earns its complexity when privacy rules are strict and escalation from local to hosted is visible, not buried in a log nobody reads.
None of that tells you whether your pipeline is any good today. So pull whatever failed silently last month, not what threw an error, and check whether the log explains the wrong value or only records that one exists.