本项目基于 PaddleOCR-Go 二次开发和完善,适配 Paddle 2.6.x 版本,是 PaddleOCR 的 Go 部署版本。具体实现对齐 PaddleOCR 的 C++ 部署版本。
本项目提供 Dockerfile 可用于最小化编译,避免在臃肿的 paddle:latest-dev
容器中手工编译。编译步骤如下:
- 确认编译容器内存限制 >= 16GiB。
- 在 OCR 模型列表 中选择合适的模型,下载后解压在根目录 model 文件夹中,目录结构为:
model
├── cls
│ ├── inference.model
│ └── inference.params
├── det
│ ├── inference.model
│ └── inference.params
└── rec
├── inference.model
├── inference.params
└── ppocr_keys_v1.txt
- 根据需要配置 config/conf.yaml。
- 通过命令
docker build .
编译 Docker 镜像。目前支持 linux/amd64 和 linux/arm64 架构。
- Go: 1.22.8
- GoCV: 0.39.0 (OpenCV: 4.10.0)
- Paddle: 2.6.2
- PaddleOCR: 2.7
- 编译环境: Docker paddle:latest-dev
docker pull registry.baidubce.com/paddlepaddle/paddle:latest-dev
docker run --name paddle-test -v $PWD:/paddle --network=host -it registry.baidubce.com/paddlepaddle/paddle:latest-dev /bin/bash
根据 官方文档 说明安装。
Go 语言通过 GoCV 使用 OpenCV,它使用 CGO 调用 OpenCV 接口。GoCV 编译可以参考 文档。
Go 语言只能通过 CGO 调用 C 语言 API,不能直接与 C++ 交互,因此需要编译 Paddle 的 C 语言预测库。当然,也可以自己写 C 语言调用 C++ 的代码和头文件,详见该 仓库。
Paddle 提供了 预编译包,也可以自己根据 官方文档 按需编译。注意部分编译参数需要相关依赖,请确保依赖完整再启用。下面是 CPU 版本的编译的命令。
git clone https://github.com/PaddlePaddle/Paddle.git
cd Paddle
git checkout v2.6.2
mkdir build && cd build
cmake -DWITH_PYTHON=OFF \
-DWITH_GPU=OFF \
-DWITH_MKL=ON \
-DWITH_TESTING=OFF \
-DCMAKE_BUILD_TYPE=Release \
-DON_INFER=ON ..
make -j
make inference_lib_dist
编译完成后,可以在 build/paddle_inference_c_install_dir
目录下,看到以下生成的文件。其中 paddle
是 Paddle 的 C 语言预测库,version.txt
中包含预测库版本信息。
build/paddle_inference_c_install_dir
├── paddle
├── third_party
└── version.txt
具体使用方法见 demo.go 中的示例代码。此外,根据 文档,需要将 Paddle 的 C 语言预测库软链到 Go 预测库目录下,通常在 ${GOMODCACHE}
,也即 $GOPATH/pkg/mod
(文档)。
# 此处 COMMITID 根据 C 语言预测库的版本不同而不同
go get github.com/paddlepaddle/paddle/paddle/fluid/inference/goapi@${COMMITID}
# 此处 VERSION 根据 go get 的版本不同而不同
cd ${GOMODCACHE}/github.com/paddlepaddle/paddle/paddle/fluid/inference/goapi@${VERSION}
# 此处 paddle_inference_c_install_dir 为下载或编译得到的 C 语言预测库目录
ln -s paddle_inference_c_install_dir paddle_inference_c
# 编译 demo
cd paddleocr-go
go build demo.go
示例代码提供了单张图预测、文件夹批量预测两种模式,它们的命令行优先级依次降低。配置文件各字段含义可参考 文档 或 C++ 实现中的 args.cpp。
./demo --config config/conf.yaml --image images/test.jpg
执行结果:
./demo --config config/conf.yaml --image_dir ./images
执行结果: