Why I chose my OCR engine by measuring
To read the screen of a production machine with no data output, I compared three OCR options on accuracy, latency, and cost. The winner wasn't the most "powerful" one — it was the one that fit the field best.
The problem: the data only lives on the screen
During my internship at Samsun Teknopark, the machines I worked with showed their production counters only on the operator screen. There was no PLC output, database, or report file; nobody knew how many minutes of downtime had occurred by the end of a shift.
The idea was simple: capture the screen, read the relevant fields with OCR, and turn the readings into events. The real decision was which OCR engine would run reliably in the field.
Three candidates
- Mistral OCR — cloud-based.
- PaddleOCR — open source, runs locally.
- RapidOCR — runs the same models as PaddleOCR on top of ONNX Runtime.
Why the cloud was ruled out
Cloud OCR was ruled out for three reasons: latency, cost, and data privacy. For a system doing several readings per second, sending every frame to the cloud is both slow and expensive — and a factory screen is data that shouldn't leave the premises.
PaddleOCR or RapidOCR?
Since both use the same model, I didn't expect a difference in accuracy. The difference showed up in installation: the field device is a Raspberry Pi 5, which means ARM. RapidOCR (ONNX) installed cleanly on ARM, and that decided it.
I also measured model size: the small model matched the medium model's accuracy and was 3.7× faster. A bigger model bought nothing here.
The right engine isn't enough: validation
No OCR reads every frame correctly. So I cross-checked the readings against each other: the quality rate shown on the screen is recomputed from the good/total unit counts and compared with the value that was read. Readings that don't match are rejected. Recording a wrong reading is worse than recording none at all.
Results
| Validated | Result |
|---|---|
| Reading 6 fields | 6/6 correct, 99%+ confidence score |
| Stoppage detection | actual 90 s → measured 88 s |
| Outage resilience | 38 pending readings restored from disk |
The lesson: there is no such thing as "the best model" — only the best model for this particular environment, and the only way to find it is to measure.