飞桨PaddleOCR的安装

2,498 阅读6分钟

飞桨PaddleOCR的安装和使用

安装环境

机器环境:Mac M1芯片 ARM64架构

安装时间:2023-01-17

安装版本:PaddleOCR 2.6

安装参考的主文档:github.com/PaddlePaddl…

PaddleOCR快速开始:github.com/PaddlePaddl…

注意:由于Mac M1机器的原因,按部就班的按照文档中的命令行使用模式一直不能成功,报如下的错误:

通过如下命令,安装PaddleOCR whl包

pip install "paddleocr>=2.0.1" # 推荐使用2.0.1+版本

然后执行命令行

paddleocr --image_dir ./imgs/11.jpg --use_angle_cls true --use_gpu false

报错如下:

ERROR: flag 'flagfile' was defined more than once (in files '/Users/paddle/xly/workspace/f2bafd01-b80e-4ac8-972c-1652775b2e51/Paddle/build/third_party/gflags/src/extern_gflags/src/gflags.cc' and '/tmp/gflags-20211021-3963-1mi18ai/gflags-2.2.2/src/gflags.cc').

没办法,后来我通过直接git下载paddleOCR的源码直接本地编译才通过。

据说Mac Intel X86架构的芯片执行是没有上述问题的。可能和我的机器是MAC M1 ARM64架构芯片有关

安装步骤

1、使用Anaconda搭建Python环境

我选择的版本:Anaconda3-2022.10-MacOSX-arm64.pkg

下载完毕后,双击.pkg文件按照默认设置安装即可

  • 创建并设置conda环境

由于我使用的是zsh,所以直接在终端打开并编辑修改

vim ~/.zshrc

在~/.zshrc中将conda添加为环境变量

export PATH="~/opt/anaconda3/bin:$PATH"

修改完成后,直接在终端中输入以下命令,生效环境变量

source ~/.zshrc

然后在终端输入

conda info --envs

若能够显示出来当前有base环境,则conda已加入环境变量,like如下

image.png

并且终端的输入框前方,也出现了(base)相关的字段,说明现在conda已经默认创建了base环境

  • 创建新的conda环境

注意:paddleOCR的版本和python的版本息息相关,如果低版本的python使用高版本的paddleOCR,有可能出现本地编译不通过的问题。

python3.6、python3.7 版本从 release/1.2 分支开始支持, python3.8 版本从 release/1.8 分支开始支持, python3.9 版本从 release/2.1 分支开始支持, python3.10 版本从 release/2.3 分支开始支持

所以当前最新的PaddleOCR版本为2.6版本,那么问题来了需要选择python3的哪个版本呢?

之前本地机器的python版本比较低,低版本的python可能会使用依赖的numpy库已经废弃的特性,导致编译不过。直接升级到3.10版本,但是升级到python 3.10版本后在后面的PPOCRLabel手动标注的时候会出现闪退的情况,具体是因为python3.10对于PyQt5的兼容性不太好。所以最终又回退到选择了python3.9的版本。

所以需要创建conda环境,并且python版本为3.9版本

# 在命令行输入以下命令,创建名为paddle_env_python_3.9 的环境
# 此处为加速下载,使用清华源
conda create --name paddle_env_python_3.9 python=3.9 --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/free/

创建新conda环境后,激活,输入命令如下:

# 激活paddle_env_python_3.9环境
conda activate paddle_env_python_3.9
# 查看当前python的位置
where python
# python版本号
python --version

image.png

2、安装paddlepaddle

安装参考文档www.paddlepaddle.org.cn/install/qui…

由于已经安装好了conda环境,则可以直接使用conda方式安装

image.png 但是我的环境在使用conda方式安装的时候总是安装不上,所以我使用了pip的安装方式。

接着上面在conda的paddle_env_python_3.9环境下,执行如下命令

python -m pip install paddlepaddle==2.4.1 -i https://pypi.tuna.tsinghua.edu.cn/simple

安装好后,验证是否将paddle安装好的方式

image.png

3、安装PaddleOCR

OK,paddle基础包安装好后,我们就可以开始安装PaddleOCR了

首先下载源码,并安装相关的依赖,依次执行如下代码:

git clone https://github.com/PaddlePaddle/PaddleOCR.git
cd PaddleOCR
pip install -r requirements.txt

如果依赖库安装没问题,则可以安装PeddleOCR了,执行如下命令:

cd PaddleOCR
python setup.py install

在终端输入Python3,进入Python解释器,输入import paddleocr 如果成功引入包,说明您已成功安装。

image.png

4、安装PPOCRLabel

安装PPOCRLabel标注工具最复杂的还是Qt的安装,Mac M1的芯片在安装标注工具的时候。会出现长时间等待的状况

image.png

在Preparing metadata (pyproject.toml)的状态下出现假死的情况

查找了网上如何在Mac M1芯片的机器上安装pyqt5的文章,最终解决。

  • 需要首先通过homebrew来安装Pyqt5
