使用paddlepaddle做OCR识别

Posted 白水baishui

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用paddlepaddle做OCR识别相关的知识,希望对你有一定的参考价值。

1. 环境配置

Python: 使用paddlepaddle需要3.6以上的Python版本

依赖库:

  • pandas,pip install pandas
  • cv2,pip install opencv-python
  • paddlepaddle
    CPU 版本:pip install paddlepaddle -i https://mirror.baidu.com/pypi/simple
    GPU 版本,支持CUDA 10.1:python -m pip install paddlepaddle-gpu==2.1.2.post101 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
    GPU 版本,支持CUDA 10.2:python -m pip install paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple
    GPU 版本,支持CUDA 11.0:python -m pip install paddlepaddle-gpu==2.1.2.post110 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
    GPU 版本,支持CUDA 11.2:python -m pip install paddlepaddle-gpu==2.1.2.post112 -f https://www.paddlepaddle.org.cn/whl/linux/mkl/avx/stable.html
  • paddlehub,pip install paddlehub
  • shapely,pip install shapely
  • pyclipper,pip install pyclipper

2. 代码

import os
import paddlehub as hub
import cv2
from operator import itemgetter

# ------ CUDA 设置 ------ #
os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" # 获取GPU设备
os.environ["CUDA_VISIBLE_DEVICES"] = "0" # 设置GPU编号

# ------ 过滤ocr结果 ------ #
def filter_ocr_results(test_img_path, ocr_results):
    for img_path, result in zip(test_img_path, ocr_results):  # zip 合并两个list
        data = result['data']
        data = sorted(data, key=itemgetter('confidence'), reverse=True) # 按照置信度对list中的dict进行排序,置信度高的排在前面
        for information in data: # 遍历全部识别结果、置信度(即识别结果正确的可能性)、识别框的位置(四个角点的坐标)
            print(information)

if __name__ == "__main__":
    # ------ 更改测试数据 ------ #
    data_path = '1.jpg' # 获取图像文件的相对路径,可以是单张图片,也可以是图片数据集

    # 接将path下所有图片加载
    img_path_list = []
    basedir = os.path.abspath(os.path.dirname(__file__))  # 获取当前文件的绝对路径
    input_path_dir = basedir + '/' + data_path  # 文件夹路径
    img_path_list.append(input_path_dir)
    # 读取测试文件夹中的图片路径
    np_images = [cv2.imread(image_path) for image_path in img_path_list]

    # OCR图片的保存路径,默认设为
    output_path = basedir

    # 输出图像文件路径和结果输出路径
    print("input_path_dir: " + input_path_dir)
    print("output_path: " + output_path)

    # 加载预训练模型
    ocr = hub.Module(name="chinese_ocr_db_crnn_server")

    # 进行OCR识别
    ocr_results = ocr.recognize_text(
        images=np_images,  # 图片数据,ndarray.shape 为 [H, W, C],BGR格式;
        use_gpu=False,  # 是否使用 GPU;若使用GPU,请先设置CUDA_VISIBLE_DEVICES环境变量
        output_dir=output_path,  # 识别结果图片文件的保存路径;
        visualization=True,  # 是否将识别结果保存为图片文件;
        box_thresh=0.0001,  # 检测文本框置信度的阈值,越小识别的内容越多,但也更可能识别出不相关的内容,不可设置为0;
        text_thresh=0.5)  # 识别中文文本置信度的阈值,是指将内容识别为中文字符的阈值参数,由于也需要对英文和数字进行识别,该值不宜过小;
    # 过滤识别结果
    filter_ocr_results(img_path_list, ocr_results)

3. 识别结果

我们用一张图片来进行展示,原图

识别结果

程序输出

'text': '12', 'confidence': 0.9999337792396545, 'text_box_position': [[276, 211], [320, 211], [320, 254], [276, 254]]
'text': 'DAWNRAYS', 'confidence': 0.9993633031845093, 'text_box_position': [[682, 560], [763, 557], [764, 576], [683, 579]]
'text': '宜立舒', 'confidence': 0.9987321496009827, 'text_box_position': [[122, 203], [220, 202], [220, 234], [122, 235]]
'text': '与适宜抗生素合用', 'confidence': 0.9979811906814575, 'text_box_position': [[127, 544], [284, 540], [284, 562], [127, 566]]
'text': '复方雷尼替丁胶囊', 'confidence': 0.9938433170318604, 'text_box_position': [[101, 268], [474, 268], [474, 317], [101, 317]]
'text': '批准文号:国药准字H20030953', 'confidence': 0.9904718995094299, 'text_box_position': [[358, 184], [585, 187], [585, 205], [358, 202]]
'text': '治疗幽门螺旋杆菌感染', 'confidence': 0.9837646484375, 'text_box_position': [[128, 574], [320, 568], [320, 589], [128, 595]]
'text': '十二指肠溃疡', 'confidence': 0.9615536332130432, 'text_box_position': [[126, 515], [246, 512], [246, 534], [126, 537]]
'text': 'Compound RanitidineCapsules', 'confidence': 0.9529160857200623, 'text_box_position': [[99, 329], [475, 326], [475, 350], [99, 353]]
'text': '每粒含盐酸雷尼替丁(以CHNO,S计)', 'confidence': 0.9517455101013184, 'text_box_position': [[373, 221], [581, 223], [581, 241], [373, 239]]
'text': '良性胃溃疡', 'confidence': 0.9417906999588013, 'text_box_position': [[126, 485], [226, 482], [227, 507], [127, 510]]
'text': '适应症:', 'confidence': 0.9281517267227173, 'text_box_position': [[127, 451], [230, 451], [230, 479], [127, 479]]
'text': 'Capsules150mg、枸橡酸秘钾(以餐计)110mg', 'confidence': 0.9192306995391846, 'text_box_position': [[315, 237], [587, 238], [587, 259], [315, 258]]
'text': '东瑞制藥', 'confidence': 0.81662917137146, 'text_box_position': [[683, 535], [763, 533], [764, 559], [684, 561]]

以上是关于使用paddlepaddle做OCR识别的主要内容,如果未能解决你的问题,请参考以下文章

Paddle OCR文字识别学习

基于CRNN的文本字符交易验证码识别--Paddle实战

专栏 | 在PaddlePaddle上实现MNIST手写体数字识别

手写数字识别-paddle版

PaddlePaddle框架学习MNIST手写数字识别

PaddlePaddle 极简入门实践一:手写数字识别