paddleOCR GPU版安装以及使用 (含详细的cuda安装教程)
官网地址:PaddleOCR 文档
一,查看自己的显卡最高支持什么CUDA版本
显卡允许的CUDA版本是向下兼容的。
方法一:在cmd命令窗口
中输入nvidia-smi
,发现版本最高支持12.6
方法2:点击NVIDIA控制面板→系统信息
二,查看paddleOCR最高支持什么CUDA版本,以及安装paddleOCR
安装paddleOCR之前要安装paddlepaddle框架,而在经过多次尝试后得知CUDA版本要跟paddle支持的CUDA版本要一样。
查看地址: 开始使用_飞桨-源于产业实践的开源深度学习平台
我这个时候只最高支持CUDA12.0,所以安装CUDA的时候版本要记得安装最多安装12.0版本,否则是无法正常运行的。
python版本尽量往高的来。
确定了选用的CUDA版本后进行安装paddle(自己去官网找适合自己的,这只是示例):
python -m pip install paddlepaddle-gpu==2.6.1.post120 -f https://www.paddlepaddle.org.cn/whl/windows/mkl/avx/stable.html
安装paddleocr
pip install paddleocr
三,安装CUDA
官网链接: https://developer.nvidia.com/cuda-toolkit-archive
找到自己对应的CUDA版本点进去
按照自己系统的方式去选择,此时以windows为例子
下载完成之后打开进行安装,可以自己选择安装地址
一直点下一步就行了,安装选项选择精简:
重新打开命令窗口查看是否安装成功
在命令窗口中输入nvcc -V
进行检查
(base) PS C:\Users\sumengxian> nvcc -V
nvcc: NVIDIA (R) Cuda compiler driver
Copyright (c) 2005-2022 NVIDIA Corporation
Built on Mon_Oct_24_19:40:05_Pacific_Daylight_Time_2022
Cuda compilation tools, release 12.0, V12.0.76
Build cuda_12.0.r12.0/compiler.31968024_0
四,安装cuDNN
这是CUDA加速工具,paddleOCR默认需要这个工具
官网地址:
往期版本地址:cuDNN Archive | NVIDIA Developer
下载zip文件,解压之后有这些文件
然后找到CUDA的安装目录覆盖进去,就安装成功了
五,paddleOCR的使用
1.快速开始
官方示例:
from paddleocr import PaddleOCR
import os
os.environ['KMP_DUPLICATE_LIB_OK'] = 'TRUE'#我的电脑因为报某些错误需要加上这个
# Paddleocr目前支持的多语言语种可以通过修改lang参数进行切换
# 例如`ch`, `en`, `fr`, `german`, `korean`, `japan`
ocr = PaddleOCR(use_angle_cls=True, lang="ch",use_gpu = True) # need to run only once to download and load model into memory use_gpu 开启gpu(显卡)进行推理
img_path = './imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)
结果是一个list,每个item包含了文本框,文字和识别置信度
1 2 | [[[28.0, 37.0], [302.0, 39.0], [302.0, 72.0], [27.0, 70.0]], ('纯臻营养护发素', 0.9658738374710083)] ...... |
---|
2.PaddleOCR模型推理参数列表
推荐:
本人推荐将det_limit_side_len参数设置为1920,防止当照片过大时而有些文字没有被识别到
det_model_dir = "./models/det/ch/ch_PP-OCRv4_det_server_infer/" rec_model_dir = "./models/rec/ch/ch_PP-OCRv4_rec_server_infer/" cls_model_dir = "./models/cls/ch_ppocr_mobile_v2.0_cls_infer/" s det_limit_side_len = 1920
在使用PaddleOCR进行模型推理时,可以自定义修改参数,来修改模型、数据、预处理、后处理等内容,详细的参数解释如下所示。
- 全局信息
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
image_dir | str | 无,必须显式指定 | 图像或者文件夹路径 |
page_num | int | 0 | 当输入类型为pdf文件时有效,指定预测前面page_num页,默认预测所有页 |
vis_font_path | str | “./doc/fonts/simfang.ttf” | 用于可视化的字体路径 |
drop_score | float | 0.5 | 识别得分小于该值的结果会被丢弃,不会作为返回结果 |
use_pdserving | bool | False | 是否使用Paddle Serving进行预测 |
warmup | bool | False | 是否开启warmup,在统计预测耗时的时候,可以使用这种方法 |
draw_img_save_dir | str | “./inference_results” | 系统串联预测OCR结果的保存文件夹 |
save_crop_res | bool | False | 是否保存OCR的识别文本图像 |
crop_res_save_dir | str | “./output” | 保存OCR识别出来的文本图像路径 |
use_mp | bool | False | 是否开启多进程预测 |
total_process_num | int | 6 | 开启的进程数,use_mp 为True 时生效 |
process_id | int | 0 | 当前进程的id号,无需自己修改 |
benchmark | bool | False | 是否开启benchmark,对预测速度、显存占用等进行统计 |
save_log_path | str | “./log_output/” | 开启benchmark 时,日志结果的保存文件夹 |
show_log | bool | True | 是否显示预测中的日志信息 |
use_onnx | bool | False | 是否开启onnx预测 |
- 预测引擎相关
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
use_gpu | bool | True | 是否使用GPU进行预测 |
ir_optim | bool | True | 是否对计算图进行分析与优化,开启后可以加速预测过程 |
use_tensorrt | bool | False | 是否开启tensorrt |
min_subgraph_size | int | 15 | tensorrt中最小子图size,当子图的size大于该值时,才会尝试对该子图使用trt engine计算 |
precision | str | fp32 | 预测的精度,支持fp32 , fp16 , int8 3种输入 |
enable_mkldnn | bool | True | 是否开启mkldnn |
cpu_threads | int | 10 | 开启mkldnn时,cpu预测的线程数 |
- 文本检测模型相关
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
det_algorithm | str | “DB” | 文本检测算法名称,目前支持DB , EAST , SAST , PSE , DB++ , FCE |
det_model_dir | str | xx | 检测inference模型路径 |
det_limit_side_len | int | 960 | 检测的图像边长限制 |
det_limit_type | str | “max” | 检测的边长限制类型,目前支持min 和max ,min 表示保证图像最短边不小于det_limit_side_len ,max 表示保证图像最长边不大于det_limit_side_len |
其中,DB算法相关参数如下
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
det_db_thresh | float | 0.3 | DB输出的概率图中,得分大于该阈值的像素点才会被认为是文字像素点 |
det_db_box_thresh | float | 0.6 | 检测结果边框内,所有像素点的平均得分大于该阈值时,该结果会被认为是文字区域 |
det_db_unclip_ratio | float | 1.5 | Vatti clipping 算法的扩张系数,使用该方法对文字区域进行扩张 |
max_batch_size | int | 10 | 预测的batch size |
use_dilation | bool | False | 是否对分割结果进行膨胀以获取更优检测效果 |
det_db_score_mode | str | “fast” | DB的检测结果得分计算方法,支持fast 和slow ,fast 是根据polygon的外接矩形边框内的所有像素计算平均得分,slow 是根据原始polygon内的所有像素计算平均得分,计算速度相对较慢一些,但是更加准确一些。 |
EAST算法相关参数如下
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
det_east_score_thresh | float | 0.8 | EAST后处理中score map的阈值 |
det_east_cover_thresh | float | 0.1 | EAST后处理中文本框的平均得分阈值 |
det_east_nms_thresh | float | 0.2 | EAST后处理中nms的阈值 |
SAST算法相关参数如下
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
det_sast_score_thresh | float | 0.5 | SAST后处理中的得分阈值 |
det_sast_nms_thresh | float | 0.5 | SAST后处理中nms的阈值 |
det_box_type | str | quad | 是否多边形检测,弯曲文本场景(如Total-Text)设置为’poly’ |
PSE算法相关参数如下
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
det_pse_thresh | float | 0.0 | 对输出图做二值化的阈值 |
det_pse_box_thresh | float | 0.85 | 对box进行过滤的阈值,低于此阈值的丢弃 |
det_pse_min_area | float | 16 | box的最小面积,低于此阈值的丢弃 |
det_box_type | str | “quad” | 返回框的类型,quad:四点坐标,poly: 弯曲文本的所有点坐标 |
det_pse_scale | int | 1 | 输入图像相对于进后处理的图的比例,如640*640 的图像,网络输出为160*160 ,scale为2的情况下,进后处理的图片shape为320*320 。这个值调大可以加快后处理速度,但是会带来精度的下降 |
- 文本识别模型相关
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
rec_algorithm | str | “CRNN” | 文本识别算法名称,目前支持CRNN , SRN , RARE , NETR , SAR , ViTSTR , ABINet , VisionLAN , SPIN , RobustScanner , SVTR , SVTR_LCNet |
rec_model_dir | str | 无,如果使用识别模型,该项是必填项 | 识别inference模型路径 |
rec_image_shape | str | “3,48,320” | 识别时的图像尺寸 |
rec_batch_num | int | 6 | 识别的batch size |
max_text_length | int | 25 | 识别结果最大长度,在SRN 中有效 |
rec_char_dict_path | str | “./ppocr/utils/ppocr_keys_v1.txt” | 识别的字符字典文件 |
use_space_char | bool | True | 是否包含空格,如果为True ,则会在最后字符字典中补充空格 字符 |
- 端到端文本检测与识别模型相关
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
e2e_algorithm | str | “PGNet” | 端到端算法名称,目前支持PGNet |
e2e_model_dir | str | 无,如果使用端到端模型,该项是必填项 | 端到端模型inference模型路径 |
e2e_limit_side_len | int | 768 | 端到端的输入图像边长限制 |
e2e_limit_type | str | “max” | 端到端的边长限制类型,目前支持min , max ,min 表示保证图像最短边不小于e2e_limit_side_len ,max 表示保证图像最长边不大于e2e_limit_side_len |
e2e_pgnet_score_thresh | float | 0.5 | 端到端得分阈值,小于该阈值的结果会被丢弃 |
e2e_char_dict_path | str | “./ppocr/utils/ic15_dict.txt” | 识别的字典文件路径 |
e2e_pgnet_valid_set | str | “totaltext” | 验证集名称,目前支持totaltext , partvgg ,不同数据集对应的后处理方式不同,与训练过程保持一致即可 |
e2e_pgnet_mode | str | “fast” | PGNet的检测结果得分计算方法,支持fast 和slow ,fast 是根据polygon的外接矩形边框内的所有像素计算平均得分,slow 是根据原始polygon内的所有像素计算平均得分,计算速度相对较慢一些,但是更加准确一些。 |
- 方向分类器模型相关
参数名称 | 类型 | 默认值 | 含义 |
---|---|---|---|
use_angle_cls | bool | False | 是否使用方向分类器 |
cls_model_dir | str | 无,如果需要使用,则必须显式指定路径 | 方向分类器inference模型路径 |
cls_image_shape | str | “3,48,192” | 预测尺度 |
label_list | list | [‘0’, ‘180’] | class id对应的角度值 |
cls_batch_num | int | 6 | 方向分类器预测的batch size |
cls_thresh | float | 0.9 | 预测阈值,模型预测结果为180度,且得分大于该阈值时,认为最终预测结果为180度,需要翻转 |
3.修改模型
这里提供了各种的OCR模型可以进行替换
最简单的替换方式是改源码中的url:
调用的时候就加上字段lang="ch"就可以了
4.对齐文字
将输出文字对齐,这是大佬开源的一个项目:xhw205/PaddleOCR_AlignText: PaddleOCR 输出结果的行对齐,表格制式图像OCR行对齐
效果:
代码:
from paddleocr import PaddleOCR
import numpy as np
from interval import Interval
from PIL import Image
det_model_dir = "./inference/ch_PP-OCRv4_det_infer/"
rec_model_dir = "./inference/ch_PP-OCRv4_rec_infer/"
cls_model_dir = "./inference/ch_ppocr_mobile_v2.0_cls_infer/"
class OCR(PaddleOCR):
def __init__(self, **kwargs):
super(OCR, self).__init__(**kwargs)
def ocr_new(self, img, det=True, rec=True, cls=True):
res = self.ocr(img, det=det, rec=rec, cls=cls)
if res!=None:
return res
else:
img_v = Image.open(img).convert("RGB")
img_v = np.asanyarray(img_v)[:,:,[2,1,0]]
dt_boxes, rec_res = self.__call__(img_v)
return [[box.tolist(), res] for box, res in zip(dt_boxes, rec_res)]
def align_text(res, threshold=0):
res.sort(key=lambda i: (i[0][0][0])) # 按照x排
already_IN, line_list = [], []
for i in range(len(res)): # i当前
# print(res[i][1][0])
if res[i][0][0] in already_IN:
continue
line_txt = " " + "".join(res[i][1][0].split()) + " "
already_IN.append(res[i][0][0])
y_i_points = [res[i][0][0][1], res[i][0][1][1], res[i][0][3][1], res[i][0][2][1]]
min_I_y, max_I_y = min(y_i_points), max(y_i_points)
curr = Interval(min_I_y + (max_I_y - min_I_y) // 3, max_I_y)
curr_mid = min_I_y + (max_I_y - min_I_y) // 2
for j in range(i + 1, len(res)): # j下一个
if res[j][0][0] in already_IN:
continue
y_j_points = [res[j][0][0][1], res[j][0][1][1], res[j][0][3][1], res[j][0][2][1]]
min_J_y, max_J_y = min(y_j_points), max(y_j_points)
next_j = Interval(min_J_y, max_J_y - (max_J_y - min_J_y) // 3)
if next_j.overlaps(curr) and curr_mid in Interval(min_J_y, max_J_y):
line_txt += (res[j][1][0] + " ")
already_IN.append(res[j][0][0])
curr = Interval(min_J_y + (max_J_y - min_J_y) // 3, max_J_y)
curr_mid = min_J_y + (max_J_y - min_J_y) // 2
line_list.append((res[i][0][0][1], line_txt))
line_list.sort(key=lambda x: x[0])
txt = '\n'.join([i[1] for i in line_list])
return txt,line_list
paddle_ocr_engin = OCR(det_model_dir= det_model_dir,rec_model_dir= rec_model_dir,cls_model_dir= cls_model_dir,use_angle_cls=True)
res = paddle_ocr_engin.ocr_new('./test.jpg')
print(res[0])
print(align_text(res[0]))
参考文章:
全网最详细的安装pytorch GPU方法,一次安装成功!!包括安装失败后的处理方法!-CSDN博客