介绍
OCR是我们都熟悉的基于人工智能视觉的标准功能之一。OCR现在无处不在,以至于它内置于手机操作系统中,我们几乎没有注意到。显然,我们需要将其添加到服务器CodeProject.AI 但这样做有点冒险。
有大量的OCR项目和软件包,在Mike Lud的带领下,我们选择了 PaddleOCR。PaddleOCR基于出色的 PaddlePaddle(PArallel分布式深LEarning)包。不幸的是,PaddleOCR和PaddlePaddle对于工作来说可能是一个挑战,所以以下是我们所做的快速概述:
在Python中获取PaddlePaddle和PaddleOCR设置
- 我们忽略了文档。PaddleOCR显然支持CUDA 10.6,但PaddlePaddle(PaddleOCR需要)显然只支持CUDA 10.1。除非它声明它支持10.6。我们让它在CUDA 11.7上运行。对于试图针对英伟达的不断发展的项目来说,这种混乱是非常标准的。任何针对Nvidia的人都是勇敢的,或者他们知道如何将他们的系统锁定到一组特定的驱动程序、工具包和库。一团糟。
- 我们在谷歌翻译住了3天。PaddlePaddle由中国科技巨头百度开发并开源于2016年。由于它位于中国,因此论坛通常不是英语。
- 我们进行了实验、阅读、测试和调整,最终得到了以下用于安装Python包的设置矩阵:
OS | CPU | GPU |
Windows | paddlepaddle==2.3.2 | --find-links https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html |
Ubuntu | paddlepaddle==2.4.0rc0 | No success |
macOS (Intel) | paddlepaddle==2.3.2 | Not supported |
macOS (Arm64) | paddlepaddle==2.3.2 | Not supported |
- 修补了PaddlePaddle代码中的一个丑陋的黑客,以使事情正常工作。
在Python安装(或虚拟环境)的站点包文件夹下的paddle包中,你将找到一个文件夹数据集,并在该文件中 image.py。第#37行有一个FIXME,用于丑陋的黑客修复导入OpenCV时numpy的问题。他们通过启动一个新的Python解释器来导入OpenCV,并直接导入OpenCV:
43 interpreter = sys.executable
44 # Note(zhouwei): if use Python/C 'PyRun_SimpleString', 'sys.executable'
45 # will be the C++ execubable on Windows
46 if sys.platform == 'win32' and 'python.exe' not in interpreter:
47 interpreter = sys.exec_prefix + os.sep + 'python.exe'
48 import_cv2_proc = subprocess.Popen(
49 [interpreter, "-c", "import cv2"],
50 stdout=subprocess.PIPE,
51 stderr=subprocess.PIPE,
52 shell=True)
53 out, err = import_cv2_proc.communicate()
54 retcode = import_cv2_proc.poll()
55 if retcode != 0:
56 cv2 = None
57 else:
58 import cv2
59 else:
60 try:
61 import cv2
62 except ImportEr:...
这是一些创造性的问题解决。
问题是进程是使用Shell=False的Popen旋转起来的(具体来说,他们只是让Shell采用默认值,这是False)。在上面的代码示例中,在第52行,您可以看到修复。对于Windows和Ubuntu,您需要具有Shell=True,否则导入将失败。对于macOS Shell=False很好(英特尔和Arm64)。
显然,这个黑客只适用于Ubuntu,但它在所有操作系统的Paddle代码中,所以它需要为Windows和Ubuntu修复。
有了这个,我们就有了PaddleOCR运行。它在CPU上不是很快。半页文本需要10-15秒,但打开GPU是200毫秒左右。完全可用且非常准确。
CodeProject.AI服务器的下一个版本将包括使用PaddleOCR安装OCR的选项。我们的项目是在12月的第一周。
后记:在WSL下Ubuntu中对PaddlePaddle的GPU支持
到目前为止,这个已经打败了我们。在WSL上的Ubunut 22.04中的PaddleOCR(仅限CPU)工作正常。启用GPU不会正常工作。WSL的一个主要问题是你需要在WSL中安装CUDA,而不是依赖Windows CUDA驱动程序来做他们的事情。可以在这里找到一篇文章。安装CUDA后,通过打开Python终端并输入
import paddle
paddle.utils.run_check()
如果这一切都很好,那么您可以查看安装Paddle软件包,到目前为止,我们尽最大努力使用
-f https://paddlepaddle.org.cn/whl/stable/noavx.html
paddlepaddle-gpu==2.4.0rc0
paddleocr==2.6.0.1
这安装成功并且至少会启动(其他组合以六种不同的方式崩溃),但您最终会遇到黑客(上面)旨在解决的问题:即,由于导入OPenCV引起的numpy错误,您在尝试运行PaddleOCR时会出现段错误。该黑客旨在通过在生成的Python进程中导入OpenCV来解决此问题。这个过程在ubuntu 22.04中并不成功(至少对我们来说是这样),所以它回退到经典的“import cv2”,然后导致段错误。
https://www.codeproject.com/Tips/5347636/Getting-PaddleOCR-and-PaddlePaddle-to-work-in-Wind