首页 > 其他分享 >PaddleOCR在华为云上实现文本检测识别任务,并部署到华为昇腾NPU的详细步骤

PaddleOCR在华为云上实现文本检测识别任务,并部署到华为昇腾NPU的详细步骤

时间:2024-11-13 19:15:04浏览次数:3  
标签:PaddleOCR 华为 result NPU line ocr cls

        PaddleOCR是飞桨推出的一套丰富的OCR工具库开源项目,支持文字检测、文字方向检测、多语种文本识别、手写体文本识别等多种OCR相关前沿算法,并提供了丰富的轻量级预训练模型和模型优化技术,可以快速部署和使用OCR功能。

https://github.com/PaddlePaddle/PaddleOCR

目录

一、华为云ECS验证

1.购买华为云虚拟私有云VPC和弹性云服务器ECS

2.环境搭建

3.准备测试图片

4.构建本地示例应用

4.1 使用PaddleOCR进行文本检测识别

4.2 查看弹性公网IP和设置开放端口

4.3 使用gradio构建Web应用界面

二、部署到昇腾NPU

1.查看NPU硬件信息

2.NPU环境下运行代码

2.1 下载PaddlePaddle的NPU插件

2.2 参照华为云上流程进行环境搭建


一、华为云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

相关文章

  • 华为云前台展示镜像供用户选择是怎么做到的呢?
    前台展示的各种公共镜像是管理员在后台传上去的;如何做到?在ServiceOM界面管理员可操做,制作镜像有两种方式:1.qcow2格式镜像制作2.iso格式镜像制作上传ISO文件,安装OS,安装cloud-init等,转换为镜像2.1.注册镜像-管理镜像磁盘设备类型:linux系统选virtio,windows系统选scsi......
  • 基于STM32设计的大棚育苗管理系统(4G+华为云IOT)_265
    文章目录一、前言1.1项目介绍【1】项目开发背景【2】设计实现的功能【3】项目硬件模块组成【4】设计意义【5】国内外研究现状【6】摘要1.2设计思路1.3系统功能总结1.4开发工具的选择【1】设备端开发【2】上位机开发1.5参考文献1.6系统框......
  • 华为路由器/交换机配置Console口AAA认证以及Telnet登录
    一、Console口登录 Console口是路由器/交换机的本地管理接口,通常用于设备初始配置和管理。本文将介绍console登录的两种配置方式1、密码模式配置成这种模式后Console登录只需要输入密码。配置方法一[Huawei]user-interfaceconsole0 [Huawei-ui-console0]authentica......
  • AI人工智能——华为开发者生态
    一、开发者生态开发者乘坐可持续的开发者生态,跟随国家数字化浪潮,持续打造智能算力;例如:数据中心,超过6000多平米,为全国人工智能提供算力平台;担忧:应用:华为在基础科学做研究,致力于全生态;3D产业;数字化内容云原生化,CI/CD可持续交付;企业和组织......
  • 华为OD机试真题-寻找最大价值的矿堆-2024年OD统一考试(E卷)
    最新华为OD机试考点合集:华为OD机试2024年真题题库(E卷+D卷+C卷)_华为od机试题库-CSDN博客     每一题都含有详细的解题思路和代码注释,精编c++、JAVA、Python三种语言解法。帮助每一位考生轻松、高效刷题。订阅后永久可看,发现新题及时跟新。题目描述给你一个由''(空地)......
  • 鸿蒙开发之用户输入(TextInput)
    前言:日常开发中如果需要接收用户输入,就可以使用输入组件来完成TextInput:单行输入框:常用参数:参数名类型是否必填说明placeholderResourceStr否设置无输入时的提示文本。textResourceStr否设置输入框当前的文本内容。从APIversion10开始,该参数......
  • 2024华为OD机试真题---中文分词模拟器
    华为OD机试中的中文分词模拟器题目,通常要求考生对给定的不包含空格的字符串进行精确分词。这个字符串仅包含英文小写字母及英文标点符号(如逗号、分号、句号等),同时会提供一个词库作为分词依据。以下是对这类题目的详细解析一、题目描述给定一个连续不包含空格的字符串Q,该字......
  • 华为OD机试真题---电脑病毒感染
    华为OD机试中的“电脑病毒感染”题目是一个典型的图论问题,涉及到网络中的电脑如何通过连接传播病毒,并计算感染所有电脑所需的最短时间。以下是对该题目的详细解析:一、题目描述一个局域网内有很多台电脑,分别标注为0~N-1的数字。相连接的电脑距离不一样,所以感染时间不一样,感......
  • 华为OD机试 - 统计字符 (Java 2024 E卷 100分)
    华为OD机试2024E卷题库疯狂收录中,刷题点这里。实战项目访问:http://javapub.net.cn/专栏导读本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。刷的越多,抽中的概率越大,私信javapub,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注......
  • 华为OD机试 - 称砝码 (Java 2024 E卷 100分)
    华为OD机试2024E卷题库疯狂收录中,刷题点这里。实战项目访问:http://javapub.net.cn/专栏导读本专栏收录于《华为OD机试(JAVA)真题(E卷+D卷+A卷+B卷+C卷)》。刷的越多,抽中的概率越大,私信javapub,备注华为OD,加入华为OD刷题交流群,每一题都有详细的答题思路、详细的代码注......