EasyOCR: Optimized for Mobile Deployment
Ready-to-use OCR with 80+ supported languages and all popular writing scripts
EasyOCR is a machine learning model that can recognize text in images. It supports 80+ supported languages and all popular writing scripts.
This model is an implementation of EasyOCR found
here
.
This repository provides scripts to run EasyOCR on Qualcomm® devices.
More details on model performance across various devices, can be found
here
.
Model Details
Model Type:
Image to text
Model Stats:
Model checkpoint: easyocr-small-stage1
Input resolution: 384x384
Number of parameters (EasyOCRDetector): 20.8M
Model size (EasyOCRDetector): 79.2 MB
Number of parameters (EasyOCRRecognizer): 3.84M
Model size (EasyOCRRecognizer): 14.7 MB
Model
Device
Chipset
Target Runtime
Inference Time (ms)
Peak Memory Range (MB)
Precision
Primary Compute Unit
Target Model
EasyOCRDetector
Samsung Galaxy S23
Snapdragon® 8 Gen 2
TFLITE
41.189 ms
0 - 136 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
Samsung Galaxy S23
Snapdragon® 8 Gen 2
QNN
39.017 ms
6 - 9 MB
FP16
NPU
EasyOCR.so
EasyOCRDetector
Samsung Galaxy S23
Snapdragon® 8 Gen 2
ONNX
40.015 ms
34 - 181 MB
FP16
NPU
EasyOCR.onnx
EasyOCRDetector
Samsung Galaxy S24
Snapdragon® 8 Gen 3
TFLITE
30.181 ms
14 - 45 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
Samsung Galaxy S24
Snapdragon® 8 Gen 3
QNN
29.323 ms
6 - 25 MB
FP16
NPU
EasyOCR.so
EasyOCRDetector
Samsung Galaxy S24
Snapdragon® 8 Gen 3
ONNX
29.584 ms
38 - 75 MB
FP16
NPU
EasyOCR.onnx
EasyOCRDetector
Snapdragon 8 Elite QRD
Snapdragon® 8 Elite
TFLITE
28.753 ms
15 - 45 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
Snapdragon 8 Elite QRD
Snapdragon® 8 Elite
QNN
24.26 ms
6 - 36 MB
FP16
NPU
Use Export Script
EasyOCRDetector
Snapdragon 8 Elite QRD
Snapdragon® 8 Elite
ONNX
28.097 ms
43 - 78 MB
FP16
NPU
EasyOCR.onnx
EasyOCRDetector
SA7255P ADP
SA7255P
TFLITE
2113.678 ms
3 - 28 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
SA7255P ADP
SA7255P
QNN
2111.684 ms
0 - 8 MB
FP16
NPU
Use Export Script
EasyOCRDetector
SA8255 (Proxy)
SA8255P Proxy
TFLITE
41.731 ms
0 - 97 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
SA8255 (Proxy)
SA8255P Proxy
QNN
38.998 ms
6 - 8 MB
FP16
NPU
Use Export Script
EasyOCRDetector
SA8295P ADP
SA8295P
TFLITE
78.45 ms
16 - 42 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
SA8295P ADP
SA8295P
QNN
76.549 ms
0 - 11 MB
FP16
NPU
Use Export Script
EasyOCRDetector
SA8650 (Proxy)
SA8650P Proxy
TFLITE
42.824 ms
0 - 145 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
SA8650 (Proxy)
SA8650P Proxy
QNN
40.764 ms
6 - 8 MB
FP16
NPU
Use Export Script
EasyOCRDetector
SA8775P ADP
SA8775P
TFLITE
88.536 ms
16 - 41 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
SA8775P ADP
SA8775P
QNN
86.522 ms
1 - 9 MB
FP16
NPU
Use Export Script
EasyOCRDetector
QCS8275 (Proxy)
QCS8275 Proxy
TFLITE
2113.678 ms
3 - 28 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
QCS8275 (Proxy)
QCS8275 Proxy
QNN
2111.684 ms
0 - 8 MB
FP16
NPU
Use Export Script
EasyOCRDetector
QCS8550 (Proxy)
QCS8550 Proxy
TFLITE
41.678 ms
0 - 126 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
QCS8550 (Proxy)
QCS8550 Proxy
QNN
39.278 ms
6 - 8 MB
FP16
NPU
Use Export Script
EasyOCRDetector
QCS9075 (Proxy)
QCS9075 Proxy
TFLITE
88.536 ms
16 - 41 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
QCS9075 (Proxy)
QCS9075 Proxy
QNN
86.522 ms
1 - 9 MB
FP16
NPU
Use Export Script
EasyOCRDetector
QCS8450 (Proxy)
QCS8450 Proxy
TFLITE
80.295 ms
16 - 48 MB
FP16
NPU
EasyOCR.tflite
EasyOCRDetector
QCS8450 (Proxy)
QCS8450 Proxy
QNN
69.9 ms
6 - 37 MB
FP16
NPU
Use Export Script
EasyOCRDetector
Snapdragon X Elite CRD
Snapdragon® X Elite
QNN
39.87 ms
6 - 6 MB
FP16
NPU
Use Export Script
EasyOCRDetector
Snapdragon X Elite CRD
Snapdragon® X Elite
ONNX
41.319 ms
66 - 66 MB
FP16
NPU
EasyOCR.onnx
EasyOCRRecognizer
Samsung Galaxy S23
Snapdragon® 8 Gen 2
TFLITE
109.812 ms
6 - 8 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
Samsung Galaxy S23
Snapdragon® 8 Gen 2
QNN
20.483 ms
0 - 3 MB
FP16
NPU
EasyOCR.so
EasyOCRRecognizer
Samsung Galaxy S23
Snapdragon® 8 Gen 2
ONNX
21.731 ms
0 - 24 MB
FP16
NPU
EasyOCR.onnx
EasyOCRRecognizer
Samsung Galaxy S24
Snapdragon® 8 Gen 3
TFLITE
108.852 ms
2 - 20 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
Samsung Galaxy S24
Snapdragon® 8 Gen 3
QNN
14.237 ms
0 - 16 MB
FP16
NPU
EasyOCR.so
EasyOCRRecognizer
Samsung Galaxy S24
Snapdragon® 8 Gen 3
ONNX
16.212 ms
1 - 24 MB
FP16
NPU
EasyOCR.onnx
EasyOCRRecognizer
Snapdragon 8 Elite QRD
Snapdragon® 8 Elite
TFLITE
107.149 ms
14 - 30 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
Snapdragon 8 Elite QRD
Snapdragon® 8 Elite
QNN
20.63 ms
0 - 346 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
Snapdragon 8 Elite QRD
Snapdragon® 8 Elite
ONNX
17.677 ms
0 - 18 MB
FP16
NPU
EasyOCR.onnx
EasyOCRRecognizer
SA7255P ADP
SA7255P
TFLITE
565.404 ms
9 - 17 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
SA7255P ADP
SA7255P
QNN
285.155 ms
0 - 8 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
SA8255 (Proxy)
SA8255P Proxy
TFLITE
124.344 ms
9 - 11 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
SA8255 (Proxy)
SA8255P Proxy
QNN
20.321 ms
0 - 3 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
SA8295P ADP
SA8295P
TFLITE
214.709 ms
8 - 18 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
SA8295P ADP
SA8295P
QNN
30.834 ms
0 - 12 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
SA8650 (Proxy)
SA8650P Proxy
TFLITE
101.784 ms
7 - 11 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
SA8650 (Proxy)
SA8650P Proxy
QNN
20.407 ms
0 - 3 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
SA8775P ADP
SA8775P
TFLITE
415.153 ms
6 - 14 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
SA8775P ADP
SA8775P
QNN
29.021 ms
0 - 7 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
QCS8275 (Proxy)
QCS8275 Proxy
TFLITE
565.404 ms
9 - 17 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
QCS8275 (Proxy)
QCS8275 Proxy
QNN
285.155 ms
0 - 8 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
QCS8550 (Proxy)
QCS8550 Proxy
TFLITE
108.193 ms
7 - 10 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
QCS8550 (Proxy)
QCS8550 Proxy
QNN
20.315 ms
0 - 3 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
QCS9075 (Proxy)
QCS9075 Proxy
TFLITE
415.153 ms
6 - 14 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
QCS9075 (Proxy)
QCS9075 Proxy
QNN
29.021 ms
0 - 7 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
QCS8450 (Proxy)
QCS8450 Proxy
TFLITE
210.333 ms
9 - 25 MB
FP32
CPU
EasyOCR.tflite
EasyOCRRecognizer
QCS8450 (Proxy)
QCS8450 Proxy
QNN
34.309 ms
0 - 151 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
Snapdragon X Elite CRD
Snapdragon® X Elite
QNN
21.364 ms
0 - 0 MB
FP16
NPU
Use Export Script
EasyOCRRecognizer
Snapdragon X Elite CRD
Snapdragon® X Elite
ONNX
19.37 ms
0 - 0 MB
FP16
NPU
EasyOCR.onnx
Installation
Install the package via pip:
pip install "qai-hub-models[easyocr]"
Configure Qualcomm® AI Hub to run this model on a cloud-hosted device
Sign-in to
Qualcomm® AI Hub
with your
Qualcomm® ID. Once signed in navigate to
Account -> Settings -> API Token
.
With this API token, you can configure your client to run models on the cloud
hosted devices.
qai-hub configure --api_token API_TOKEN
Navigate to
docs
for more information.
Demo off target
The package contains a simple end-to-end demo that downloads pre-trained
weights and runs this model on a sample input.
python -m qai_hub_models.models.easyocr.demo
The above demo runs a reference implementation of pre-processing, model
inference, and post processing.
NOTE
: If you want running in a Jupyter Notebook or Google Colab like
environment, please add the following to your cell (instead of the above).
%run -m qai_hub_models.models.easyocr.demo
Run model on a cloud-hosted device
In addition to the demo, you can also run the model on a cloud-hosted Qualcomm®
device. This script does the following:
Performance check on-device on a cloud-hosted device
Downloads compiled assets that can be deployed on-device for Android.
Accuracy check between PyTorch and on-device outputs.
python -m qai_hub_models.models.easyocr.export
Profiling Results
------------------------------------------------------------
EasyOCRDetector
Device : Samsung Galaxy S23 (13)
Runtime : TFLITE
Estimated inference time (ms) : 41.2
Estimated peak memory usage (MB): [0, 136]
Total # Ops : 42
Compute Unit(s) : NPU (42 ops)
------------------------------------------------------------
EasyOCRRecognizer
Device : Samsung Galaxy S23 (13)
Runtime : TFLITE
Estimated inference time (ms) : 109.8
Estimated peak memory usage (MB): [6, 8]
Total # Ops : 136
Compute Unit(s) : CPU (136 ops)
How does this work?
This
export script
leverages
Qualcomm® AI Hub
to optimize, validate, and deploy this model
on-device. Lets go through each step below in detail:
Step 1:
Compile model for on-device deployment
To compile a PyTorch model for on-device deployment, we first trace the model
in memory using the
jit.trace
and then call the
submit_compile_job
API.
import torch
import qai_hub as hub
from qai_hub_models.models.easyocr import Model
# Load the model
model = Model.from_pretrained()
detector_model = model.detector
recognizer_model = model.recognizer
# Device
device = hub.Device("Samsung Galaxy S23" )
# Trace model
detector_input_shape = detector_model.get_input_spec()
detector_sample_inputs = detector_model.sample_inputs()
traced_detector_model = torch.jit.trace(detector_model, [torch.tensor(data[0 ]) for _, data in detector_sample_inputs.items()])
# Compile model on a specific device
detector_compile_job = hub.submit_compile_job(
model=traced_detector_model ,
device=device,
input_specs=detector_model.get_input_spec(),
)
# Get target model to run on-device
detector_target_model = detector_compile_job.get_target_model()
# Trace model
recognizer_input_shape = recognizer_model.get_input_spec()
recognizer_sample_inputs = recognizer_model.sample_inputs()
traced_recognizer_model = torch.jit.trace(recognizer_model, [torch.tensor(data[0 ]) for _, data in recognizer_sample_inputs.items()])
# Compile model on a specific device
recognizer_compile_job = hub.submit_compile_job(
model=traced_recognizer_model ,
device=device,
input_specs=recognizer_model.get_input_spec(),
)
# Get target model to run on-device
recognizer_target_model = recognizer_compile_job.get_target_model()
Step 2:
Performance profiling on cloud-hosted device
After compiling models from step 1. Models can be profiled model on-device using the
target_model
. Note that this scripts runs the model on a device automatically
provisioned in the cloud. Once the job is submitted, you can navigate to a
provided job URL to view a variety of on-device performance metrics.
detector_profile_job = hub.submit_profile_job(
model=detector_target_model,
device=device,
)
recognizer_profile_job = hub.submit_profile_job(
model=recognizer_target_model,
device=device,
)
Step 3:
Verify on-device accuracy
To verify the accuracy of the model on-device, you can run on-device inference
on sample input data on the same cloud hosted device.
detector_input_data = detector_model.sample_inputs()
detector_inference_job = hub.submit_inference_job(
model=detector_target_model,
device=device,
inputs=detector_input_data,
)
detector_inference_job.download_output_data()
recognizer_input_data = recognizer_model.sample_inputs()
recognizer_inference_job = hub.submit_inference_job(
model=recognizer_target_model,
device=device,
inputs=recognizer_input_data,
)
recognizer_inference_job.download_output_data()
With the output of the model, you can compute like PSNR, relative errors or
spot check the output with expected output.
Note
: This on-device profiling and inference requires access to Qualcomm®
AI Hub.
Sign up for access
.
Deploying compiled model to Android
The models can be deployed using multiple runtimes:
TensorFlow Lite (
.tflite
export):
This
tutorial
provides a
guide to deploy the .tflite model in an Android application.
QNN (
.so
export ): This
sample
app
provides instructions on how to use the
.so
shared library in an Android application.
View on Qualcomm® AI Hub
Get more details on EasyOCR's performance across various devices
here
.
Explore all available models on
Qualcomm® AI Hub
License
The license for the original implementation of EasyOCR can be found
here
.
The license for the compiled assets for on-device deployment can be found
here
References
Community