理论
分为多个模型
- CTPN 用来检测文字位置
- CRNN 用来检测文字内容
CTPN
Detecting Text in Natural Image with Connectionist Text Proposal Network pdf
- 通常文本从左到右,
- 且水平,
- 且字之间的宽度大致相同。但是文本高度需要算法来检测
CTPN的结构:VGG提取特征,BLSTM融入上下文信息,RPN完成检测
- VGG
- 经过了4次池化,特征图1个像素对应原始16个像素
- 论文早于 RCNN,因此选的是传统的 VGG
- 最后一个模块
- 目标:找到正确的候选框。(候选框宽度固定为16,但高度和垂直位置不一样;长度共10个,k=10)
- 2k scores:单个切片对应k个候选框,每个候选框对应文字or背景两种,所以是2k个
- 2k vertical coordinates:每个框也对应两个数:中心位置、框的高度,所以也是2k个
- k side-refinement:边界位置。一串文字,其结尾不会正好和切片一致,需要调整位置。
CRNN
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'])