1.前言
接上一篇博客,咋们继续说,前面我们已经成功的在 Pycharm 中配置好了 Conda 虚拟环境,接下来我们就要进行编码了,实现传入一张带有文字的图片,把其中的文字识别并提取出来。
2.示例代码
新建一个 ocr.py 的 Python 脚本,里面封装两个函数,一个函数的作用是“识别图片文字信息”,另一个函数的作用是“用检测框框选文字,生成新的图片”。代码如下:
ocr.py
import os
from PIL import Image
from datetime import datetime
from paddleocr import PaddleOCR, draw_ocr
'''
use_angle_cls=True:表示在进行文本识别时,也会对文本的角度进行分类。如果文本存在倾斜或旋转,此参数可以帮助准确识别文本的方向。
use_gpu=True:表示使用 GPU 来加速文本识别的过程。在计算资源足够的情况下,使用 GPU 可以显著提高 OCR 的处理速度。
lang="ch":表示指定 OCR 工具要识别的语言为中文(Chinese),即进行中文文本的识别。
drop_score=0.8:设定置信度阈值,低于该阈值的部分将被丢弃。
'''
ocr = PaddleOCR(use_angle_cls=True, use_gpu=True, lang='ch', drop_score=0.8)
def recognize_text(img_path, det=True, rec=True, cls=True, bin=False, inv=False, alpha_color=(255, 255, 255)):
"""
识别图片文字信息。
:param img_path: 表示待处理的输入图片路径
:param det: 是否进行文本检测,默认为 True,即进行文本检测
:param rec: 是否进行文本识别,默认为 True,即进行文本识别
:param cls: 是否进行文本分类,默认为 True,即进行文本分类
:param bin: 是否将图像进行二值化处理,默认为 False,即不进行二值化处理
:param inv: 是否将图像进行反转处理,默认为 False,即不进行反转处理
:param alpha_color: 文本区域的背景色,默认为 (255, 255, 255),表示白色
:return: 图片上的文字信息
"""
return ocr.ocr(img_path, det, rec, cls, bin, inv, alpha_color)
def generate_image(img_path, result):
"""
用检测框框选文字,生成新的图片。
:param img_path: 图片路径
:param result: 图片上的文字信息
"""
result = result[0]
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]
# 如果本地没有simfang.ttf,可以在doc/fonts目录下下载
im_show = draw_ocr(image, boxes, txts, scores, font_path='simfang.ttf')
im_show = Image.fromarray(im_show)
# 获取当前日期
now = datetime.now()
year = now.year
month = now.month
day = now.day
# 创建文件夹
folder_path = f'images/ocrImages/{year}/{month:02d}/{day:02d}'
os.makedirs(folder_path, exist_ok=True)
# 创建文件名
image_name = 'ocr_' + os.path.basename(img_path)
im_show.save(f'{folder_path}/{image_name}')
另外再新建一个 main.py 的 Python 脚本,来调用 ocr.py 脚本中的函数。传入一个图片地址,得到 OCR 识别结果。代码如下:
main.py
from ocr import recognize_text, generate_image
if __name__ == '__main__':
path = 'E:\\Python\\workspace-myself\\vap-paddle-ocr\\images\\ca39e5e76622757260fcb0fa4e793ea0.jpg'
# 识别图片文字信息
result = recognize_text(img_path=path)
for idx in range(len(result)):
res = result[idx]
for line in res:
print(line)
# 用检测框框选文字,生成新的图片
generate_image(img_path=path, result=result)
3.运行程序
3.1.报错解决
运行报错,NameError: name 'predict_system' is not defined。
D:\anaconda3\envs\paddle_env\python.exe D:\Python\workspace\PaddleOCR\PaddleOCR\main.py
Traceback (most recent call last):
File "D:\Python\workspace\PaddleOCR\PaddleOCR\main.py", line 1, in <module>
from ocr import recognize_text, generate_image
File "D:\Python\workspace\PaddleOCR\PaddleOCR\ocr.py", line 5, in <module>
from paddleocr import PaddleOCR, draw_ocr
File "D:\anaconda3\envs\paddle_env\lib\site-packages\paddleocr\__init__.py", line 14, in <module>
from .paddleocr import *
File "D:\anaconda3\envs\paddle_env\lib\site-packages\paddleocr\paddleocr.py", line 575, in <module>
class PaddleOCR(predict_system.TextSystem):
NameError: name 'predict_system' is not defined
解决方法:修改源码 D:\anaconda3\envs\paddle_env\lib\site-packages\paddleocr\paddleocr.py 的 54 行和 575 行。
54 行修改为:
from ppstructure.predict_system import StructureSystem, save_structure_res, to_excel,TextSystem
575 行修改为:
class PaddleOCR(TextSystem):
3.2.运行结果
在第一次成功运行的时候,会下载三个压缩文件:
D:\anaconda3\envs\paddle_env\python.exe D:\Python\workspace\PaddleOCR\PaddleOCR\main.py
download https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_det_infer.tar to C:\Users\Administrator/.paddleocr/whl\det\ch\ch_PP-OCRv4_det_infer\ch_PP-OCRv4_det_infer.tar
100%|██████████| 4.89M/4.89M [00:07<00:00, 643kiB/s]
download https://paddleocr.bj.bcebos.com/PP-OCRv4/chinese/ch_PP-OCRv4_rec_infer.tar to C:\Users\Administrator/.paddleocr/whl\rec\ch\ch_PP-OCRv4_rec_infer\ch_PP-OCRv4_rec_infer.tar
100%|██████████| 11.0M/11.0M [00:10<00:00, 1.01MiB/s]
download https://paddleocr.bj.bcebos.com/dygraph_v2.0/ch/ch_ppocr_mobile_v2.0_cls_infer.tar to C:\Users\Administrator/.paddleocr/whl\cls\ch_ppocr_mobile_v2.0_cls_infer\ch_ppocr_mobile_v2.0_cls_infer.tar
100%|██████████| 2.19M/2.19M [00:03<00:00, 711kiB/s]
识别结果:
[[[12.0, 287.0], [191.0, 287.0], [191.0, 308.0], [12.0, 308.0]], ('有时候我可以看得很淡然', 0.995914876461029)]
[[[11.0, 308.0], [207.0, 308.0], [207.0, 328.0], [11.0, 328.0]], ('有时候我又执着得有些不堪', 0.98055100440979)]
这两个 PaddleOCR 的识别结果分别包含了文字区域的坐标以及识别到的文字及其置信度。
1)第一个结果:
• 文字区域的坐标是 [[12.0, 287.0], [191.0, 287.0], [191.0, 308.0], [12.0, 308.0]],表示识别到的文字所在的矩形区域的四个顶点的坐标。
• 识别到的文字及其置信度是 ('有时候我可以看得很淡然', 0.995914876461029),表示在识别到的文字区域内,识别到的文字内容是"有时候我可以看得很淡然",其置信度为0.9959。
2)第二个结果:
• 文字区域的坐标是 [[11.0, 308.0], [207.0, 308.0], [207.0, 328.0], [11.0, 328.0]],同样表示识别到的文字所在的矩形区域的四个顶点的坐标。
• 识别到的文字及其置信度是 ('有时候我又执着得有些不堪', 0.98055100440979),表示在识别到的文字区域内,识别到的文字内容是"有时候我又执着得有些不堪",其置信度为0.9805。
原图片:
PaddleOCR识别后图片:
4.总结
大家喜欢的话,给个👍,点个关注!后续继续跟大家分享!
评论