PaddleOCR之安装测试
Posted ZONG_XP
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PaddleOCR之安装测试相关的知识,希望对你有一定的参考价值。
0 背景
paddleocr 号称最强,怀着好奇心,对该软件进行一个安装测试
1 安装
创建一个虚拟环境
conda create -n paddle_env python=3.8
进入环境,安装 gpu 版本的 paddlepaddle
conda activate paddle_env
python3 -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
再安装 paddleocr
pip install "paddleocr>=2.0.1"
注意:使用 whl 包安装的库支持的算法有限,比如文本检测部分只支持 DB 算法,如果要使用其它模型,需要通过源码安装调试,具体方法在后续文章中会介绍
下载一张测试图片进行测试,输出如下
$ paddleocr --image_dir ./word_1.jpg --use_angle_cls true
[2021/12/08 15:15:57] root WARNING: version PP-OCRv2 not support cls models, auto switch to version PP-OCR
Namespace(benchmark=False, cls_batch_num=6, cls_image_shape='3, 48, 192', cls_model_dir='/home/lthpc/.paddleocr/2.3.0.2/ocr/cls/ch_ppocr_mobile_v2.0_cls_infer', cls_thresh=0.9, cpu_threads=10, det=True, det_algorithm='DB', det_db_box_thresh=0.6, det_db_score_mode='fast', det_db_thresh=0.3, det_db_unclip_ratio=1.5, det_east_cover_thresh=0.1, det_east_nms_thresh=0.2, det_east_score_thresh=0.8, det_limit_side_len=960, det_limit_type='max', det_model_dir='/home/lthpc/.paddleocr/2.3.0.2/ocr/det/ch/ch_PP-OCRv2_det_infer', det_pse_box_thresh=0.85, det_pse_box_type='box', det_pse_min_area=16, det_pse_scale=1, det_pse_thresh=0, det_sast_nms_thresh=0.2, det_sast_polygon=False, det_sast_score_thresh=0.5, drop_score=0.5, e2e_algorithm='PGNet', e2e_char_dict_path='./ppocr/utils/ic15_dict.txt', e2e_limit_side_len=768, e2e_limit_type='max', e2e_model_dir=None, e2e_pgnet_mode='fast', e2e_pgnet_polygon=True, e2e_pgnet_score_thresh=0.5, e2e_pgnet_valid_set='totaltext', enable_mkldnn=False, gpu_mem=500, help='==SUPPRESS==', image_dir='./word_1.jpg', ir_optim=True, label_list=['0', '180'], lang='ch', layout_path_model='lp://PubLayNet/ppyolov2_r50vd_dcn_365e_publaynet/config', max_batch_size=10, max_text_length=25, min_subgraph_size=15, ocr_version='PP-OCRv2', output='./output/table', precision='fp32', process_id=0, rec=True, rec_algorithm='CRNN', rec_batch_num=6, rec_char_dict_path='/home/lthpc/anaconda3/envs/paddle_env/lib/python3.8/site-packages/paddleocr/ppocr/utils/ppocr_keys_v1.txt', rec_image_shape='3, 32, 320', rec_model_dir='/home/lthpc/.paddleocr/2.3.0.2/ocr/rec/ch/ch_PP-OCRv2_rec_infer', save_log_path='./log_output/', show_log=True, structure_version='STRUCTURE', table_char_dict_path=None, table_char_type='en', table_max_len=488, table_model_dir=None, total_process_num=1, type='ocr', use_angle_cls=True, use_dilation=False, use_gpu=True, use_mp=False, use_onnx=False, use_pdserving=False, use_space_char=True, use_tensorrt=False, vis_font_path='./doc/fonts/simfang.ttf', warmup=True)
[2021/12/08 15:16:00] root INFO: **********./word_1.jpg**********
[2021/12/08 15:16:02] root DEBUG: dt_boxes num : 1, elapse : 2.128263235092163
[2021/12/08 15:16:02] root DEBUG: cls num : 1, elapse : 0.007218360900878906
[2021/12/08 15:16:02] root DEBUG: rec_res num : 1, elapse : 0.01619863510131836
[2021/12/08 15:16:02] root INFO: [[[10.0, 8.0], [344.0, 11.0], [343.0, 66.0], [10.0, 63.0]], ('韩国小', 0.9964866)]
环境安装完成
2 python 包测试
2.1 检测 + 方向分类器 + 识别全流程
from paddleocr import PaddleOCR, draw_ocr
# Paddleocr目前支持中英文、英文、法语、德语、韩语、日语,可以通过修改lang参数进行切换
# 参数依次为`ch`, `en`, `french`, `german`, `korean`, `japan`。
ocr = PaddleOCR(use_angle_cls=True, lang="ch") # need to run only once to download and load model into memory
img_path = 'PaddleOCR/doc/imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for line in result:
print(line)
# 显示结果
from PIL import Image
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='/path/to/PaddleOCR/doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
结果是一个list,每个item包含了文本框,文字和识别置信度
[[[24.0, 36.0], [304.0, 34.0], [304.0, 72.0], [24.0, 74.0]], ['纯臻营养护发素', 0.964739]]
[[[24.0, 80.0], [172.0, 80.0], [172.0, 104.0], [24.0, 104.0]], ['产品信息/参数', 0.98069626]]
[[[24.0, 109.0], [333.0, 109.0], [333.0, 136.0], [24.0, 136.0]], ['(45元/每公斤,100公斤起订)', 0.9676722]]
......
结果可视化
2.2 检测 + 识别
from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR() # need to run only once to download and load model into memory
img_path = 'PaddleOCR/doc/imgs/11.jpg'
result = ocr.ocr(img_path, cls=False)
for line in result:
print(line)
# 显示结果
from PIL import Image
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='/path/to/PaddleOCR/doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
结果是一个list,每个item包含了文本框,文字和识别置信度
[[[24.0, 36.0], [304.0, 34.0], [304.0, 72.0], [24.0, 74.0]], ['纯臻营养护发素', 0.964739]]
[[[24.0, 80.0], [172.0, 80.0], [172.0, 104.0], [24.0, 104.0]], ['产品信息/参数', 0.98069626]]
[[[24.0, 109.0], [333.0, 109.0], [333.0, 136.0], [24.0, 136.0]], ['(45元/每公斤,100公斤起订)', 0.9676722]]
......
结果可视化
2.3 方向分类器 + 识别
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True) # need to run only once to download and load model into memory
img_path = 'PaddleOCR/doc/imgs_words/ch/word_1.jpg'
result = ocr.ocr(img_path, det=False, cls=True)
for line in result:
print(line)
结果是一个list,每个item只包含识别结果和识别置信度
['韩国小馆', 0.9907421]
2.4 单独执行检测
from paddleocr import PaddleOCR, draw_ocr
ocr = PaddleOCR() # need to run only once to download and load model into memory
img_path = 'PaddleOCR/doc/imgs/11.jpg'
result = ocr.ocr(img_path, rec=False)
for line in result:
print(line)
# 显示结果
from PIL import Image
image = Image.open(img_path).convert('RGB')
im_show = draw_ocr(image, result, txts=None, scores=None, font_path='/path/to/PaddleOCR/doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
结果是一个list,每个item只包含文本框
[[26.0, 457.0], [137.0, 457.0], [137.0, 477.0], [26.0, 477.0]]
[[25.0, 425.0], [372.0, 425.0], [372.0, 448.0], [25.0, 448.0]]
[[128.0, 397.0], [273.0, 397.0], [273.0, 414.0], [128.0, 414.0]]
......
结果可视化
2.5 单独执行识别
from paddleocr import PaddleOCR
ocr = PaddleOCR() # need to run only once to download and load model into memory
img_path = 'PaddleOCR/doc/imgs_words/ch/word_1.jpg'
result = ocr.ocr(img_path, det=False)
for line in result:
print(line)
结果是一个list,每个item只包含识别结果和识别置信度
['韩国小馆', 0.9907421]
2.6 单独执行方向分类器
from paddleocr import PaddleOCR
ocr = PaddleOCR(use_angle_cls=True) # need to run only once to download and load model into memory
img_path = 'PaddleOCR/doc/imgs_words/ch/word_1.jpg'
result = ocr.ocr(img_path, det=False, rec=False, cls=True)
for line in result:
print(line)
结果是一个list,每个item只包含分类结果和分类置信度
['0', 0.9999924]
3 替换模型
当内置模型无法满足需求时,需要使用到自己训练的模型。 首先,参照 inference.md 第一节转换将检测、分类和识别模型转换为inference模型,然后按照如下方式使用
from paddleocr import PaddleOCR, draw_ocr
# 模型路径下必须含有model和params文件
ocr = PaddleOCR(det_model_dir='your_det_model_dir', rec_model_dir='your_rec_model_dir',
rec_char_dict_path='your_rec_char_dict_path', cls_model_dir='your_cls_model_dir',
use_angle_cls=True)
img_path = 'PaddleOCR/doc/imgs/11.jpg'
result = ocr.ocr(img_path, cls=True)
for line in result:
print(line)
# 显示结果
from PIL import Image
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='/path/to/PaddleOCR/doc/fonts/simfang.ttf')
im_show = Image.fromarray(im_show)
im_show.save('result.jpg')
4 参数说明
字段 | 说明 | 默认值 |
---|---|---|
use_gpu | 是否使用GPU | TRUE |
gpu_mem | 初始化占用的GPU内存大小 | 8000M |
image_dir | 通过命令行调用时执行预测的图片或文件夹路径 | |
det_algorithm | 使用的检测算法类型 | DB |
det_model_dir | 检测模型所在文件夹。传参方式有两种,1. None: 自动下载内置模型到 ~/.paddleocr/det ;2.自己转换好的inference模型路径,模型路径下必须包含model和params文件 | None |
det_max_side_len | 检测算法前向时图片长边的最大尺寸,当长边超出这个值时会将长边resize到这个大小,短边等比例缩放 | 960 |
det_db_thresh | DB模型输出预测图的二值化阈值 | 0.3 |
det_db_box_thresh | DB模型输出框的阈值,低于此值的预测框会被丢弃 | 0.5 |
det_db_unclip_ratio | DB模型输出框扩大的比例 | 2 |
det_east_score_thresh | EAST模型输出预测图的二值化阈值 | 0.8 |
det_east_cover_thresh | EAST模型输出框的阈值,低于此值的预测框会被丢弃 | 0.1 |
det_east_nms_thresh | EAST模型输出框NMS的阈值 | 0.2 |
rec_algorithm | 使用的识别算法类型 | CRNN |
rec_model_dir | 识别模型所在文件夹。传参方式有两种,1. None: 自动下载内置模型到 ~/.paddleocr/rec ;2.自己转换好的inference模型路径,模型路径下必须包含model和params文件 | None |
rec_image_shape | 识别算法的输入图片尺寸 | "3,32,320" |
rec_char_type | 识别算法的字符类型,中英文(ch)、英文(en)、法语(french)、德语(german)、韩语(korean)、日语(japan) | ch |
rec_batch_num | 进行识别时,同时前向的图片数 | 30 |
max_text_length | 识别算法能识别的最大文字长度 | 25 |
rec_char_dict_path | 识别模型字典路径,当rec_model_dir使用方式2传参时需要修改为自己的字典路径 | ./ppocr/utils/ppocr_keys_v1.txt |
use_space_char | 是否识别空格 | TRUE |
drop_score | 对输出按照分数(来自于识别模型)进行过滤,低于此分数的不返回 | 0.5 |
use_angle_cls | 是否加载分类模型 | FALSE |
cls_model_dir | 分类模型所在文件夹。传参方式有两种,1. None: 自动下载内置模型到 ~/.paddleocr/cls ;2.自己转换好的inference模型路径,模型路径下必须包含model和params文件 | None |
cls_image_shape | 分类算法的输入图片尺寸 | "3, 48, 192" |
label_list | 分类算法的标签列表 | ['0', '180'] |
cls_batch_num | 进行分类时,同时前向的图片数 | 30 |
enable_mkldnn | 是否启用mkldnn | FALSE |
use_zero_copy_run | 是否通过zero_copy_run的方式进行前向 | FALSE |
lang | 模型语言类型,目前支持 目前支持中英文(ch)、英文(en)、法语(french)、德语(german)、韩语(korean)、日语(japan) | ch |
det | 前向时使用启动检测 | TRUE |
rec | 前向时是否启动识别 | TRUE |
cls | 前向时是否启动分类 (命令行模式下使用use_angle_cls控制前向是否启动分类) | FALSE |
show_log | 是否打印det和rec等信息 | FALSE |
type | 执行ocr或者表格结构化, 值可选['ocr','structure'] | ocr |
结论
真香,后期研究一下如何在自己的数据集上训练模型
参考
- PaddleOCR/whl.md at release/2.3 · PaddlePaddle/PaddleOCR · GitHub
- https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.3/README_ch.md
以上是关于PaddleOCR之安装测试的主要内容,如果未能解决你的问题,请参考以下文章