百度飞桨PaddleOCR的安装与使用
百度飞桨PaddleOCR的安装与使用
工作环境:win10
PaddlePaddle 2.0.0
Anaconda下python3.7
CUDA-10.2
cudnn-10.2-v7.6.5
参考:
PaddleOCR快速安装:
https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.2/doc/doc_ch/installation.md
安装具体细节
1、安装CUDA-10.2和cudnn-10.2-v7.6.5
默认C盘安装可以避免莫名问题,安装cuda时候推荐不选NVIDA GeForce Experience,因为比较大且暂时用不到,节约内存资源
出问题 ImportError: Could not find ‘cudnn64_7.dll’:CUDA-10.2下没有cudnn64_7.dll动态库,将cudnn-10.2-v7.6.5内的cudnn64_7.dll复制一份过去就可。
注意:cudnn-9.0下也有cudnn64_7.dll,复制过去后可能导致飞桨验证gpu成功,但实际paddleOCR无法调用gpu
2、安装PaddlePaddle 2.0
使用GPU(paddlepaddle-gpu版本也可以选择调用cpu),当前CUDA10,请运行以下命令安装
python -m pip install paddlepaddle-gpu==2.0.0 -i https://mirror.baidu.com/pypi/simple
3、克隆PaddleOCR repo代码
推荐github:
git clone https://github.com/PaddlePaddle/PaddleOCR
实在网络差,也可选择使用码云上的托管(因为选择的是成熟稳定2.0版本,github和gitee上应该一样)
git clone https://gitee.com/paddlepaddle/PaddleOCR
4、安装第三方库(特容易出错地方)
cd PaddleOCR
注意事项:
安装出错主要是两个包,python_Levenshtein包和shapely包,Shapely安装版本不合适导致问题–>OSError: [WinError 126] 找不到指定的模块—geos_c.dll;出错没有cv2包,可能是没安装requirements.txt里指定的包
建议:修改requirements.txt,先将shapely和python_Levenshtein注释
提前下载两个包:
Shapely-1.7.1-cp37-cp37m-win_amd64.whl
python_Levenshtein-0.12.2-cp37-cp37m-win_amd64.whl
pip install -r requirements.txt -i https://mirror.baidu.com/pypi/simple
5、其他
可能还需要安装paddle包,paddleocr包
验证测试
import paddle
paddle.utils.run_check()
# 运行成功
Running verify PaddlePaddle program ...
W0909 14:22:58.062589 15456 device_context.cc:362] Please NOTE: device: 0, GPU Compute Capability: 7.5, Driver API Version: 11.4, Runtime API Version: 10.2
W0909 14:22:58.071564 15456 device_context.cc:372] device: 0, cuDNN Version: 7.6.
PaddlePaddle works well on 1 GPU.
W0909 14:23:01.684285 15456 build_strategy.cc:171] fusion_group is not enabled for Windows/MacOS now, and only effective when running with CUDA GPU.
PaddlePaddle works well on 1 GPUs.
PaddlePaddle is installed successfully! Let's start deep learning with PaddlePaddle now.
若显示检测到gpu且在gpu上运行良好,不一定代表实际ocr识别可用,可能gpu还是调不起来,最后发现还是cudnn版本一定要和cuda匹配,参考前述
使用教程
飞桨框架2.0使用教程:
https://www.paddlepaddle.org.cn/documentation/docs/zh/2.0/guides/index_cn.html
paddleocr package使用说明(包括参数说明):
https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.2/doc/doc_ch/whl.md
中文OCR模型快速使用:
https://gitee.com/paddlepaddle/PaddleOCR/blob/release/2.2/doc/doc_ch/quickstart.md
实践
import time
import os, sys
import matplotlib.pyplot as plt
from PIL import Image
from paddleocr import PaddleOCR, draw_ocr
# 系统路径加入PaddleOCR文件夹, 解决找不到模块问题
sys.path.append(os.path.dirname(os.path.dirname(os.path.realpath(__file__)))) # 根据所在文件相对PaddleOCR文件夹层次添加
folder_dir = os.path.dirname(os.path.realpath(__file__)) # 当前文件所在文件夹目录
start = time.time() # 时间戳, 秒
print("-------------- 识别开始 ---------------")
paddleOCR_dir = os.path.join(os.getcwd(), "PaddleOCR")
os.chdir(paddleOCR_dir) # 切换路径,保证设置参数文件的相对路径正确
# print(os.getcwd())
# --cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/" # 分类模型所在文件夹
cls_model_dir="./inference/ch_ppocr_mobile_v2.0_cls_infer/"
# --det_model_dir="./inference/ch_ppocr_mobile_v2.0_det_infer/" # 检测模型所在文件夹
det_model_dir = "./inference/ch_ppocr_mobile_v2.0_det_infer/"
# --rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/" # 识别模型所在文件夹
rec_model_dir="./inference/ch_ppocr_mobile_v2.0_rec_infer/"
# --use_angle_cls=True --use_space_char=True --use_gpu=False
use_angle_cls = False # 是否加载分类模型
use_space_char = True # 是否识别空格
use_gpu = True # 是否使用GPU,若想利用gpu,设置为True
cls = False # 前向时是否启动分类
# 实例化PaddleOCR识别类
ocr = PaddleOCR(cls_model_dir=cls_model_dir, det_model_dir=det_model_dir, rec_model_dir=rec_model_dir,
use_angle_cls=use_angle_cls, use_gpu=use_gpu ) # need to run only once to download and load model into memory
# img_path = '/11.jpg' # 图片直接放在同级目录
local_path = os.path.join(folder_dir, 'tmp_in') # 若没有tmp_in文件夹,自己建个
img_path = local_path + '\card.png' # 图片名
result = ocr.ocr(img_path, cls=False) # 最终结果,识别方框4个点坐标,识别文本,置信度组成的列表
# print(result)
txts = [result[i][1][0] for i in range(len(result))] # 识别的文本列表
scores = [result[i][1][1] for i in range(len(result))] # 识别的参数
print(txts)
print(scores)
# 保存识别对比图
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不是必须, font_path='./doc/fonts/simfang.ttf'
im_show = Image.fromarray(im_show)
save_path = os.path.join(folder_dir, 'tmp_out',img_path.split("\\")[-1]) # 保存, 若没有tmp_out文件夹,自己建个
print(save_path)
im_show.save(save_path)
end = time.time()
cost_time = round(end - start, 2)
print("-------------- 识别结束,耗时 "+ str(cost_time) +"秒 ---------------")