Docker 部署 PaddleOCR 图文识别技术应用

概述

PaddleOCR 是由百度飞桨(PaddlePaddle)团队开发的一款开源的光学字符识别(Optical Character Recognition, OCR)工具库。它专门设计用于文本检测和识别任务,能够识别图像中的文本信息,并将其转换成可编辑的文本格式。PaddleOCR 具有以下特点:

  1. 多语言支持:PaddleOCR 不仅支持中文,还支持多种语言的文本识别。

  2. 多种识别模型:提供了多种文本识别模型,包括但不限于通用识别模型、超轻量级模型等,以适应不同的应用场景和性能需求。

  3. 端到端识别:PaddleOCR 提供了端到端的识别流程,包括文本检测、方向分类、文本识别等步骤。

  4. 易用性:PaddleOCR 提供了丰富的 API 和命令行工具,使得开发者可以快速集成和使用 OCR 功能。

  5. 高性能:基于深度学习技术,PaddleOCR 在保证高精度的同时,也具有较高的识别速度。

  6. 可扩展性:PaddleOCR 允许用户自定义训练数据和模型,以适应特定的应用需求。

  7. 社区支持:作为开源项目,PaddleOCR 拥有活跃的社区,用户可以在社区中获取帮助和进行交流。

PaddleOCR 适用于各种场景下的文本识别任务,如文档扫描、票据识别、街景文字提取等,是企业和开发者在进行 OCR 相关开发时的一个有力工具。

效果预览

机票的识别结果:

照片识别结果:

从结果上看识别的准确率还是很高的,

镜像获取

本篇文章介绍如果通过 docker 部署 cpu 版本,有以下三种方式获取

  1. 通过 dockerfile 自己打包镜像使用 https://gitee.com/noogel/docker-paddleocr
  2. 通过拉取 dockerhub 的镜像。由于目前很难找到代理,倾向于通过第一中方式自己打包镜像。
  3. 联系作者要单独镜像文件。

其中第一中方式使用的是 cpu 版本服务端识别模型,需要部署的 cpu 有比较好的性能,特点是多语言识别,且识别结果很准确。

1
2
3
4
5
ENV PPOCR=v2.7.5
ENV DET=ch_PP-OCRv4_det_server_infer.tar
ENV CLS=ch_ppocr_mobile_v2.0_cls_slim_infer.tar
ENV REC=ch_PP-OCRv4_rec_server_infer.tar
ENV PROTOCOL_BUFFERS_PYTHON_IMPLEMENTATION=python

如果你想切换使用不同的模型可以在 github 文档中自行选择:https://github.com/PaddlePaddle/PaddleOCR/blob/main/deploy/slim/auto_compression/README.md

测试代码

然而 docker 提供的只是 API 接口形式访问,需要先将图片读取转化为 base64 编码,再通过 POST 请求后获取解析结果。下面是测试代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import os
import time
import requests
import json
import base64


def cv2_to_base64(image):
return base64.b64encode(image).decode("utf8")

def main(args):
headers = {"Content-type": "application/json"}
cnt = 0
total_time = 0
for directory, _, file_list in os.walk(args.image_dir):
for file_name in file_list:
file_path = os.path.join(directory, file_name)
img = open(file_path, "rb").read()
if img is None:
print("error in loading image:{}".format(file_path))
continue
# seed http request
starttime = time.time()
data = {"images": [cv2_to_base64(img)]}
r = requests.post(url=args.server_url, headers=headers, data=json.dumps(data))
elapse = time.time() - starttime
total_time += elapse
print("Predict time of %s: %.3fs" % (file_path, elapse))
res = r.json()["results"][0]
print("Result:" + " ".join([val['text'] for val in res]))
cnt += 1
if cnt % 100 == 0:
print("{} processed".format(cnt))
print("avg time cost: {}".format(float(total_time) / cnt))


def parse_args():
import argparse

parser = argparse.ArgumentParser(description="args for hub serving")
parser.add_argument("--server_url", type=str, required=True)
parser.add_argument("--image_dir", type=str, required=True)
parser.add_argument("--output", type=str, default="./hubserving_result")
args = parser.parse_args()
return args


if __name__ == "__main__":
args = parse_args()
main(args)

最后

关注到 PaddleOCR 是因为日常想找照片的时候,因为照片太多根本搜索不到,而照片存储在 NAS 上,又没有提供很好的图文检索功能,于是在自研的一个项目中想着集成图文检索功能。我是码力欧 https://noge.top ,如果你也有类似的需要,欢迎交流使用经验。