brew install pyqt5

image.png

随后在zsh中追加到PATH的环境变量

/opt/homebrew/opt/qt@5/bin
/opt/homebrew/opt/pyqt@5/bin

如下:

image.png

然后查看如下目录,看到pyqt5的库文件,都是以info结尾

/opt/homebrew/opt/pyqt@5/lib/python3.9/site-packages
  • 将pyqt的库文件复制到conda的python的环境中

image.png

我的Python环境是使用Anaconda搭建,可以切换到自己使用的虚拟环境目录下的site-packages目录

我使用的虚拟环境为paddle_env_python_3.9

所以其对应的site-packages目录为

/Users/shaoshuai.shao/opt/anaconda3/envs/paddle_env_python_3.10/lib/python3.10/site-packages

image.png

接着就是用cp命令将前面homebrew安装好的pyqt5文件拷贝过去即可。

copy完成后,既可以通过python3的解释器来判断pyqt5是否安装成功

如下图即安装成功。

image.png

PyQt5安装成功后,我们就可以直接执行下载PPOCRLabel对应的依赖了

cd PPOCRLabel
pip install -r requirements.txt

安装好所有依赖后,就可以启动PPOCRLabel了

python PPOCRLabel.py --lang ch

标注的界面就弹出来了!安装成功

注意:注意:在之前尝试使用Python3.10环境下,启动标注界面后,在图片上使用手动矩形标注的时候,标注界面会闪退报错,报错界面如下

image.png

仔细研究下报错信息,还是在调用PyQt5的方法时候,方法的入参格式是int,但是传进去的参数是float类型,导致报错闪退。

网上查询了一些信息,github.com/spyder-ide/…

应该是Python3.10和PyQt5存在一些不兼容的地方。

image.png

还是需要将Python3.10降版本到3.9即可!

5、使用PaddleOCR

参考文档中PDF的OCR扫描文档:github.com/PaddlePaddl…

from paddleocr import PaddleOCR, draw_ocr

# Paddleocr supports Chinese, English, French, German, Korean and Japanese.
# You can set the parameter `lang` as `ch`, `en`, `fr`, `german`, `korean`, `japan`
# to switch the language model in order.
ocr = PaddleOCR(use_angle_cls=True, lang="ch", page_num=2)  # need to run only once to download and load model into memory
img_path = './xxx.pdf'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
    res = result[idx]
    for line in res:
        print(line)

# draw result
import fitz
from PIL import Image
import cv2
import numpy as np
imgs = []
with fitz.open(img_path) as pdf:
    for pg in range(0, pdf.pageCount):
        page = pdf[pg]
        mat = fitz.Matrix(2, 2)
        pm = page.getPixmap(matrix=mat, alpha=False)
        # if width or height > 2000 pixels, don't enlarge the image
        if pm.width > 2000 or pm.height > 2000:
            pm = page.getPixmap(matrix=fitz.Matrix(1, 1), alpha=False)

        img = Image.frombytes("RGB", [pm.width, pm.height], pm.samples)
        img = cv2.cvtColor(np.array(img), cv2.COLOR_RGB2BGR)
        imgs.append(img)
for idx in range(len(result)):
    res = result[idx]
    image = imgs[idx]
    boxes = [line[0] for line in res]
    txts = [line[1][0] for line in res]
    scores = [line[1][1] for line in res]
    im_show = draw_ocr(image, boxes, txts, scores, font_path='doc/fonts/simfang.ttf')
    im_show = Image.fromarray(im_show)
    im_show.save('result_page_{}.jpg'.format(idx))

直接使用python3编译器编译的时候报错如下:

image.png

报错指出:File "/Users/shaoshuai.shao/opt/anaconda3/envs/paddle_env_python_3.10/lib/python3.10/site-packages/paddleocr-2.6.1.0-py3.10.egg/paddleocr/ppocr/utils/utility.py", line 96, in check_and_read pm = page.getPixmap(matrix=mat, alpha=False)

使用的getPixmap方法不对,是不是使用get_pixmap。

查看网上的原因:paddleOCR依赖的PyMuPDF库,在1.20.2版本将方法命名从驼峰方式切换成了下划线的方式。

我想到的解决方案就是修改paddleOCR的源码,然后再重新编译即可。

修改paddleocr/ppocr/utils/utility.py的代码,将所有方法的驼峰切换为下划线的调用

image.png

OK,然后再重新编译下PaddleOCR,进入PaddleOCR源码的主目录

cd PaddleOCR
python setup.py install

image.png

这样就可以执行OCR PDF了!!!

image.png

引用

How to Fix AttributeError: module 'numpy' has no attribute 'float'

MacOS安装PPOCRLabel+PaddleOCR+PaddlePddle_高卧且加餐的博客-CSDN博客

M1 Mac安装PyQt5的方法

How can I run pyqt5 on my Mac with M1chip (ppc64el architecture)?

TypeError when displaying indent guides in Python 3.10 · Issue #17159 · spyder-ide/spyder