paddleocr图片文本识别
1. paddleocr
PaddleOCR 是一个基于 PaddlePaddle 深度学习框架的开源 OCR(Optical Character Recognition,光学字符识别)工具。它提供了一系列的预训练模型和工具,可以用于文本检测、文本识别和文本方向检测等任务。 提供了易于使用的 Python API,可以轻松地在你的项目中集成和使用。它还支持 CPU 和 GPU 加速,并且提供了一些预训练模型供你选择使用,或者你也可以根据自己的需求训练自定义的模型。
PaddleOCR 的功能包括:
文本检测:检测图像中的文本区域,并给出其边界框。
文本识别:识别文本区域中的文字内容。
文本方向检测:检测文本区域的方向(水平、垂直、逆时针旋转、顺时针旋转等)。
2. paddleocr安装
paddleocr是基于 PaddlePaddle 框架开发的,因此在使用 PaddleOCR 之前是需要先安装paddlepaddle的。
pip install paddleocr
3. 识别图片文本
import cv2 #2使用ocr from paddleocr import PaddleOCR ocr = PaddleOCR(use_angle_cls=True, lang='ch')#第一次运行会自动下载模型,默认下载到工作目录的,ch是中文模型,也能检测英文 # 读取图片 img_path = 'ocr.jpeg'#带文本的图片 img = cv2.imread(img_path)
#如果识别不准,可以添加均值或高斯模糊来去噪
img = cv2.GaussianBlur(img, (5, 5), 0)#先模糊,去除噪声 # 执行文字检测和识别 result = ocr.ocr(img) # 绘制结果 for line in result:print(line)#如[[[[13.0, 15.0], [261.0, 8.0], [262.0, 51.0], [14.0, 58.0]], ('CMIITTD', 0.8830805420875549)]],文本区域的框的四个顶点坐标,文本内容及置信度 for word in line: print(word[-1][0])#CMIITTD print(word[-1][1])#0.8830805420875549
如果已经下载好了模型,直接实例化PaddleOCR时,指定模型路径
import cv2 from paddleocr import PaddleOCR ''' 代码中,如果没有明确指定保存路径,模型文件将被保存在user/admin目录的 .paddleocr 文件夹下。 ''' det_model_dir=r'C:\Users\admin\.paddleocr\whl\det\ch\ch_PP-OCRv4_det_infer'#文本位置检测模型 rec_model_dir=r'C:\Users\admin\.paddleocr\whl\rec\ch\ch_PP-OCRv4_rec_infer'#文本识别模型 cls_model_dir=r'C:\Users\admin\.paddleocr\whl\cls\ch_ppocr_mobile_v2.0_cls_infer'#文本方向分类模型 #2使用ocr from paddleocr import PaddleOCR # 创建 PaddleOCR 实例 ocr = PaddleOCR(use_angle_cls=True, lang='ch', det_model_dir=det_model_dir, rec_model_dir=rec_model_dir, cls_model_dir=cls_model_dir) # 读取图片 img_path = 'ocr.jpeg'#带文本的图片 img = cv2.imread(img_path) # 执行文字检测和识别 result = ocr.ocr(img) # 绘制结果 for line in result:print(line)#如[[[[13.0, 15.0], [261.0, 8.0], [262.0, 51.0], [14.0, 58.0]], ('CMIITID', 0.8830805420875549)]] for word in line: print(word[-1][0])#CMIITID print(word[-1][1])#0.8830805420875549

