简介:面向离线文字识别场景的 RapidOcr-Onnxruntime 依赖库包,主要服务需要在本地完成 OCR 处理的应用开发者和算法工程人员,尤其适合对数据隐私、网络稳定性有要求的桌面与移动端项目。这份 rar 压缩包共收录 991 个文件,整体大小约 192.61MB,类型覆盖 hpp/h 头文件、cpp 源码、json 配置、cmake 构建脚本、so 动态库、a 静态库、onnx 模型文件以及 bin/o 中间产物,并保留 jar/aar 等平台相关文件,能够为离线文字识别提供较完整的编译与运行基础,也便于理解整个工程化流程。目前已有 1481 人学习浏览,可作为集成部署时的重要参考。使用者可以直接获得 Onnxruntime 运行库、OpenCV 静态库、RapidOcr 模型及配套头文件,免去手动收集依赖、匹配编译环境的重复工作,并据此快速搭建或改造自己的 OCR 服务。文件中保留的构建配置和不同平台产物,也为跨平台移植与二次开发提供了便利。 RapidOcr-Onnxruntime这套离线文字识别依赖库,我先后在Windows和Linux的多个项目里用过。它最大的好处,是把PaddleOCR的模型通过ONNX格式跑在Onnxruntime上,让你的应用在完全离线的环境下也能完成文本检测和识别,安装成本比想象中低很多。如果你有这类需求——比如扫描件本地解析、内网环境里的票据信息提取、或者只是想在自己桌面上跑一个不依赖云端的OCR工具——这篇文章就是按着我实际踩过的坑来写的,重点放在依赖库的安装、集成和排错上。
1. 先搞明白RapidOcr和Onnxruntime的关系
1.1 RapidOCR到底是什么:一个开箱即用的OCR引擎
RapidOCR本质上是PaddleOCR的“模型搬运工”。它把训练好的文本检测、方向分类、文本识别三个模型导出成ONNX格式,再用Onnxruntime做推理,对外提供统一的Python接口。你的项目里不需要装PaddlePaddle,也不需要理解ONNX协议细节,只要调RapidOCR的API,就能拿到文字区域、识别内容和置信度。
三个模型各司其职:检测模型负责把图像里的文字行位置框出来,方向分类模型负责把旋转过或倒置的文字区域摆正,识别模型再把规整后的区域转换成字符串。我平时用RapidOCR处理公司内部的扫描合同和聊天截图,中英文混排的识别准确率在九成以上,已经足够业务使用。
和Tesseract这类传统OCR引擎比,RapidOCR的吸引力在于它提供了一整条完整的现代pipeline。Tesseract单独用的门槛不高,但遇到复杂版面、倾斜文本、模糊截图时,需要额外做很多预处理和后处理;而RapidOCR从检测到识别是打包好的,模型本身也是中文场景训练出来的,对中文文档的友好度高很多。如果你不想再跟Tesseract的字符集训练流程较劲,RapidOCR确实是更省事的方案。
1.2 为什么推理后端选Onnxruntime而不是Paddle或PyTorch
OCR项目最怕依赖复杂。PaddleOCR原版要装PaddlePaddle,GPU环境还要匹配CUDA和cuDNN,版本稍不对就是一堆底层报错;PyTorch虽然生态好,但只为推理一个模型就把整个torch库带上,部署体积直接膨胀。而Onnxruntime是一个轻量级推理引擎,CPU版本安装包只有几十兆,基本没有系统级依赖,跨平台也能保持一致的调用方式。
从性能上看,Onnxruntime在CPU上支持多线程,通过intra_op_num_threads可以控制推理线程数,常规文档识别场景下,单张图通常几百毫秒内就能完成。如果换到GPU机器,安装onnxruntime-gpu后可以走CUDA Execution Provider,识别延迟能进一步降低。对绝大多数离线OCR项目来说,CPU版本已经够用,没必要为了“性能焦虑”提前引入GPU依赖。
Onnxruntime还有一个隐藏优势:跨语言支持。它不仅能跑Python,还有C++、C#、Java等接口,这直接决定RapidOCR能不能嵌入到不同技术栈的业务系统里。我见过有团队先用Python验证效果,再通过Onnxruntime的C++接口把OCR能力集成到桌面程序里,整个切换成本不高。
如果未来要部署到RK3588这类嵌入式平台,也可以考虑用rknn-toolkit2把模型转成RKNN格式,但那属于另一个话题。在x86_64服务器和普通PC上,Onnxruntime是最省心的选择。
2. 离线OCR项目里依赖库的全家桶清单
2.1 核心依赖:onnxruntime、opencv-python、numpy
RapidOCR的推理链路虽然封装得很简单,但真正离不开的核心依赖就三个:
| 依赖库 | 作用 | 安装备注 |
|---|---|---|
| onnxruntime | 加载ONNX模型并执行推理 | GPU机型可替换为onnxruntime-gpu |
| opencv-python | 图像解码、预处理、结果可视化 | 不能和opencv-contrib-python同时装 |
| numpy | 数组运算,识别结果的底层表示 | 通常由其他科学计算包自动依赖 |
这三个包是所有操作的地基。opencv负责把图片从磁盘读进来,转成numpy数组,再交给检测模型;模型输出的原始张量也要靠numpy解析。它们任何一个版本异常,OCR都会以各种莫名其妙的方式罢工。
2.2 文本检测与识别的辅助库:pyclipper、shapely、Pillow
OCR不是把图片丢进模型再吐字符串那么简单。文本检测的后处理要把模型输出的概率图转成多边形,再裁剪出文字区域,这一步在RapidOCR内部依赖两个几何库:pyclipper做多边形裁剪,shapely做空间几何关系计算。比如两个检测框重叠时需要合并,或文字区域边缘不规则时需要优化边界,都靠它们。
另外,部分版本的图像读取流程会用到Pillow,尤其是处理带透明通道的PNG或特殊格式图片时。安装RapidOCR时这些依赖会自动带出来,但排错时你要知道它们的存在。比如Linux下安装shapely偶尔会因为缺少GEOS库报错,这时候不要怀疑OCR代码,先单独装一遍shapely确认环境。
2.3 版本锁定策略:直接照抄requirements.txt的坑
很多教程直接让你执行pip install rapidocr_onnxruntime,这在全新环境里没问题,但如果项目里已有固定版本的opencv或numpy,一键安装很可能会打乱依赖树。我吃过这个亏:原本numpy 1.23的项目,装完RapidOCR后numpy被升到1.26,另一个模块的二进制接口不兼容,启动直接崩溃。
我的建议是在项目源码里单独维护一个requirements-ocr.txt,把关键依赖版本显式锁住:
rapidocr_onnxruntime==1.3.24 onnxruntime==1.16.3 opencv-python==4.8.1.78 numpy==1.26.4 shapely==2.0.3这样即使以后整体环境升级,OCR相关依赖也不会被连带升级。如果你是以依赖库形式对外提供OCR能力,更要把版本声明写进README,否则下游项目很容易因为间接依赖冲突找上来。
3. Windows/Linux双平台依赖安装实录
3.1 Windows下最省事的安装顺序
Windows上安装这套依赖库其实没什么玄学,关键是顺序和隔离。先创建虚拟环境,别图省事装进系统Python:
python -m venv ocr_env ocr_env\Scripts\activate pip install onnxruntime==1.16.3 opencv-python==4.8.1.78 numpy==1.26.4 pip install rapidocr_onnxruntime==1.3.24先装核心依赖再装RapidOCR,是为了让pip能感知已有版本,避免它自作主张升级已经装好的包。如果下载速度不理想,可以临时指定国内镜像源,比如-i https://pypi.tuna.tsinghua.edu.cn/simple,但不要全局改配置文件,否则可能影响其他项目的安装行为。
装完以后,立刻跑一个最小测试,用十行代码确认import onnxruntime和from rapidocr_onnxruntime import RapidOCR都正常。只有这条链路通了,再往后接业务代码。
3.2 Linux下容易出问题的共享库和pip换源
Linux的问题主要不在pip,而在系统层。opencv-python在导入时需要libGL.so.1和libglib-2.0.so.0,很多精简服务器上没有这两个库,导入时直接报错。解决办法是先安装系统包:
sudo apt update sudo apt install -y libgl1 libglib2.0-0另外,Linux下pip默认连接官方源可能很慢,换成阿里云或清华的镜像没问题,但注意镜像地址必须写对。有人把源配成了http而不是https,或者用了失效路径,终端就会一直卡住不往下走。这种问题跟OCR本身无关,却最容易让人误以为是依赖库安装失败。
如果运行时报缺少.so文件,使用ldd定位是最快的:
ldd /usr/lib/python3/dist-packages/onnxruntime/capi/onnxruntime_pybind11_state.so哪一行显示not found,就补哪个系统库,比盲目重装整个环境高效得多。
3.3 显卡用户的特殊处理:onnxruntime-gpu与CUDA版本匹配
如果你的机器有NVIDIA显卡,想用GPU加速,必须安装onnxruntime-gpu而不是onnxruntime。这里最容易踩的坑是版本匹配:onnxruntime-gpu 1.16通常对应CUDA 11.8加cuDNN 8.x,1.17之后开始支持CUDA 12。版本不对,运行时会直接报错。
一个简单的诊断方式:
import onnxruntime print(onnxruntime.get_device()) print(onnxruntime.get_available_providers())如果get_device()返回CPU,get_available_providers()里也没有CUDAExecutionProvider,说明GPU环境没打通,多半是CUDA动态库找不到。调试这类问题时要记住,它不是代码写错了,而是运行环境没配对。
3.4 模型文件与离线打包:依赖库的另一半
RapidOCR默认情况下会自动下载模型,但离线环境根本无法联网。所以第一次运行前,你要手动把三个.onnx模型文件放到固定目录,比如项目下建一个models文件夹,然后在初始化时通过参数指定路径。这样断网能用,团队分发也方便。
离线打包时,除了Python代码和业务资源,模型目录、onnxruntime动态库、opencv相关文件都要一起带走。我的习惯是先用PyInstaller打成单目录包,再人工验证目标机器上缺少哪些库。这比只用onnxruntime独立DLL再手动注册要省心。
4. 把RapidOcr-Onnxruntime嵌进业务系统的正确姿势
4.1 初始化引擎实例:参数含义与线程控制
把RapidOCR当成依赖库集成时,初始化代码通常很简单:
from rapidocr_onnxruntime import RapidOCR ocr = RapidOCR( det_use_cuda=False, cls_use_cuda=False, rec_use_cuda=False, print_verbose=False, )这几个参数分别控制检测、方向分类、识别三个模型是否使用GPU。默认是False,也就是全CPU推理。print_verbose=False可以关掉运行时的日志输出,服务端长期运行时很关键,否则日志会被刷屏。
如果想进一步控制CPU推理线程数,可以改onnxruntime的全局配置。实测下来,线程数从1调到4,单张图的识别速度能提升不少,但超过8以后收益就很有限,反而会引入线程切换开销。如果业务是并发请求,建议设置一个独立线程池调用OCR,避免多个线程同时抢同一个推理会话。
4.2 读取一张图的核心代码:从图像加载到结构化输出
初始化之后,识别一张图片只需要一行调用:
result, elapse_list = ocr("test.png")result是列表,每一项包含文本框四点坐标、识别文本、置信度。拿到这个结构后,可以直接做后续业务判断,比如区域筛选、关键词提取。下面这段是常见遍历方式:
if result: for box, text, score in result: print("识别文本:", text) print("置信度:", score) # box是四边形的四个角点,可用于绘制位置 else: print("未识别到文字")我在项目里通常把OCR封装成一个独立服务,输入图片路径或base64,输出JSON。业务侧完全不知道OCR底层的依赖是什么,后续换引擎或者升级版本,只需要改服务内部。
4.3 以依赖库形式交付时该打包哪些文件
这里的依赖库有两层含义:一是RapidOCR本身依赖了哪些第三方库,二是你把OCR能力封装好后,下游项目需要引入哪些文件。如果是前者,交付方式就是通过pip依赖声明,让下游自动安装;如果是后者,你可以把OCR封装成独立Python包,在setup.py里声明install_requires。
特别要注意模型文件的处理:尽量把模型文件打进包的数据目录,而不是让下游用户自己下载。模型加起来一般不到20兆,对大多数项目来说完全能接受。打包时记得在包描述里写清楚初始化参数和离线要求,否则下游用户直接调用会发现模型路径不对。
5. 依赖安装与运行期的高频报错排查手册
5.1 onnxruntime 5060:CUDA库加载失败,其实不是代码问题
我见过很多同学一遇到以“5060”结尾的报错就以为是代码问题,实际上这个错误码在onnxruntime里通常意味着底层动态库加载失败,尤其是CUDA相关库。典型报错长这样:
onnxruntime.capi.onnxruntime_pybind11_state.Fail: [ONNXRuntimeError] : 5060
排查时不要先去翻模型代码,先确认三件事:第一,当前安装的是onnxruntime还是onnxruntime-gpu;第二,CUDA、cuDNN版本是否和onnxruntime要求匹配;第三,系统能否找到CUDA动态库。Linux下可以临时设置export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH再跑一次。如果只是普通文档识别需求,直接换成CPU版本,这个问题就完全消失。
5.2 chromadb backend init failed与onnxruntime python package:被无关项目干扰时的判断思路
有一次我在一个已有环境里装OCR依赖,安装过程没报错,但运行其他项目时突然出现:
chromadb backend init failed, falling back: the onnxruntime python package is not installed
一开始很慌,以为把OCR环境搞坏了。后来排查才发现,这是另一个组件在使用ChromaDB时对onnxruntime依赖的探测失败,和RapidOCR本身没有关系。这种现象在同时装了好几个AI库的环境里很常见,某个库会把显式依赖的onnxruntime降级或移除,导致另一个库启动异常。
正确的做法是先确认报错来源。用pip show onnxruntime看版本,用pipdeptree查看依赖树,不要盲目卸载重装。这类问题的根本解是环境隔离,一个项目一个虚拟环境,哪怕只是验证demo,也不要偷懒共用环境。
5.3 缺libstdc++等系统库:Linux下的ldd诊断法
Linux服务器上导入onnxruntime或opencv时还可能遇到libstdc++.so.6: cannot open shared object file这类报错。这种问题经常出现在系统GCC版本偏低的环境,Python的许多二进制扩展要求较新的libstdc++。
用ldd定位缺失是最快的方式。先找到对应.so文件的路径,执行ldd,看哪些依赖标着not found,再用apt安装对应运行库。如果你用的是conda环境,还可以通过conda install libstdcxx-ng更新库版本。这个排查法能覆盖大多数“编译好但运行时缺库”的怪问题。
5.4 模型文件路径与下载失败的处理
离线部署时,模型文件路径是另一个高频坑。RapidOCR初始化时如果找不到模型,不一定立刻报错,而是在第一次调用ocr()时才抛出异常,错误信息还很隐晦。我的做法是在程序启动阶段就主动检查模型文件是否存在、大小是否合理,避免运行到一半才发现资源缺失。
如果模型文件是从网上下载的,记得校验文件完整性。ONNX模型一旦内容不完整,加载阶段不会报错,推理结果却会完全不对。最稳妥的方式是在README里附上文件MD5,集成方下载完先校验一遍。
最后分享一个我自己的习惯:无论是新机器还是新环境,我永远会先建一个干净虚拟环境,把rapidocr_onnxruntime、onnxruntime、opencv-python装好,跑通最简demo,再开始写业务代码。依赖库这种东西,大部分时间不是功能不行,而是环境串味,尤其是onnxruntime这种自带原生动态库的包,版本一变,问题就藏得非常深。希望这份依赖库排查心得能帮你少走点弯路。
本文还有配套的精品资源,点击获取