如何高效使用cnocr:竖排简繁中文识别全流程指南

如何高效使用cnocr:竖排简繁中文识别全流程指南

一、cnocr库简介与竖排识别核心挑战

cnocr是基于PyTorch框架开发的开源OCR工具,专注于中文场景识别,尤其针对古籍、书法、对联等竖排文本场景优化。其核心优势在于支持多语言混合识别(简/繁/日/韩)及版面自适应能力,但竖排识别需特殊参数配置。

竖排文本识别面临三大挑战:

  1. 方向性:字符排列方向与常规横排相反,需模型具备方向感知能力
  2. 字符间距:竖排文本行间距不均,易导致字符粘连
  3. 语言混合:古籍中常见简繁混用,需模型具备语言自适应能力

二、环境准备与依赖安装

1. 系统要求

  • Python 3.7+
  • PyTorch 1.8+(推荐CUDA 11.x)
  • OpenCV 4.5+
  • 推荐Linux/macOS系统,Windows需配置WSL2

2. 安装步骤

  1. # 创建虚拟环境(推荐)
  2. python -m venv cnocrenv
  3. source cnocrenv/bin/activate # Linux/macOS
  4. # cnocrenv\Scripts\activate # Windows
  5. # 安装cnocr(含预训练模型)
  6. pip install cnocr[all] # 包含所有语言模型
  7. # 或精简安装(仅简繁中文)
  8. pip install cnocr[chinese-simplified-chinese-traditional]

3. 模型下载验证

安装后自动下载默认模型(densenet_lite_136-gru),可通过以下代码验证:

  1. from cnocr import CnOcr
  2. ocr = CnOcr()
  3. print(f"已加载模型:{ocr.model_name}") # 应输出模型名称

三、竖排识别核心参数配置

1. 关键参数说明

参数 类型 默认值 竖排识别建议值 作用
context str ‘cpu’ ‘cuda’(如可用) 加速推理
rec_model_name str ‘densenet_lite_136-gru’ 保持默认 识别模型
det_model_name str ‘ch_PP-OCRv3_det’ 保持默认 检测模型
vertical_text bool False True 启用竖排模式
lang str ‘ch_sim’ ‘ch_sim’或’ch_tra’ 语言类型
merge_lines bool True False 竖排禁用行合并

2. 参数配置示例

  1. from cnocr import CnOcr
  2. # 简体中文竖排配置
  3. ocr_sim = CnOcr(
  4. vertical_text=True, # 关键参数
  5. lang='ch_sim',
  6. merge_lines=False, # 禁用行合并
  7. context='cuda' # GPU加速
  8. )
  9. # 繁体中文竖排配置
  10. ocr_tra = CnOcr(
  11. vertical_text=True,
  12. lang='ch_tra',
  13. rec_model_name='densenet_lite_136-gru-ft', # 繁体专用微调模型
  14. merge_lines=False
  15. )

四、完整识别流程实现

1. 图像预处理

  1. import cv2
  2. import numpy as np
  3. def preprocess_image(img_path):
  4. # 读取图像(保持原始方向)
  5. img = cv2.imread(img_path)
  6. if img is None:
  7. raise ValueError("图像加载失败")
  8. # 转换为RGB(cnocr默认输入格式)
  9. img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
  10. # 二值化(可选,增强对比度)
  11. gray = cv2.cvtColor(img_rgb, cv2.COLOR_RGB2GRAY)
  12. _, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
  13. return binary # 或直接返回img_rgb

2. 批量识别实现

  1. def recognize_vertical_text(img_path, ocr_engine):
  2. """
  3. 竖排文本识别主函数
  4. :param img_path: 图像路径
  5. :param ocr_engine: 配置好的CnOcr实例
  6. :return: 识别结果列表,每个元素为(文本, 位置, 置信度)
  7. """
  8. try:
  9. img = preprocess_image(img_path)
  10. # 关键调用:识别时无需特殊参数,依赖预配置的vertical_text=True
  11. results = ocr_engine.ocr(img)
  12. # 竖排结果处理:按y坐标排序(从顶到底)
  13. sorted_results = sorted(results, key=lambda x: x[0][1]) # x[0]为坐标,x[0][1]为y坐标
  14. # 提取文本和置信度
  15. text_results = [(res[1], res[2]) for res in sorted_results] # (文本, 置信度)
  16. return text_results
  17. except Exception as e:
  18. print(f"识别错误:{str(e)}")
  19. return []