具体其他更多详细信息可以下载项目后,看里面的文档介绍,地址如下:
PaddleOCR的GitHub地址:https://github.com/PaddlePaddle/PaddleOCR
PaddleOCR的Gitee地址:https://gitee.com/paddlepaddle/PaddleOCR
关于更多的其他语言或版本的模型下载地址可以下载github项目后,找到paddleocr.py文件,里面列出了很多,比如部分如下:
MODEL_URLS = { 'OCR': { 'PP-OCRv4': { 'det': { 'ch': { 'url': 'https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar', }, 'en': { 'url': 'https://paddleocr.bj.bcebos.com/PP-OCRv3/english/en_PP-OCRv3_det_infer.tar', }, 'ml': { 'url': 'https://paddleocr.bj.bcebos.com/PP-OCRv3/multilingual/Multilingual_PP-OCRv3_det_infer.tar' } }, 'rec': { 'ch': { 'url': 'https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar',
或者访问https://github.com/PaddlePaddle/PaddleOCR/blob/release/2.6/doc/doc_ch/models_list.md
4.补充
对于目前新版的paddleocr,如3.3.2版本,传入的参数名有些变化,包括输出的结构,这里给出我使用时的测试代码。
import cv2 ''' doc_orientation_classify_model_name=None, doc_orientation_classify_model_dir=None, doc_unwarping_model_name=None, doc_unwarping_model_dir=None, text_detection_model_name=None, text_detection_model_dir=None, textline_orientation_model_name=None, textline_orientation_model_dir=None, textline_orientation_batch_size=None, text_recognition_model_name=None, text_recognition_model_dir=None, text_recognition_batch_size=None, use_doc_orientation_classify=None, use_doc_unwarping=None, use_textline_orientation=None, text_det_limit_side_len=None, text_det_limit_type=None, text_det_thresh=None, text_det_box_thresh=None, text_det_unclip_ratio=None, text_det_input_shape=None, text_rec_score_thresh=None, return_word_box=None, text_rec_input_shape=None, lang=None, ocr_version=None, ''' ''' https://paddleocr.bj.bcebos.com/PP-OCRv4/english/en_PP-OCRv4_rec_train.tar ''' def get_image_paths(folder_path, extension=".png", is_use_extension=False): image_paths = [] # 遍历目录 for root, dirs, files in os.walk(folder_path): for file in files: # 检查文件扩展名 if file.endswith(extension) or is_use_extension == False: # 构造完整的文件路径并添加到列表 image_path = os.path.join(root, file) image_paths.append(image_path) return image_paths import os textline_orientation_model_dir=r'ocr_model\textline_cls\PP-LCNet_x1_0_textline_ori_infer' text_detection_model_dir=r'ocr_model\det\PP-OCRv5_server_det_infer' text_recognition_model_dir=r'ocr_model\rec\PP-OCRv5_server_rec_infer' # Initialize PaddleOCR instance from paddleocr import PaddleOCR ocr = PaddleOCR( textline_orientation_model_dir=textline_orientation_model_dir, text_detection_model_dir=text_detection_model_dir, #None text_recognition_model_dir=text_recognition_model_dir, use_doc_orientation_classify=False, use_doc_unwarping=False, use_textline_orientation=True) if __name__ == '__main__': folder = r'ocr_image' image_paths=get_image_paths(folder) for image_path in image_paths: image=cv2.imread(image_path,1) #### image=cv2.cvtColor(image, cv2.COLOR_BGR2RGB) # ### image=cv2.resize(image,None,fx=1.5,fy=1.5,interpolation=cv2.INTER_LINEAR) result = ocr.predict(image) print(type(result),len(result)) ''' print(result[0]['rec_texts']) #['SS14F'] print(result[0]['textline_orientation_angles']) #[0] ['登机牌', 'BOARDING', 'PASS', '日期DATE', '舱位', 'CLASS', '序号', 'SERIALNO.', '座位号', 'SEAT NO.', '航班FLIGHT', 'MU 2379 03DEC', 'W', '035', '始发地', 'FROM', '登机口', 'GATE', '登机时间', 'BDT', '目的地TO', '福州', 'TAIYUAN', 'G11', 'FUZHOU', '身份识别IDNO.', '姓名NAME', 'ZHANGQIWEI', '票号TKTNO.', '张祺伟', '票价FARE', 'ETKT7813699238489/1', '登机口于起飞前1O分钟关闭GATESCLOSE1OMINUTESBEFORE DEPARTURETIME'] [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] ''' print(result[0].keys()) #dict_keys(['input_path', 'page_index', 'doc_preprocessor_res', 'dt_polys', 'model_settings', 'text_det_params', 'text_type', 'text_rec_score_thresh', 'return_word_box', 'rec_texts', 'rec_scores', 'rec_polys', 'vis_fonts', 'textline_orientation_angles', 'rec_boxes']) if len(result)>0: print("image_path",image_path) # if 'rec_texts' in result[0].keys() and 'textline_orientation_angles' in result[0].keys(): # print(result[0]['rec_texts']) #输出图片所有文本为['登机牌', 'BOARDING', 'PASS', '日期DATE', '舱位', 'CLASS', '序号', ...] print(result[0]['rec_scores']) #[0.9971120953559875, 0.9802943468093872, 0.9757575988769531, 0.9982829093933105, 0.999272346496582, 0.9847620129585266, print("左上角坐标",result[0]['rec_boxes'][0][0],result[0]['rec_boxes'][0][1])#打印第一个text的左上角坐标 print("右下角坐标",result[0]['rec_boxes'][0][2],result[0]['rec_boxes'][0][3])#打印第一个text的右下角坐标 print(result[0]['textline_orientation_angles'][0])#0 输出第一个文本的角度 print(len(result[0]['rec_boxes'])) #33个文本 # print(result[0]['dt_polys']) print(result[0]['textline_orientation_angles']) #[0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] #[0] 0度 文本方向正常(没有旋转) 1 180度 文本上下颠倒(倒置) 2 90度 文本顺时针旋转90度 3 270度 文本逆时针旋转90度 else: print("识别有问题", image_path) else: print("识别有问题",image_path)
这里放一个测试用的图。

小结:简单使用paddleocr及官方自带的预训练模型来识别印刷体的文本,识别结果较好。如果识别结果不满意或是存在错误,自己可以在此基础上取训练自己的数据集,这里不讲解,另外paddleocr检测的边界框位置信息是整个文本区域的边界框,好像不能得到单个字符的边界框信息,如果有知道如何得到单个字符边界信息,可以留言。后面补充的是新版的paddleocr,本文补充的部分使用的模型可以参考文章最后的链接地址下载也可以通过下方的百度网盘下载。
通过网盘分享的文件:ocr_model.zip
链接: https://pan.baidu.com/s/1RcM1tV9k4iVNG6dwCOkkog 提取码: 4jiy
不足或错误之处,欢迎指正与评论,谢谢!
参考资料:
https://www.cnblogs.com/xiaoxia722/p/14627482.html
http://www.paddleocr.ai/latest/version3.x/pipeline_usage/OCR.html#1-ocr

浙公网安备 33010602011771号