news 2026/10/3 7:28:10

离线 OCR 实测:单张 2.5 秒里检测占 2.39 秒,最短边调小后 0.41 秒

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
离线 OCR 实测:单张 2.5 秒里检测占 2.39 秒,最短边调小后 0.41 秒

离线识别现在不需要任何接口。一条 pip 命令装完,31.76 MB 的模型已经躺在包目录里,我把代理环境变量指到一个不存在的端口,识别照样跑,中文 OCR 走本地这条路是通的。

但装上不等于能用。我在本机(WSL,分到 2 核,3.8 GB 内存)用 5 张自渲染的中文卡片跑了 12 档降质条件,实测下来:默认参数单张 900×258 的卡片要 2.49 秒,其中 2.39 秒花在检测上;把检测的最短边下限从 736 调到 224,同一张图掉到 0.41 秒,字准确率没变。反过来,重模糊图上默认参数是最差的一档,一张 3 行的卡片 0 行都没检出来。

装完包里有什么

装的是一套 ONNX 推理的 OCR 工具库,检测、方向分类、识别三个模型都是小的那一档,随 wheel 一起分发。体积账目如下,都是装完后实测的。

项目体积说明
rapidocr 3.9.2 的 wheel27.3 MB单个 whl,纯 Python
装完的包目录33.1 MB除代码外含 3 个 onnx
检测模型 PP-OCRv6_det_small9.93 MB找文字框
识别模型 PP-OCRv6_rec_small21.23 MB认字
方向分类 ch_ppocr_mobile_v2.0_cls_mobile0.59 MB判断有没有 180 度倒置
依赖(rapidocr 自身除外)265.5 MBopencv_python 121.2、numpy 71.4、onnxruntime 68.2、pyclipper 3.7

离线这件事是验证过的:把 HTTP 和高低代理环境变量都指到 127.0.0.1:1,加载模型时只打印 “File exists and is valid”,然后识别出 3 行,耗时 2883 ms。模型文件在包的 models 目录里,只有换成包里没带的档位才会去下载。

默认参数里真正影响结果的就这么几个,都取自包内 config.yaml:

参数默认值作用
Det.limit_side_len / limit_type736 / min图像最短边不足 736 就整体放大
Global.max_side_len2000最长边超过就整体缩小
Det.thresh / box_thresh0.3 / 0.5文字区域二值化与文本框置信门槛
Det.unclip_ratio1.6文本框外扩比例
Global.text_score0.5低于这个分数的识别结果直接丢
Rec.rec_batch_num6识别一次喂几行
Det / Rec 版本与档位PP-OCRv6 small另有 v4、v5 三代和 tiny、medium 档

跑一张图

调用只有三行,返回值里带着每一行的置信度和各阶段耗时。

fromrapidocrimportRapidOCR engine=RapidOCR()# 默认 PP-OCRv6 small,模型在包的 models 目录里out=engine("imgs/card1.png")fort,sinzip(out.txts,out.scores):print(round(float(s),3),t)print("阶段耗时(秒):",[round(x,3)forxinout.elapse_list])

本机真实输出:

0.997 把离线识别接进截图流程 1.0 模型随安装包分发,不用联网 0.934 一张 900×300 的卡片不到 1 秒跑完 阶段耗时(秒): [2.533, 0.003, 0.144]

三段耗时对应检测、方向分类、识别。第一次调用会带上模型加载,2.69 秒;之后稳定在 2.49 秒。也就是说这张卡片的 2.5 秒里,检测吃掉 96%,方向分类 3 毫秒,识别 144 毫秒。

检测为什么吃掉 2.39 秒

看它的预处理就明白了:min 模式下,图像最短边不足 limit_side_len 就按比例放大,再把高宽取整到 32 的倍数。900×258 的卡片会被放大到 2560×736,像素量变成原来的 8.1 倍;字号小的图更夸张。

