最近在项目过程中需要用到文字识别的能力,之前没有接触过。需要对现有的开源能力进行调研和学习。
1. 基本概念
1.1 PaddlePaddle
PaddlePaddle 是一个由百度开源,基于 Python 的深度学习框架。PaddlePaddle 针对不同的硬件环境提供了不同的安装包或安装方式:可以使用 CPU 也可以 GPU,GPU 支持的硬件包含 CUDA 和 ROCm 4.0。但 ROCm 目前只能在 Linux 系统中使用。具体可以参考 paddlepaddle官方文档。
1.2 PaddleHub
PaddleHub是基于PaddlePaddle 开发的预训练模型管理工具,可以借助预训练模型更便捷地开展迁移学习工作,旨在让 PaddlePaddle 生态下的开发者更便捷体验到大规模预训练模型的价值。下面是 PaddlePadd 在 github 上的介绍摘录。
【模型种类丰富】: 涵盖大模型、CV、NLP、Audio、Video、工业应用主流六大品类的 400+ 预训练模型,全部开源下载,离线可运行
【超低使用门槛】:无需深度学习背景、无需数据与训练过程,可快速使用AI模型
【一键模型快速预测】:通过一行命令行或者极简的Python API实现模型调用,可快速体验模型效果
【一键模型转服务化】:一行命令,搭建深度学习模型API服务化部署能力
【跨平台兼容性】:可运行于Linux、Windows、MacOS等多种操作系统
1.3 PaddleOCR
PaddleOCR,也叫pp-ocr,是 PaddlePaddle 框架下的 OCR 库,支持多种语言的文本识别。
2. 安装步骤
2.1 安装 PaddlePaddle
# 默认安装CPU版本,安装paddle时建议使用百度源
pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
2.2 安装 PaddleHub
# 在命令行中输入以下命令
pip install paddlehub -i https://mirror.baidu.com/pypi/simple
2.3 安装 PP-OCR(PaddleOCR)
hub install ch_pp-ocrv3
3. 使用 PaddleOCR
3.1 命令行方式进行识别
hub run ch_pp-ocrv3 --input_path "/PATH/TO/IMAGE"
3.2 用 Python 代码进行识别
import paddlehub as hub
import cv2ocr = hub.Module(name="ch_pp-ocrv3", enable_mkldnn=True) # mkldnn加速仅在CPU下有效
result = ocr.recognize_text(images=[cv2.imread('/PATH/TO/IMAGE')])
3.2.1 CV2 安装
实际上,”cv2”中的 ”2” 并不表示 OpenCV 的版本号。我们知道,OpenCV 是基于 C/C++的,”cv”和”cv2”表示底层使用的是
C
语言 API 还是C++
API,”cv2”表示使用的是C++
API。这主要是一个历史遗留问题,是为了保持向后兼容性。另外:“cv2” 的安装模块名为opencv-python
这里的 cv2
需要另外安装
pip install opencv-python
如果安装时出现如下报错
ERROR: Could not find a version that satisfies the requirement cv2 (from versions: none)
ERROR: No matching distribution found for cv2
检查 pip 是否最新,如果不是最新的则对 pip 进行升级,并指定下载源安装。
python -m pip install --upgrade pip # 如果是python3
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple opencv-python
3.2.2 API
API 的出入参数在官方文档中有写到,这里就不再展开。
3.3 PaddleHub Serving
PaddleHub 可以将 OCR 部署一个在线服务,命令如下。
hub serving start -m ch_pp-ocrv3
在执行完命令之后会有提示,告知服务的地址和端口号,默认端口号是8866。在服务启动之后就可以通过 http 方式使用 OCR 了。这种在线服务的方式让其他编程语言可以方便的使用 PaddleOCR。
3.3.1 在线服务验证代码
import requests
import json
import cv2
import base64def cv2_to_base64(image):data = cv2.imencode('.jpg', image)[1]return base64.b64encode(data.tostring()).decode('utf8')# 发送HTTP请求
data = {'images':[cv2_to_base64(cv2.imread("/PATH/TO/IMAGE"))]}
headers = {"Content-type": "application/json"}
url = "http://127.0.0.1:8866/predict/ch_pp-ocrv3"
r = requests.post(url=url, headers=headers, data=json.dumps(data))# 打印预测结果
print(r.json()["results"])
3.3.2 在线服务性能
由于是在本机做测试,所以用 python 直接调用 PaddleOCR 还是通过 http 调用 PaddleHub Serving,性能上没有明显的差异。
3.3.3 Gradio App
官方文档中提到 “从 PaddleHub 2.3.1 开始支持在浏览器中访问 ch_pp-ocrv3 的 Gradio App”,但我在访问 URL 的时候服务端报错。粗略查了一下可能是由于我的环境是 Windows,这个问题不影响整体,所以暂时不深究。
4. 测试结果
4.1 识别率
PaddleOCR 的识别率还是比较高的,对于非手写的字体基本识别率达到 95% 以上,由于没有特别测试比较复杂的字,所以这个数字是我的主观判断。对于比较刁钻的测试,PaddleOCR 的识别率就比较低了,如故意把 I
和 l
混在一起(如 IlIlIlIl)基本无法识别(当然这只是为了测试而创造的,正常情况下不会出现,因为人也无法识别)。
4.2 性能
对于普通的图片,识别性能基本在秒级别,识别消息根据图片中的内容存在较大差异,越复杂越慢。对同一张图片多次识别时只需要花费原本 20% 的时间,猜测是有类似缓存的机制。
4.3 使用难度
整体安装上没有太大难度,跟着官方文档一步步安装就可以了。唯一的难度是需要用 python 来调用,但是官方也提供了 hub serving,其他语言可以通过 http 进行调用。
参考资料
PaddleOCR的使用
开始使用
零基础windows安装并实现图像风格迁移
python安装cv2库 python3.8安装cv2
Python3 安装cv2 / OpenCV安装