RapidOCR 古籍识别实战:从竖排文字 OCR 扫描到可读文本
【免费下载链接】RapidOCR📄 Awesome OCR multiple programing languages toolkits based on ONNX Runtime, OpenVINO, MNN, PaddlePaddle, TensorRT and PyTorch.项目地址: https://gitcode.com/GitHub_Trending/ra/RapidOCR
RapidOCR 是一套支持 ONNX Runtime、OpenVINO、PaddlePaddle 等多种推理后端的开源 OCR 工具。本文以古籍 OCR 为背景,从实操者视角讲清三件事:竖排文字识别怎么跑起来、翻车时调哪些参数、哪些场景不必硬上。
先还原两个真实翻车现场
第一批翻车来自一沓泛黄带污渍的手稿扫描,正文从右往左竖排。默认流程直接跑,检测把相邻两栏合并成一个框,左侧细栏整条漏掉,识别输出不是乱码就是半截。第二个现场是繁体正文夹杂日文注脚的一页:繁体字被读成形近的简体,注脚日文直接输出乱串。
这两类问题不是"OCR 做不了古籍",而是默认参数按现代横排文档调的,古籍页面要单独处理。
安装并跑通第一页
先安装:
pip install rapidocr onnxruntime再用仓库自带测试图跑四行代码:
from rapidocr import RapidOCR ocr = RapidOCR() result = ocr("python/tests/test_files/issue_170.png") print(result.txts, result.scores)首次运行会自动下载对应模型到 python/rapidocr/models 目录;如需查阅源码,可克隆仓库 https://gitcode.com/GitHub_Trending/ra/RapidOCR 。
竖排检测参数怎么调、结果怎么读
竖排支持靠哪三步
流程是文本检测 → 方向分类 → 字符识别。古籍页面上,det 把每一竖排检成一个瘦高框;python/rapidocr/utils/process_img.py 里的裁剪步骤先把框透视矫正为水平条带,若条带高宽比 ≥ 1.5(明显是竖条),就旋转 90° 让竖排变横排再进识别;随后 cls 按 config 里的label_list: ["0", "180"]判定方向,把旋转后仍倒着的栏翻回来。所谓"竖排识别",就是裁剪旋转 + 方向分类 + 横排识别模型的组合,并没有独立的竖排模型。
config.yaml 里最常动的参数
都在 python/rapidocr/config.yaml 中,古籍场景最常碰这几个:
Det.box_thresh/Det.thresh:框置信度与二值图阈值,默认 0.5 和 0.3Det.unclip_ratio:检测框扩张比例,默认 1.6Det.limit_side_len:推理前短边尺寸,默认 736Global.text_score:识别置信度过滤线,默认 0.5
另外Global.use_vertical_padding默认开启,对宽高远超 8:1 或高度不足 30 像素的图片做上下补边,属于极端比例扫描页的兜底。
结果字段怎么核对
返回值里result.txts、result.scores、result.boxes三者一一对应。加return_word_box=True可拿到字级框,python/tests/test_return_word.py 里有现成竖排用例:测试图 text_vertical_words.png 期望逐字输出"已取之時不參一人見而"。想肉眼核对框的位置,可用 CLI 的-vis参数存标注图,或用 python/rapidocr/utils/ 下的 to_json / to_markdown 直接导出。
要留意一点:输出顺序是检测顺序,不等于古籍从右往左的阅读顺序,栏序需要自己按框的 x 坐标排序。
上图这类旋转 180° 的页面正是 cls 环节的职责:方向分低于cls_thresh(默认 0.9)时保留原方向,足够高则翻转后再进识别。
症状 → 手段:三个高频坑位 🔧
坑位一:低分辨率模糊页漏字
扫描只有百余 DPI 时,模型输入本来就是糊的;预处理还会把长边压到Global.max_side_len(默认 2000),超清扫描件同样丢细节。对策分两步:原图尚可但检测"看不见"细栏时,调大Det.limit_side_len给检测器更大输入;原图很大时,调大Global.max_side_len避免过度缩小。调多少取决于页面尺寸,小批量试错是常态。
坑位二:繁体模型如何选择(繁简混排、日文混排)
默认识别模型是简体 ch 词表。纯繁体古籍改用params={"Rec.lang_type": "chinese_cht"},走独立繁体模型(python/rapidocr/default_models.yaml 中的 chinese_cht 条目);繁体占比高、版式杂的文献古籍,python/tests/test_rec_language.py 给了现成组合:Rec.lang_type = "ch_doc"加 server 档识别模型,它是带独立文献字典的 ch_doc 模型。中日混排页则先看默认配置——当前版本默认走 PP-OCRv6 多语言模型(模型名带multi_前缀),先按默认跑,个别日文行仍乱再单独把Rec.lang_type切到japan。
坑位三:置信度偏低怎么调
score 低于text_score(默认 0.5)的整行会被直接过滤。担心漏行时,临时把Global.text_score降到 0.3 附近看全量再人工核对;担心误检则反向调高。注意阈值分两层:det 层的box_thresh/thresh决定"这一栏能不能被检出",rec 层的 score 决定"这一行字认得多有把握"。漏栏是检测问题,乱字是识别问题,分开调才有用。
RapidOCR 适合与不适合哪些古籍
适合:字迹尚清晰的竖排单栏扫描(简体、繁体均可),中日混排,横排现代文档,需要字级框、JSON / Markdown 导出的流程,以及多后端部署——onnxruntime、openvino、mnn、paddle、tensorrt、pytorch 后端齐全,见 python/rapidocr/inference_engine/ 目录。
不适合:残损严重、笔画缺失和透墨重的页面,隶书、行草等古典手写体与印章;也不负责阅读顺序还原——它只输出文字与框,从右往左的栏序、表格和多栏混排布局都要自己后处理。别指望置信度过滤替代人工校对,它只是帮你把低分行挑出来。
古籍数字化里,RapidOCR 省时间的地方是竖排流水线与字级框,省不掉的是栏序排序和人工核对。先用默认参数跑一小批页面,再按上面的症状逐项调参,能避开大半弯路。
【免费下载链接】RapidOCR📄 Awesome OCR multiple programing languages toolkits based on ONNX Runtime, OpenVINO, MNN, PaddlePaddle, TensorRT and PyTorch.项目地址: https://gitcode.com/GitHub_Trending/ra/RapidOCR
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考