注意:我的系统是Ubuntu18.4
1 介绍
光学字符识别(Optical Character Recognition,OCR )主要用于图片中文本识别。目前开源的OCR识别工具比较多,比较出名的有PaddleOCR、EasyOCR、Tesseract-OCR和Surya等。
PaddleOCR由百度基于PaddlePaddle使用Python编写和训练的开源OCR项目,提供了多种尺寸和语种的模型,效果很不错,提供了Python包可直接使用,不仅提供了布局识别、文档识别,还提供了表格识别。
# GitHub地址
https://github.com/PaddlePaddle/PaddleOCR
EasyOCR由Jaided AI使用Python编写的OCR项目,支持80多种语言,提供了Python包,可直接使用,效果也很不错。
# Github地址
https://github.com/JaidedAI/EasyOCR
# 官网地址
https://www.jaided.ai/
Tesseract-OCR由Google主要使用C++编写的开源OCR项目,它提供了超过130种语言和35种脚本的软件包,可以在Linux、Windows和Mac等平台上运行。
缺点:需要在相应平台上自己手动安装和编译,没有直接提供Python和Java的使用方式,没有提供表格识别等,有一个基于tesseract-ocr的开源项目pytesseract可以使用Python调用。
# Github项目地址
https://github.com/tesseract-ocr
# 开源源代码
https://github.com/tesseract-ocr/tesseract
# 开发文档地址
https://tesseract-ocr.github.io/tessdoc/
Surya由个人开源的使用Python编写和训练的开源OCR项目,提供了90多种语言的识别,主要用于文档OCR识别、提供了布局识别和文本识别等。
# Github地址
https://github.com/VikParuchuri/surya
2 安装PaddleOCR
# 安装paddlepaddle(我用的是cpu版本)
python3 -m pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
# 安装gpu版本paddlepaddle
python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
# 安装paddleocr
pip install paddleocr
安装时出现的问题
主要是安装python-Levenshtein引起的问题,直接安装XX.tar.gz文件是不行的,可以安装XX.linux.whl文件应该可以(但是我没找到linux版本)。
fatal error: Python.h: No such file or directory
#include <Python.h>
error: command 'x86_64-linux-gnu-gcc' failed with exit status 1
解决办法
# 一般情况下,直接安装下面的即可,建议用指定python版本的方法
sudo apt-get install python-dev
# 如果还不行,安装时指定python版本,不指定python版本可能还出现问题
sudo apt-get install python3.8-dev
3 PaddleOCR使用
from paddleocr import PaddleOCR, draw_ocr
# 'use_gpu=False'不用gpu,默认使用GPU
# 'use_angle_cls=True'自动下载相关的包
# 'lang="ch"'设置语言,支持中英文、英文、法语、德语、韩语、日语,参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。
# 离线使用时,设置模型的目录det_model_dir、rec_model_dir、cls_model_dir第一次联网模型会自动下载到model目录下
ocr = PaddleOCR(use_gpu=False, use_angle_cls=True, lang="ch", det_model_dir="./model/det", rec_model_dir="./model/rec/", cls_model_dir="./model/cls/")
img_path = './picture/my_001.png'
result = ocr.ocr(img_path, cls=True)
# line是一个列表' [[文本框的位置],(文字,置信度)] '
for line in result:
print(line)