3. 完整调用示例

  1. # 初始化识别器
  2. ocr_sim = CnOcr(vertical_text=True, lang='ch_sim', merge_lines=False)
  3. # 识别简体中文竖排文本
  4. img_path = 'vertical_ch_sim.jpg'
  5. results = recognize_vertical_text(img_path, ocr_sim)
  6. # 输出结果
  7. for idx, (text, conf) in enumerate(results, 1):
  8. print(f"行{idx}: {text} (置信度: {conf:.2f})")

五、高级优化技巧

1. 模型微调(针对特定场景)

  1. from cnocr.utils import train_helper
  2. # 示例:使用自定义数据集微调
  3. train_helper.train(
  4. model_name='densenet_lite_136-gru',
  5. lang='ch_sim',
  6. train_data_dir='./custom_train_data',
  7. val_data_dir='./custom_val_data',
  8. epochs=20,
  9. batch_size=16
  10. )

数据集要求

  • 图像格式:JPG/PNG
  • 标注格式:每行一个文本框,格式为x1,y1,x2,y2,文本

2. 多语言混合识别

  1. # 启用简繁混合识别(需下载多语言模型)
  2. ocr_mixed = CnOcr(
  3. vertical_text=True,
  4. lang='mixed', # 自动识别简繁
  5. rec_model_name='densenet_lite_136-gru-multilang'
  6. )

3. 后处理增强

  1. def postprocess_results(raw_results):
  2. """
  3. 后处理:
  4. 1. 过滤低置信度结果
  5. 2. 合并连续相同字符(修复分词错误)
  6. """
  7. processed = []
  8. for text, conf in raw_results:
  9. if conf > 0.7: # 置信度阈值
  10. # 简单去重示例(实际需更复杂逻辑)
  11. if len(processed) > 0 and processed[-1][0] == text:
  12. continue
  13. processed.append((text, conf))
  14. return processed

六、常见问题解决方案

1. 识别乱码问题

  • 原因:模型未适配竖排或语言设置错误
  • 解决
    • 确认vertical_text=True
    • 检查lang参数是否匹配(ch_sim/ch_tra
    • 尝试更换模型(如densenet_lite_136-gru-ft

2. 性能优化建议

场景 优化方案 效果
高分辨率图像 提前缩放至1500px以下 速度提升40%
批量处理 使用ocr.ocr_for_single_lines() 内存占用降低60%
GPU加速 确保context='cuda' 推理速度提升5-10倍

3. 版本兼容性问题

  • cnocr v2.0+ 才支持竖排识别
  • 检查版本:
    1. import cnocr
    2. print(f"当前版本:{cnocr.__version__}") # 需≥2.0.0

七、完整代码示例

  1. from cnocr import CnOcr
  2. import cv2
  3. def main():
  4. # 1. 初始化识别器
  5. ocr = CnOcr(
  6. vertical_text=True,
  7. lang='ch_sim', # 或'ch_tra'
  8. merge_lines=False,
  9. context='cuda' if cv2.cuda.getCudaEnabledDeviceCount() > 0 else 'cpu'
  10. )
  11. # 2. 加载图像
  12. img_path = 'example_vertical.jpg'
  13. img = cv2.imread(img_path)
  14. if img is None:
  15. raise FileNotFoundError("图像未找到")
  16. # 3. 识别(自动应用竖排配置)
  17. results = ocr.ocr(img)
  18. # 4. 后处理与输出
  19. sorted_results = sorted(results, key=lambda x: x[0][1]) # 按y坐标排序
  20. for i, (bbox, text, conf) in enumerate(sorted_results, 1):
  21. print(f"识别结果{i}:")
  22. print(f" 文本: {text}")
  23. print(f" 位置: {bbox}")
  24. print(f" 置信度: {conf:.2f}\n")
  25. if __name__ == '__main__':
  26. main()

八、总结与扩展建议

  1. 竖排识别核心:必须设置vertical_text=True并禁用merge_lines
  2. 语言选择:简体中文用ch_sim,繁体中文用ch_tra,混合场景用mixed
  3. 性能优化:GPU加速、图像缩放、批量处理可显著提升效率
  4. 扩展应用:可结合版面分析(如ppocr)实现复杂文档解析

通过以上流程,开发者可高效实现古籍、书法等竖排文本的精准识别。实际项目中,建议构建包含500+样本的微调数据集以进一步提升特定场景准确率。