概述
PaddleOCR 是由百度飞桨(PaddlePaddle)团队开发的一款开源的光学字符识别(Optical Character Recognition, OCR)工具库。它专门设计用于文本检测和识别任务,能够识别图像中的文本信息,并将其转换成可编辑的文本格式。PaddleOCR 具有以下特点:
多语言支持:PaddleOCR 不仅支持中文,还支持多种语言的文本识别。
多种识别模型:提供了多种文本识别模型,包括但不限于通用识别模型、超轻量级模型等,以适应不同的应用场景和性能需求。
端到端识别:PaddleOCR 提供了端到端的识别流程,包括文本检测、方向分类、文本识别等步骤。
易用性:PaddleOCR 提供了丰富的 API 和命令行工具,使得开发者可以快速集成和使用 OCR 功能。
高性能:基于深度学习技术,PaddleOCR 在保证高精度的同时,也具有较高的识别速度。
可扩展性:PaddleOCR 允许用户自定义训练数据和模型,以适应特定的应用需求。
社区支持:作为开源项目,PaddleOCR 拥有活跃的社区,用户可以在社区中获取帮助和进行交流。
PaddleOCR 适用于各种场景下的文本识别任务,如文档扫描、票据识别、街景文字提取等,是企业和开发者在进行 OCR 相关开发时的一个有力工具。
效果预览
机票的识别结果:
照片识别结果:
从结果上看识别的准确率还是很高的,
镜像获取
本篇文章介绍如果通过 docker 部署 cpu 版本,有以下三种方式获取
- 通过 dockerfile 自己打包镜像使用 https://gitee.com/noogel/docker-paddleocr
- 通过拉取 dockerhub 的镜像。由于目前很难找到代理,倾向于通过第一中方式自己打包镜像。
- 联系作者要单独镜像文件。
其中第一中方式使用的是 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 ,如果你也有类似的需要,欢迎交流使用经验。