输入图原图最短边 736(默认)最短边 320最短边 224
28 px 卡片900×2582560×736,8.1 倍像素1120×320,1.5 倍896×256,1.0 倍
12 px 卡片900×1564256×736,22.3 倍1856×320,4.2 倍1280×224,2.0 倍
缩到 33% 的卡片297×852560×736,74.6 倍1120×320,14.2 倍768×224,6.8 倍
手机长截图1080×16081088×1600,1.0 倍同左同左

顺着这张表往下调,同一批卡片的耗时是这样的(每档跑 2 次取最快):

最短边下限28 px 卡片单图12 px 卡片单图两张的字准确率
736(默认)2468 ms4014 ms100% / 100%
4801193 ms1748 ms100% / 100%
320579 ms842 ms100% / 100%
224411 ms454 ms100% / 100%
160409 ms283 ms100% / 100%

736 到 224,28 px 卡片快了 6 倍,准确率一分没掉。默认这档是给整页扫描件准备的,截图、界面图、卡片图这类文字本来就大的输入,把最短边降下来更划算。长截图则完全不受这个参数影响,最短边 1080 本来就超过 736。

十二档降质:汉字一个没错,掉的全是标点

测试集是 5 张 900 像素宽的卡片,用微软雅黑渲染,每张 3 行中文,混了日期、英文和标点。字准确率 = 1 - 编辑距离(真值, 识别) / 真值字符数,比对前去空白;每个条件 5 张图共 217 个字。

条件检出行数字准确率单图最快
原图 28 px15/15100.00%2488 ms
字号 20 px15/15100.00%3038 ms
字号 14 px15/1599.08%3784 ms
字号 12 px15/1599.54%4054 ms
字号 10 px15/15100.00%4381 ms
整图缩到 50%15/1599.54%2451 ms
整图缩到 33%15/15100.00%2462 ms
JPEG 质量 2015/1598.16%2457 ms
模糊 σ=1.215/15100.00%2472 ms
模糊 σ=2.415/15100.00%2450 ms
旋转 3°15/15100.00%2466 ms
浅灰字 #96969615/15100.00%2470 ms

所有非 100% 的分数都来自同一件事:把全角括号写成了半角,把全角冒号写成半角,把“RapidOCR 3.9.2”中间的空格吃掉。逐条对过原始输出,这一批 217 个字里没有一个汉字被认错。真拿识别结果做关键词检索的话,标点归一化这一步省不掉,不然查“(甲)”永远命中不了。

还有一个反直觉的地方:字号越小反而越慢。12 px 卡片 4014 ms,比 28 px 卡片慢了六成,因为最短边被撑到 736 时放大倍数更大,检测输入从 2560×736 涨到 4256×736。想省时间,先看放大倍数,别只看文件大小。

重模糊图上默认参数最差,模型也不是越大越好

把高斯模糊加到 σ=4.0,结果翻了个面:默认的 736 下,3 张卡片里两张 0 行、一张只认出 1 个字;最短边降到 224 反而捡回来大部分。每张图每档各跑 2 次,两次结果完全一致。

最短边下限σ=3.0 三张卡(字准确率)σ=4.0 三张卡(字准确率)
736(默认)100% / 98.31% / 100%1 行只认出 1 字 / 0 行 / 0 行
48095.24% / 100% / 97.22%69.05% / 89.83% / 88.89%
320100% / 98.31% / 100%66.67% / 0 行 / 47.22%
224100% / 98.31% / 100%90.48% / 44.07% / 50.00%
224 且 thresh 0.2 / box_thresh 0.3—85.71% / 91.53% / 88.89%

调低检测阈值单独用没用:在 736 下把 thresh 从 0.3 降到 0.2、box_thresh 从 0.5 降到 0.3,三张图依旧 0 行。它得和调小最短边一起用才有效,224 加低阈值那一行是这套组合里最稳的。渲染出来的图经过放大后模糊边缘跟着放大,检测反而更难出框,这个链路我没有继续挖到根因,只把观测记在这里。

