Golang implementation of PaddleOCR based on onnxruntime.
For Linux / macOS:
./download_onnx.sh
./download_models.sh
go run .For Windows:
download_onnx.bat
download_models.bat
go run .This project uses onnxruntime_go, which depends on the ONNX Runtime C API. You must build with CGO enabled, ensure a C toolchain is installed:
- Windows: Install MinGW-w64 or TDM-GCC, and have
gcc(orcc) on your PATH. - Linux:
sudo apt install build-essential(Debian/Ubuntu) or equivalent. - macOS: Xcode Command Line Tools:
xcode-select --install.
The engine loads the ONNX Runtime shared library at runtime. The repo includes scripts that download and extract a prebuilt build into ./onnxruntime/ (layout expected by the engine).
Using the download scripts:
- Linux / macOS: From the project root, run
./download_onnx.sh. - Windows: From the project root, run
download_onnx.bat.
Manual setup:
Download a prebuilt package from ONNX Runtime releases, extract it ./onnxruntime relative to the working directory. To use a different path, set environment variable ORT_LIB_PATH to the full path of the library file.
The default PaddleOCR workflow expects the following files under ./models/ (relative to the process working directory):
| File | Description | Download Link |
|---|---|---|
ch_PP-OCRv5_server_det.onnx |
Detection model | https://www.modelscope.cn/models/RapidAI/RapidOCR/tree/master/onnx/PP-OCRv5/det |
ch_ppocr_mobile_v2.0_cls_infer.onnx |
Direction classifier | https://www.modelscope.cn/models/RapidAI/RapidOCR/tree/master/onnx/PP-OCRv4/cls |
ch_PP-OCRv5_rec_server_infer.onnx |
Recognition model | https://www.modelscope.cn/models/RapidAI/RapidOCR/tree/master/onnx/PP-OCRv5/rec |
Using the download scripts:
For simplicity, the models can be quickly downloaded with the scripts.
- Linux / macOS: From the project root, run
./download_models.sh. - Windows: From the project root, run
download_models.bat.
Import the OCR package and create an engine with optional configuration:
package main
import (
"fmt"
"io"
"net/http"
"github.com/multippt/gopaddleocr/pkg/ocr"
)
func downloadImage(url string) ([]byte, error) {
resp, err := http.Get(url)
if err != nil {
return nil, err
}
defer resp.Body.Close()
return io.ReadAll(resp.Body)
}
func main() {
data, err := downloadImage(
"https://paddle-model-ecology.bj.bcebos.com/paddlex/imgs/demo_image/general_ocr_002.png")
if err != nil {
fmt.Printf("%v\n", err)
return
}
engine := ocr.NewEngine()
if err := engine.Init(); err != nil {
fmt.Printf("%v\n", err)
return
}
defer engine.Close()
results, err := engine.RunOCR(data)
if err != nil {
fmt.Printf("%v\n", err)
return
}
// results: []ocr.Result with Box, Text, Score (and optional Children)
fmt.Printf("%v\n", results)
}A basic server has been provided which exposes a basic OCR endpoint at /ocr.
go run . -listen 0.0.0.0:8051curl -X POST http://localhost:8051/ocr -F "image=@./image.png"{
"results": [
{
"box": [[10, 20], [100, 20], [100, 40], [10, 40]],
"text": "Hello world",
"score": 0.98,
"text_color": [0, 0, 0],
"word_colors": []
}
],
"full_text": "Hello world\n",
"elapsed_ms": 45.2
}The Paddle-OCR models originate from the Baidu's PaddlePaddle PaddleOCR project.
This project is released under the Apache 2.0 license.