PaddleOCR实战:5分钟搞定批量图片文字识别并导出TXT(附完整代码)
PaddleOCR实战:5分钟搞定批量图片文字识别并导出TXT(附完整代码)
在数字化办公和智能信息处理的时代,批量图片文字识别(OCR)已成为提升工作效率的刚需。无论是处理扫描文档、发票归档,还是从社交媒体图片中提取文字,快速准确的OCR工具都能节省大量人工录入时间。本文将手把手教你使用PaddleOCR这一国产开源神器,实现从零配置到批量识别的全流程自动化,特别针对实际开发中常见的路径处理和结果合并问题提供优化方案。
1. 环境配置与工具选型
PaddleOCR作为百度飞桨生态下的明星项目,以其轻量级模型和出色的中文识别能力著称。最新发布的PP-OCRv3版本,在保持模型体积仅8.1M的同时,中文场景识别准确率提升至79%。与Tesseract等传统OCR工具相比,它对复杂背景、模糊文字和特殊排版具有更好的适应性。
基础环境准备:
# 创建Python虚拟环境(推荐3.7+版本) python -m venv paddle_env source paddle_env/bin/activate # Linux/Mac # paddle_env\Scripts\activate # Windows # 安装核心依赖 pip install paddlepaddle==2.4.2 -i https://mirror.baidu.com/pypi/simple pip install paddleocr shapely pyclipper opencv-python提示:若遇到Shapely库安装报错,可到https://www.lfd.uci.edu/~gohlke/pythonlibs/ 下载预编译的whl文件手动安装
针对不同使用场景,PaddleOCR提供两种模型选择:
| 模型类型 | 体积 | 适用设备 | 识别速度(CPU) | 准确率 |
|---|---|---|---|---|
| ch_PP-OCRv3 | 8.1M | 移动端 | 28ms/图 | 78.4% |
| ch_PP-OCRv3_rec | 86M | 服务器 | 65ms/图 | 82.1% |
2. 单张图片识别原型开发
我们先从基础的单图识别开始,验证环境配置的正确性。新建demo.py文件,输入以下测试代码:
from paddleocr import PaddleOCR import cv2 # 初始化OCR实例(首次运行会自动下载模型) ocr = PaddleOCR( use_angle_cls=True, # 启用方向分类器 lang="ch", # 中文模型 use_gpu=False # 根据实际情况调整 ) # 测试图片路径 img_path = "test.jpg" # 执行识别 result = ocr.ocr(img_path, cls=True) # 可视化结果 image = cv2.imread(img_path) boxes = [line[0] for line in result[0]] texts = [line[1][0] for line in result[0]] scores = [line[1][1] for line in result[0]] for box, text in zip(boxes, texts): cv2.rectangle(image, (int(box[0][0]), int(box[0][1])), (int(box[2][0]), int(box[2][1])), (0,255,0), 2) cv2.putText(image, text, (int(box[0][0]), int(box[0][1])-10), cv2.FONT_HERSHEY_SIMPLEX, 0.8, (0,0,255), 2) cv2.imwrite("result.jpg", image) print("识别结果:", texts)这段代码会输出识别文字内容,并在原图上标注识别区域。常见问题排查:
- 模型下载失败:手动下载模型放到
~/.paddleocr/whl/目录 - 文字方向错误:确保
use_angle_cls=True已开启 - 漏识别小文字:调整
det_db_box_thresh参数(默认0.5)
3. 批量处理与结果导出
实际项目中往往需要处理成百上千的图片,我们开发自动化流水线。新建batch_process.py:
import os from paddleocr import PaddleOCR from tqdm import tqdm class BatchOCR: def __init__(self): self.ocr = PaddleOCR(use_angle_cls=True, lang="ch") def process_folder(self, input_dir, output_file): """批量处理文件夹中的所有图片""" supported_formats = ('.jpg', '.jpeg', '.png', '.bmp') image_files = [f for f in os.listdir(input_dir) if f.lower().endswith(supported_formats)] with open(output_file, 'w', encoding='utf-8') as f_out: for img_file in tqdm(image_files, desc="Processing"): img_path = os.path.join(input_dir, img_file) result = self.ocr.ocr(img_path, cls=True) # 按行合并识别结果 texts = [line[1][0] for line in result[0]] combined_text = ' '.join(texts) # 写入结果:文件名|识别文本 f_out.write(f"{img_file}|{combined_text}\n") if __name__ == "__main__": processor = BatchOCR() processor.process_folder("./input_images", "./output/results.txt")性能优化技巧:
- 多进程处理(适合CPU密集型任务):
from multiprocessing import Pool def process_single(args): img_path, ocr = args result = ocr.ocr(img_path, cls=True) return (img_path, ' '.join([line[1][0] for line in result[0]])) # 在process_folder方法中使用 with Pool(processes=4) as pool: results = pool.map(process_single, [(os.path.join(input_dir, f), self.ocr) for f in image_files])- 内存优化配置:
self.ocr = PaddleOCR( det_model_dir='lite_det', # 使用轻量检测模型 rec_model_dir='lite_rec', cls_model_dir='lite_cls', use_tensorrt=True # 启用TensorRT加速(需GPU) )4. 高级应用与异常处理
面对复杂场景时,需要针对性优化识别流程。以下是三个典型场景的解决方案:
场景一:表格数据识别
# 表格识别专用配置 table_ocr = PaddleOCR( det_algorithm='Table', rec_algorithm='SVTR', table_max_len=488, merge_no_span_structure=True ) # 后处理表格结构 def parse_table_result(result): from paddlenlp import Taskflow table_task = Taskflow("table_question_answering") return table_task({"image": result})场景二:低质量图片增强
import cv2 import numpy as np def preprocess_image(img_path): img = cv2.imread(img_path) # 自适应二值化 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) thresh = cv2.adaptiveThreshold(gray, 255, cv2.ADAPTIVE_THRESH_GAUSSIAN_C, cv2.THRESH_BINARY, 11, 2) # 锐化处理 kernel = np.array([[-1,-1,-1], [-1,9,-1], [-1,-1,-1]]) sharpened = cv2.filter2D(thresh, -1, kernel) return sharpened常见异常处理方案:
- 内存溢出:分批次处理大图,设置
det_limit_side_len=960 - 漏识别:调整
det_db_thresh=0.3降低检测阈值 - 错误合并:禁用自动合并
use_dilate=False
5. 工程化部署方案
将OCR能力集成到生产环境时,推荐以下三种部署方式:
方案A:Flask REST API
from flask import Flask, request, jsonify app = Flask(__name__) ocr = PaddleOCR() @app.route('/ocr', methods=['POST']) def api_ocr(): file = request.files['image'] img_bytes = file.read() result = ocr.ocr(img_bytes) return jsonify({"text": [line[1][0] for line in result[0]]}) if __name__ == '__main__': app.run(host='0.0.0.0', port=5000)方案B:Docker容器化
FROM python:3.8-slim RUN pip install paddleocr flask gunicorn COPY app.py . CMD ["gunicorn", "-b", "0.0.0.0:8000", "app:app"]方案C:定时任务自动化
import schedule import time def daily_ocr_job(): processor = BatchOCR() processor.process_folder( "/mnt/nas/new_scans", f"/output/results_{time.strftime('%Y%m%d')}.txt" ) schedule.every().day.at("02:00").do(daily_ocr_job) while True: schedule.run_pending() time.sleep(60)在实际项目中,我们团队处理过日均10万+图片的票据识别系统,通过合理配置线程池和异步队列,将平均处理时间控制在3秒/张以内。关键点在于:
- 采用Redis作为任务队列
- 实现断点续处理机制
- 添加自动重试策略
- 部署多个worker实例负载均衡
