PaddleOCR是飞桨推出的一套丰富的OCR工具库开源项目,支持文字检测、文字方向检测、多语种文本识别、手写体文本识别等多种OCR相关前沿算法,并提供了丰富的轻量级预训练模型和模型优化技术,可以快速部署和使用OCR功能。
https://github.com/PaddlePaddle/PaddleOCR
目录
一、华为云ECS验证
1.购买华为云虚拟私有云VPC和弹性云服务器ECS
详细流程参考:创建华为云弹性云服务器ECS流程-CSDN博客
已有可跳过此步骤。
ECS配置概要:
基础配置
计费模式: 按需计费
区域/可用区: 华北-北京四 | 随机分配
实例
规格: 鲲鹏通用计算增强型 | kc1.large.4 | 2vCPUs | 8GiB
操作系统
镜像: Huawei Cloud EulerOS 2.0 64bit for kAi2p with HDK 23.0.1 and CANN 7.0.0.1 RC
存储与备份
系统盘: 通用型SSD, 40GiB
网络
虚拟私有云: 选择已有VPC
源/目的检查: 开启
安全组
default
公网访问
弹性公网IP: 全动态BGP | 按流量计费 | 1 Mbit/s
云服务器管理
云服务器名称: 自定义
登录凭证: 密码
其他设为默认。
2.环境搭建
conda创建python3.9环境。
conda create --name PaddleOCR python=3.9
从 GitHub 拉取代码。
git clone https://github.com/PaddlePaddle/PaddleOCR.git
安装依赖。
pip install -r requirements.txt
pip install paddlepaddle
pip install python-docx
pip install beautifulsoup4
-
如果文件安装时出现报错:
Preparing metadata (setup.py) ... error error: subprocess-exited-with-error × python setup.py egg_info did not run successfully. │ exit code: 1 ╰─> [8 lines of output] sh: line 1: patch: command not found Traceback (most recent call last): File "<string>", line 2, in <module> File "<pip-setuptools-caller>", line 34, in <module> File "/tmp/pip-install-x9irux10/lmdb_89afb9acd31a40f3951bf6e467c6f001/setup.py", line 119, in <module> raise Exception('Applying patch failed') Exception: Applying patch failed py-lmdb: Using bundled liblmdb with py-lmdb patches; override with LMDB_FORCE_SYSTEM=1 or LMDB_PURE=1. [end of output] note: This error originates from a subprocess, and is likely not a problem with pip. error: metadata-generation-failed × Encountered error while generating package metadata. ╰─> See above for output. note: This is an issue with the package mentioned above, not pip. hint: See above for details.
需要安装
patch:
sudo yum install patch
3.准备测试图片
PaddleOCR提供了一系列测试图片,也可以自己寻找一些带有文字的图片,放在images文件夹下。
如果下载PaddleOCR提供的图片:
wget https://paddleocr.bj.bcebos.com/dygraph_v2.1/ppocr_img.zip
unzip ppocr_img.zip
4.构建本地示例应用
4.1 使用PaddleOCR进行文本检测识别
将示例图片保存到images文件夹里:
新建run_ocr.py文件内容为:
import cv2
from PIL import Image
from paddleocr import PaddleOCR, draw_ocr
import os
# 初始化 PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
# 图像文件路径
img_path = './images/general_ocr_rec_001.png'
# 检查文件是否存在
if not os.path.exists(img_path):
print(f"Error: Image file {img_path} does not exist.")
else:
try:
# 读取图像
img = cv2.imread(img_path)
if img is None:
print(f"Error: Failed to load image {img_path}.")
else:
# 进行 OCR 处理
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)
# 显示结果
result = result[0]
image = Image.open(img_path).convert('RGB')
boxes = [line[0] for line in result]
txts = [line[1][0] for line in result]
scores = [line[1][1] for line in result]
im_show = draw_ocr(image, boxes, txts, scores, font_path='./doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
except Exception as e:
print(f"Error: {e}")
- 如果出现报错:
(PaddleOCR) [root@ecs-flair-master PaddleOCR]# python main.py
Traceback (most recent call last):
File "/projects/PaddleOCR/main.py", line 1, in <module>
from paddleocr import PaddleOCR, draw_ocr
File "/projects/PaddleOCR/paddleocr.py", line 25, in <module>
import cv2
ImportError: libGL.so.1: cannot open shared object file: No such file or directory
安装OpenGL 库
sudo yum install mesa-libGL
第一次运行代码自动下载PP-OCRv4模型,运行结果为:
右键下载result.jpg并查看。
4.2 查看弹性公网IP和设置开放端口
详细流程参考:查看华为云ECS弹性公网IP和设置开放端口-CSDN博客
查看后得到用于登录Web应用界面的IP地址。这里为http://113.44.138.39:7861/。
4.3 使用gradio构建Web应用界面
安装gradio库。
pip install gradio
新建gradio_show.py文件内容为:
import gradio as gr
import numpy as np
import cv2
from paddleocr import PaddleOCR, draw_ocr
from PIL import Image
# 初始化 PaddleOCR
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
def ocr_inference(image):
try:
# 将 PIL 图像转换为 OpenCV 图像
img = cv2.cvtColor(np.array(image), cv2.COLOR_RGB2BGR)
# 进行 OCR 处理
result = ocr.ocr(img, cls=True)
result = result[0]
print(result)
# 初始化空列表
boxes = []
txts = []
scores = []
# 提取结果
for line in result:
print(line)
boxes.append(line[0])
txts.append(line[1][0])
scores.append(line[1][1])
# 检查字体文件路径
font_path = './doc/fonts/simfang.ttf'
# 调用 draw_ocr 函数
try:
im_show = draw_ocr(image, boxes, txts, scores, font_path=font_path)
# 确保返回值为 PIL 图像
if isinstance(im_show, tuple):
im_show = im_show[0] # 如果返回的是元组,取第一个元素
if isinstance(im_show, np.ndarray):
im_show = Image.fromarray(im_show)
return im_show
except Exception as e:
return f"draw_ocr 错误: {str(e)}"
except cv2.error as e:
return f"OpenCV Error: {str(e)}"
except Exception as e:
return f"Error: {str(e)}"
# 创建 Gradio 接口
iface = gr.Interface(
fn=ocr_inference,
inputs=gr.Image(type="pil"),
outputs=gr.Image(type="pil"),
title="PaddleOCR 文字识别",
description="上传一张图像,进行文字识别并显示结果。"
)
# 启动服务
iface.launch(server_name="0.0.0.0", server_port=7861)
nohup 运行gradio_show.py,并在浏览器转到http://113.44.138.39:7861/打开服务页面,可以上传图片进行文本检测识别:
二、部署到昇腾NPU
昇腾环境:
芯片类型:昇腾910B3
CANN版本:CANN 7.0.1.5
驱动版本:23.0.6
操作系统:Huawei Cloud EulerOS 2.0
1.查看NPU硬件信息
npu-smi info
如果 Health 状态为 OK,说明 NPU 和 CANN 正常运行。
2.NPU环境下运行代码
2.1 下载PaddlePaddle的NPU插件
PaddlePaddle框架适配昇腾NPU目前只支持CANN 8.0.RC1,需要升级CANN驱动版本,所以采用docker镜像。
拉取飞桨官方发布的昇腾 NPU 开发镜像,
docker pull registry.baidubce.com/device/paddle-npu:cann80RC1-ubuntu20-aarch64-gcc84-py39
启动容器,指定可见的 NPU 卡号
docker run -it --name paddle-npu-dev -v $(pwd):/work \
--privileged --network=host --shm-size=128G -w=/work \
-v /usr/local/Ascend/driver:/usr/local/Ascend/driver \
-v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi \
-v /usr/local/dcmi:/usr/local/dcmi \
-e ASCEND_RT_VISIBLE_DEVICES="0,1,2,3,4,5,6,7" \
registry.baidubce.com/device/paddle-npu:cann80RC1-ubuntu20-$(uname -m)-gcc84-py39 /bin/bash
安装paddle NPU 插件包
pip install paddlepaddle -i https://www.paddlepaddle.org.cn/packages/nightly/cpu
pip install paddle-custom-npu -i https://www.paddlepaddle.org.cn/packages/nightly/npu
检查当前安装版本
python -c "import paddle_custom_device; paddle_custom_device.npu.version()"
2.2 参照华为云上流程进行环境搭建
步骤参照ECS环境搭建。
在run_ocr.py代码中打印当前使用设备:
import paddle
print(f"Current device: {paddle.device.get_device()}")
运行run_ocr.py。
注意事项:
- 虽然ppocr DEBUG:显示模型参数use_npu=False,但实际初始化时已经自动检测并调用了npu设备,不要在调用模型时设置use_npu=True,经测试这样反而推理速度会很慢!
可能出现的报错:
- 如果下载模型时出现报错:
(PaddleOCR) [root@devserver-314b-1 PaddleOCR]# python main.py download https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar to /root/.paddleocr/whl/det/ch/ch_PP-OCRv4_det_infer/ch_PP-OCRv4_det_infer.tar 100%|█████████████████████████████████████████████████████| 4780/4780 [00:01<00:00, 4356.37it/s] download https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar to /root/.paddleocr/whl/rec/ch/ch_PP-OCRv4_rec_infer/ch_PP-OCRv4_rec_infer.tar 100%|██████████████████████████████████████████████████| 10720/10720 [00:00<00:00, 27620.58it/s] munmap_chunk(): invalid pointer -------------------------------------- C++ Traceback (most recent call last): -------------------------------------- 0 inflateReset2 ---------------------- Error Message Summary: ---------------------- FatalError: `Process abort signal` is detected by the operating system. [TimeInfo: *** Aborted at 1730787992 (unix time) try "date -d @1730787992" if you are using GNU date ***] [SignalInfo: *** SIGABRT (@0x1a8b7b) received by PID 1739643 (TID 0xffff83881020) from PID 1739643 ***] Aborted (core dumped)
改为采用手动下载。
mkdir -p ~/.paddleocr/whl/cls
wget https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar -O ~/.paddleocr/whl/cls/ch_ppocr_mobile_v2.0_cls_infer.tar
tar -xvf ~/.paddleocr/whl/cls/ch_ppocr_mobile_v2.0_cls_infer.tar
查看源码发现加载模型时设置use_onnx = False就不会下载模型文件,修改代码为加载本地模型即可:
det_model_dir = '~/.paddleocr/whl/det/ch_PP-OCRv4_det_infer'
rec_model_dir = '~/.paddleocr/whl/rec/ch_PP-OCRv4_rec_infer'
cls_model_dir = '~/.paddleocr/whl/cls/ch_ppocr_mobile_v2.0_cls_infer'
ocr = PaddleOCR(det_model_dir=det_model_dir, rec_model_dir=rec_model_dir, cls_model_dir=cls_model_dir, use_angle_cls = True, lang = "ch", use_onnx = False)
- 如果测试图片格式为PNG时报错:
libpng warning: iCCP: bad parameters to zlib
libpng error: bad parameters to zlib
double free or corruption (!prev)
需要移除iCCP配置文件:
if 'icc_profile' in image.info:
image.info.pop('icc_profile', None)
标签:PaddleOCR,华为,result,NPU,line,ocr,cls
From: https://blog.csdn.net/qq_54958500/article/details/143500816