本文档记录了VisCGEC项目的主要开发历程、技术选择和性能优化过程。
- 目标:构建端到端的中文OCR文本纠错系统
- 主要挑战:OCR识别准确性、文本纠错质量、处理效率
- 应用场景:文档数字化、学术研究、实际业务场景
- 采用流水线架构,拆分为独立模块
- 选择基于深度学习的OCR和文本纠错模型
- 设计可扩展的数据处理流程
项目开发过程中持续进行性能评估,从初始的0.2776分逐步提升至0.5102分,主要改进阶段:
- 0.2776:初始BERT模型实现,基础OCR处理
- 0.4975:引入更优的OCR模型和初步纠错策略
- 0.4982:优化数据清洗流程,提升输入质量
- 0.5036:集成GOT-OCR模型,提高复杂场景识别能力
- 0.5051:优化PaddleOCR配置,提升基础识别准确率
- 0.5053:改进文本分句策略,增强上下文理解
- 0.5102:最终版本,优化prompt设计和模型集成策略
项目经历了多次OCR引擎迭代选择:
早期阶段:
- 初始使用基于BERT的简单OCR模型,限于资源约束,识别效果一般(评分约0.27)
- 测试了多种开源OCR方案,包括Tesseract、EasyOCR等
中期发展:
- 引入GOT-OCR模型,针对中文文档场景进行了优化(评分提升至0.49+)
- GOT-OCR在特定场景(如手写体、不规则排版)表现较好,但通用性存在挑战
最终选择:
- 最终采用PaddleOCR,兼顾了识别准确率、处理速度和易用性
- 在PaddleOCR基础上进行了定制化修改,特别优化了中文场景(评分达到0.51+)
- 保留了GOT-OCR作为特定场景的补充方案
经过性能测试,从PaddleOCR提供的多个模型中选择了以下配置:
det_model_dir="models/PaddleOCR/ppstructure/inference/PP-OCRv5_server_det_infer"
rec_model_dir="models/PaddleOCR/ppstructure/inference/PP-OCRv5_server_rec_infer"
rec_char_dict_path="models/PaddleOCR/ppocr/utils/ppocrv5_dict.txt"
table_model_dir="models/PaddleOCR/ppstructure/inference/ch_ppstructure_mobile_v2.0_SLANet_infer"主要优化点:
- 使用服务器端模型代替移动端模型,提高识别精度
- 使用PP-OCRv5版本,相比v3版本提升了约5%的识别准确率
- 定制中文字典,扩展特殊字符和专业术语的支持
对PaddleOCR的预测系统进行了定制化修改:
- 修改了
predict_system_enhanced.py以优化处理流程- 该文件需放置在
models/PaddleOCR/ppstructure/目录下 - 主要修改:将表格识别结果统一转换为图像类型,避免表格结构识别错误
- 核心代码修改:
for reg in layout_res: if reg["label"] == "table": # 把任何 table 统统改成 figure reg["label"] = "figure"
- 该文件需放置在
- 调整了文本行合并策略,提高了复杂版面的识别效果
- 优化了检测框过滤逻辑,减少噪声检测
实现了多GPU并行处理机制:
- 使用ProcessPoolExecutor实现GPU级并行
- 使用ThreadPoolExecutor实现单GPU内的任务并行
- 自适应负载均衡,根据GPU数量动态分配任务
为提高中文识别准确率,定制了专用字典:
- 在
ppocrv5_dict.txt中增加了常见中文错误对应字符 - 确保字典文件放置在正确路径:
models/PaddleOCR/ppocr/utils/ppocrv5_dict.txt
评估了多种中文文本纠错模型:
- BERT-based模型:轻量但效果有限(初始阶段使用,评分约0.27-0.30)
- 传统规则+统计模型:速度快但准确率不足(评分约0.35-0.40)
- T5/BART类生成模型:在中小规模测试中表现较好(评分约0.42-0.45)
- GPT类大模型:效果最佳但资源消耗大且只能使用api调用(评分0.48+)
最终选择了ChineseErrorCorrector2-7B作为主要纠错模型:
- 基于LLaMA-2的中文优化版本
- 针对中文语法错误和OCR错误进行了特殊训练
- 7B参数量在单GPU上有较好的推理性能与效果平衡
对模型prompt进行了精细调优:
self.prompt = "你是一个文本纠错专家,纠正输入句子中的语法、拼写、标点错误,并输出语义通顺的句子,输入句子为:"主要优化点:
- 明确角色定位("文本纠错专家")增强模型在特定任务的表现
- 明确纠错范围("语法、拼写、标点错误")提高纠错针对性
- 强调输出要求("语义通顺")确保纠错结果的自然流畅
- 简洁指令设计,避免冗长prompt导致的注意力分散
为解决大模型上下文长度限制问题,实现了基于语义的分句策略:
- 使用chinese-roberta-wwm-ext模型进行语义化分句
- 考虑句子间语义连贯性,避免机械分割导致的上下文丢失
- 实验证明,分句处理后的纠错效果显著优于整段文本直接处理
- 分句策略使评分从0.5053提升到0.5102
- 实现了自适应对比度增强
- 添加了噪点消除和边缘增强
- 优化了文档图像的二值化处理
- 设计了基于置信度的文本过滤
- 实现了特殊字符规范化处理
- 添加了文本段落合并逻辑
针对大模型上下文长度限制,开发了智能分句机制:
- 使用chinese-roberta-wwm-ext作为分句模型
- 基于语义特征而非简单标点符号进行分句
- 保持句子上下文连贯性,避免语义割裂
- 对文本进行初步分割,得到候选句子
- 利用Transformer模型提取每个句子的语义向量
- 基于语义相似度判断句子间的关联强度
- 将语义相关性高的短句合并,确保上下文完整
- 控制最终句子长度不超过模型处理能力(约100-150字)
- 设计了自动化流水线脚本
pipeline.sh - 实现了日志记录和错误处理机制
- 支持单模块独立运行和完整流程执行
- 设计了多指标评估体系,基于标准校对指标
- 在标准测试集上进行了对比测试,记录不同版本性能:
- 0.2776:初始版本基准性能
- 0.4975:引入优化OCR模型后的提升
- 0.4982:加入数据清洗策略后的改进
- 0.5036:优化OCR引擎配置后的提升
- 0.5051:改进表格识别处理后的性能
- 0.5053:优化文本预处理后的效果
- 0.5102:引入分句策略与prompt优化后的最终性能
- 持续优化模型配置,实现了超过84%的相对性能提升