一、案例背景
在实际教学、办公及政务系统中,纸质材料(如手写作文、表格、试卷等)仍广泛存在。为提升信息处理效率,采用 OCR(Optical Character Recognition)技术将图像中的文字提取为可编辑文本已成为刚需。
本项目基于开源深度学习库 PaddleOCR,构建了一个轻量级的图像文字识别工具,能够自动识别图像中的中文文本,并提供置信度评估和可视化支持。该工具特别适用于作业扫描图像中的内容提取场景,便于后续分析、存档或自动批改。
二、技术架构与实现方案
1. 技术选型
组件 | 工具/库 | 说明 |
---|---|---|
OCR引擎 | PaddleOCR | 百度开源的中文文本识别框架,支持多语言、多角度、多段文字识别 |
图像处理 | PIL(Pillow) | 图像加载与绘制框,用于标记识别区域 |
环境支持 | Conda + Paddle 环境 | 配置 DLL 依赖,保证在 Windows 系统上正常运行 |
2. 核心流程图
┌────────────┐│ 输入图像路径 │└─────┬──────┘│┌───────▼────────┐│ 加载 PaddleOCR 模型 │└───────┬────────┘│┌───────▼─────────────┐│ ocr.predict(图像路径) │└───────┬─────────────┘│┌───────▼────────────┐│ 提取文本、置信度、位置 │└───────┬────────────┘│┌─────────▼──────────────┐│ 可视化标记文字与边框框选 │└─────────┬──────────────┘│┌────▼────┐│ 显示结果 │└─────────┘
三、开发环境搭建
本例我们使用anaconda创建开发环境。具体步骤如下:
(1)新建环境
conda create -n paddle_env python=3.10 -y
conda activate paddle_env
(2)安装cudatoolkit
conda install cudatoolkit=11.8 -c conda-forge
(3)安装cudnn
conda install cudnn=8.9.* -c conda-forge
(4)安装paddlepaddle
conda install paddlepaddle-gpu==3.0.0 paddlepaddle-cuda=11.8 -c paddle -c nvidia
(5)Paddleocr 安装
pip install paddleocr -i Simple index
(6)指定 DLL 路径
在开发实践中发现,用anaconda单独安装的cudatoolkit在程序运行时居然找不到,于是在代码中增加:
dll_path = r"C:\Users\39040\.conda\envs\paddle_env\Library\bin"
os.environ["PATH"] = dll_path + ";" + os.environ["PATH"]
目的是将指定的 DLL 路径添加到系统的环境变量 PATH
中,以确保在运行 Python 时,能够成功加载某些依赖的动态链接库(.dll
文件)。
三、代码关键解析
1. OCR 模型初始化
ocr = PaddleOCR(use_textline_orientation=True, lang='ch')
-
lang='ch'
:指定中文识别模型。 -
use_textline_orientation=True
:自动校正图像中文字的方向,增强识别准确率,适用于手写或旋转图像。
2. OCR 识别执行
result = ocr.predict(image_path)
返回结果 result[0]
为一个字典对象,包含:
-
rec_texts
:识别的文字内容列表 -
rec_scores
:每条文字识别的置信度评分 -
rec_polys
:对应的文本框坐标,用于可视化绘图
3. 识别结果输出
for idx, (text, score) in enumerate(zip(texts, scores)):print(f"[{idx + 1}] 文字:{text} 置信度:{score:.2f}")
结构清晰地打印识别文本,方便人工复核与评估。
4. 可视化文字框与内容
draw_ocr_custom(image, boxes, texts, scores, font_path='simfang.ttf')
通过 PIL.ImageDraw
实现红色多边形边框和文字叠加,提供强直观反馈,便于查看识别准确性与位置匹配。
5.完整代码
本例的完整代码如下:
from paddleocr import PaddleOCR
from PIL import Image, ImageDraw, ImageFont
import osdll_path = r"C:\Users\39040\.conda\envs\paddle_env\Library\bin" #换成自己电脑中的环境的实际路径。
os.environ["PATH"] = dll_path + ";" + os.environ["PATH"]def draw_ocr_custom(image, boxes, texts, scores, font_path=None):draw = ImageDraw.Draw(image)font = ImageFont.truetype(font_path, 20) if font_path else Nonefor box, text, score in zip(boxes, texts, scores):box = [tuple(point) for point in box]draw.polygon(box, outline='red')draw.text(box[0], f'{text} {score:.2f}', fill='red', font=font)return image# 初始化 OCR
ocr = PaddleOCR(use_textline_orientation=True, lang='ch') # 新版本使用该参数# 图像路径
image_path = 'D:\\test\\1.jpg' #换成自己电脑的图像实际路径。if not os.path.exists(image_path):raise FileNotFoundError(f"图片文件不存在: {image_path}")# 执行 OCR 识别
result = ocr.predict(image_path)# 获取识别数据(注意 result 是列表)
result_data = result[0]
texts = result_data['rec_texts']
scores = result_data['rec_scores']
boxes = result_data['rec_polys']# 输出识别结果
print("📝 作业识别结果:\n")
for idx, (text, score) in enumerate(zip(texts, scores)):print(f"[{idx + 1}] 文字:{text} 置信度:{score:.2f}")# 可视化
image = Image.open(image_path).convert('RGB')
drawn_img = draw_ocr_custom(image, boxes, texts, scores, font_path='simfang.ttf')
drawn_img.show()
四、应用场景与扩展建议
1.应用场景
-
作业、试卷批改系统的文字识别与对比分析;
-
图书馆数字化管理中的图片转文字;
-
政务文件 OCR 归档;
-
票据识别与数据采集;
2.可扩展功能
功能 | 描述 |
---|---|
批量识别 | 支持整个目录下图片的自动批处理 |
格式化导出 | 支持将识别结果输出为 Excel、JSON、Word 等格式 |
文本纠错 | 加入语言模型辅助优化识别错误(如错别字校正) |
手写优化 | 替换模型为专门优化手写体的 PP-OCRv3 模型 |
五、运行效果
1.手写作文识别
(1)小孩的手写作文拍照如下:
(2)识别的可视化效果如下:
(3)提取的文字效果如下:
2.数学作业识别
(1)小孩的手写数学作业拍照如下:
(2)识别的可视化效果如下:
(3)提取的内容效果如下:
六、总结与评价
该案例展示了基于 PaddleOCR 框架实现中文图像文字识别的完整流程,具备如下特点:
-
高准确率:在常规印刷和清晰手写场景中表现优秀;
-
可复用性强:代码结构清晰,便于集成到教学或业务系统;
-
可视化支持:提供实时图像标注,助力人工复核和验证。