【pytorch】OCR



2022年10月22日    Author:Guofei

文章归类: 0x26_torch    文章编号: 274

版权声明:本文作者是郭飞。转载随意,但需要标明原文链接,并通知本人
原文链接:https://www.guofei.site/2022/10/22/ocr.html


理论

分为多个模型

  • CTPN 用来检测文字位置
  • CRNN 用来检测文字内容

CTPN

Detecting Text in Natural Image with Connectionist Text Proposal Network pdf

  • 通常文本从左到右,
  • 且水平,
  • 且字之间的宽度大致相同。但是文本高度需要算法来检测

CTPN的结构:VGG提取特征,BLSTM融入上下文信息,RPN完成检测

CTPN1

  • VGG
    • 经过了4次池化,特征图1个像素对应原始16个像素
    • 论文早于 RCNN,因此选的是传统的 VGG
  • 最后一个模块
    • 目标:找到正确的候选框。(候选框宽度固定为16,但高度和垂直位置不一样;长度共10个,k=10)
    • 2k scores:单个切片对应k个候选框,每个候选框对应文字or背景两种,所以是2k个
    • 2k vertical coordinates:每个框也对应两个数:中心位置、框的高度,所以也是2k个
    • k side-refinement:边界位置。一串文字,其结尾不会正好和切片一致,需要调整位置。

CRNN

CRNN1

CTC模块:对其输入输出结果

CTC

easyocr

  • https://github.com/JaidedAI/EasyOCR
  • 基于 torch 的项目
  • 用GPU性能尚可,用CPU性能很差

pip install easyocr

import easyocr
reader = easyocr.Reader(['ch_sim','en'],model_storage_directory='./ocr_model')
# , gpu=False  似乎性能差了10倍以上

result = reader.readtext('a.png')

# 省略坐标信息
reader.readtext('b.png', detail = 0)

paddleocr

# pip install paddlepaddle-gpu
pip install paddlepaddle
pip install paddleocr
paddleocr --image_dir ./img/a.png --use_angle_cls true --use_gpu false

python

from paddleocr import PaddleOCR

# lang = `ch`, `en`, `fr`, `german`, `korean`, `japan` 等等
ocr = PaddleOCR(use_angle_cls=True, lang="ch")
img_path = './a.jpg'
result = ocr.ocr(img_path, cls=True)
for line in result:
    print(line)

问题

tools.infer 找不到

  • 原因:PaddleOCR 的一个子模块叫 tools,但系统已经安装了其它名叫 tools 的包,
  • 解决(不优雅):
    • 把项目下载下来,之后导入这个项目,而不是安装
    • pip install -r requirements.txt
    • import imp; imp.find_module('tools') 找到 tools 安装路径,然后用 rm -rf tools 删掉,这样 PaddleOCR.tools 就生效了

模型文件

  • 默认存在 ~/.paddleocr/,如果服务器不能连接外网,就复制进去

paddlehub

安装

!pip install paddlehub --upgrade -i https://pypi.tuna.tsinghua.edu.cn/simple
#该Module依赖于第三方库shapely、pyclipper,使用该Module之前,请先安装shapely、pyclipper
!pip install shapely -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install pyclipper -i https://pypi.tuna.tsinghua.edu.cn/simple
!pip install paddlepaddle
# !pip install  paddlepaddle-gpu

显示图片

import matplotlib.pyplot as plt
import matplotlib.image as mpimg

# 待预测图片,似乎不支持 png
test_img_path = ["a.jpg"]

# 展示其中广告信息图片
img1 = mpimg.imread(test_img_path[0])
plt.figure(figsize=(10,10))
plt.imshow(img1)
plt.axis('off')
plt.show()

加载模型

import paddlehub as hub

# 加载移动端预训练模型
ocr = hub.Module(name="chinese_ocr_db_crnn_mobile")
# 服务端可以加载大模型,效果更好
# ocr = hub.Module(name="chinese_ocr_db_crnn_server")

预测

import cv2

# 读取测试文件夹test.txt中的照片路径
np_images =[cv2.imread(image_path) for image_path in test_img_path]

results = ocr.recognize_text(
                    images=np_images,         # 图片数据,ndarray.shape 为 [H, W, C],BGR格式;
                    use_gpu=False,            # 是否使用 GPU;若使用GPU,请先设置CUDA_VISIBLE_DEVICES环境变量
                    output_dir='ocr_result',  # 图片的保存路径,默认设为 ocr_result;
                    visualization=True,       # 是否将识别结果保存为图片文件;
                    box_thresh=0.5,           # 检测文本框置信度的阈值;
                    text_thresh=0.5)          # 识别中文文本置信度的阈值;

for result in results:
    data = result['data']
    save_path = result['save_path']
    for infomation in data:
        print('text: ', infomation['text'], '\nconfidence: ', infomation['confidence'], '\ntext_box_position: ', infomation['text_box_position'])

参考资料

  • Detecting Text in Natural Image with Connectionist Text Proposal Network pdf
  • B站教学视频 重点:66/67 节

您的支持将鼓励我继续创作!