再说模型换档。包里带的 small 不是唯一选择,tiny 和 medium 都能换,换上会去模型仓下载。同样 4 张图(28 px 卡片、12 px 卡片、JPEG q20、模糊 σ=2.4)跑下来:

档位检测 + 识别模型体积4 张图总耗时字准确率单张 28 px 卡片
tiny1.83 MB + 4.49 MB2.06 s97.77%490 ms
small(默认,随包)9.93 MB + 21.23 MB12.20 s97.77%2686 ms
medium62.12 MB + 76.63 MB159.63 s100.00%35590 ms

medium 在 2 核机器上单张 35.6 秒,准的那 2.23 个百分点全是标点符号,汉字该对的本来就对。小机器上换 medium 不划算;tiny 倒是值得一试,4 张图 2.06 秒,准确率和默认档持平。

这几个取舍是我最后定下来的:

  • 截图、界面图、卡片图统一把 Det.limit_side_len 设成 224 到 320,实测不丢字,速度是默认档的 4 到 6 倍。
  • 长截图别去动最短边。我试过把 limit_side_len 提到 1536 想看清小字,26 行原文一个字没多认对,耗时从 3414 ms 涨到 6107 ms。
  • 方向分类只有 3 毫秒,别关。关掉之后长截图那批从 3414 ms 只降到 3342 ms,省 2%,但倒置的图会整行认错。
  • 图糊的时候先调参数再考虑换模型:224 加低阈值能救回大部分,比下载 76 MB 的识别模型快得多。

可以落地的三条

  1. 装完之后先拿自己最有代表性的 5 张图跑一遍,把 elapse_list 的三段耗时记下来,看时间到底花在检测还是识别上,再决定动不动模型档位。
  2. 截图类输入把 Det.limit_side_len 设成 224 到 320;输入偏糊就再补上 Det.thresh 0.2、Det.box_thresh 0.3,两者要一起用。
  3. 识别结果入库前做一次标点归一化(全角转半角、去掉数字与英文之间的多余空格),否则检索会因为这些符号漏掉本该命中的记录。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/3 7:28:07

15.ENS160传感器使用秘籍:一文看懂多气体检测核心技巧

ENS160是一款基于MOX技术的数字多气体传感器,集成TrueVOC算法,可直接输出TVOC(ppb)、eCO2(ppm)和AQI(1-5级)等高级空气质量数据,大幅降低主控算力负担。其采用双电源设计…

作者头像 李华
网站建设 2026/10/3 7:27:52

毕设开源 yolov11骨折检测医疗辅助系统(源码+论文)

文章目录0 前言1 项目运行效果2 课题背景2.1 研究背景2.2 国内外研究现状2.3 研究意义3 设计框架(骨折检测系统设计框架说明)3.1. 系统架构图3.2. 技术选型3.2.1 核心组件3.2.2 辅助工具3.3. 核心模块设计3.3.1 YOLO模型训练模块训练流程图关键伪代码3.3…

作者头像 李华
网站建设 2026/10/3 7:26:06

Agent 技术摘要 06 —— Harness、原生视觉、Jev、mmproj、dsh

本系列为笔者在实习过程中的所见所闻记录,内容为技术摘要,旨在提供关于Agent领域相关技术名词的通俗和简要介绍,详细内容暂不展开,供同在该领域进修的童鞋们参考。 01 Harness 用来控制、约束和自动化运行代码的框架或平台&#x…

作者头像 李华
网站建设 2026/10/3 7:25:46

关于做OPC的那些事|第5篇:从卖时间到卖结果,OPC的定价升级

一、定价是最容易踩的坑我见过太多OPC,做事很专业,但定价一塌糊涂。最常见的两个极端:极端一:不敢报价。觉得自己没名气、没案例,怕报高了客户跑。于是报很低的价格,结果接了一堆累活,赚不到钱&…

作者头像 李华