P61 · 离线 OCR 选型 · 实验记录与相关篇目
P61 · 离线 OCR 选型整屏数字与文字,精度优先

新增 24 张原图的开发对照;保留历史 11 个标题裁图实验。参考标注待用户复核,不是独立测试准确率。

想从几十段游戏录像里找到“某个法术的说明出现过的画面”,可以先用 OCR(文字识别)读出关键帧里的文字,再用文字找图。但如果只读到了大段说明,漏掉战场生物脚下的数量,后面的数据采集仍会留下很大的空白。

阅读时先分清两种问题:整屏OCR要自己找字,局部OCR先得到一块裁图,再读其中的字。裁框可能来自人工,也可能来自算法,下面会分别注明。 本文保留24张整屏实验;9月24日另做的30图数量牌对照中,VL四倍读对200/202,仍有2错、假框出数和不可读位置出数。它比同批PP更好,但不是本文939项的更新成绩,也没有替换默认扫描器。

所以在全量扫描前,我们先做一轮不按耗时淘汰方案的准确性实验。输入改为完整截图,既要找到文字的位置,也要读出内容;不再提前告诉算法正确裁框在哪里。输出暂时只是带位置的文字候选,不直接成为已确认的游戏状态。

本文把 PP-OCRv6 medium 简称 PP,把 PaddleOCR-VL-1.6 简称 VL。它们是两种本地文字识别模型,不是同一模型的快慢档。

已有扫描使用 PP-OCRv6 medium 的“整图双遍+有保护的切块补缺”。 在 24 张开发图上,939 个纯数字字段读对 898 个(95.6%),79 个文字字段完整读对 74 个(93.7%)。下面先解释这套方法,再介绍 9 月 12 日补做的小字实验:更小切块与 PaddleOCR-VL-1.6 重读,把同一批数字提高到 910/939(96.9%)。新配方仍是开发候选,没有覆盖已有扫描结果,也不是所有 OCR 模型中的绝对最优。

flowchart LR
 A[24 full screenshots] --> B[Whole-image OCR: native and contrast-enhanced]
 A --> C[Overlapping tiles: enlarged and enhanced]
 B --> D[Keep primary readings and reserve nearby space]
 C --> E[High-confidence gap candidates]
 D --> F[Text, boxes, alternatives and per-image status]
 E --> F
 F --> G[Score against separate human-readable references]

图 1:先用完整图片读出主要文字,再放大小块补找遗漏;参考答案只用于评分,不参与选择读数。

1. 原图:不只挑说明文字好读的图

这次选择 24 张 2560×1440 原图,来自 15 段录像。包含普通战斗、部署、左右 HUD、英雄面板、生物面板、行动条、目标预览、魔法书、悬浮说明和日志。其中保留两张魔法书翻页画面,专门暴露变形小字的困难;没有把它们偷偷从分母里删掉。

四类整屏实验原图:战场目标预览、英雄面板、战斗日志和魔法书说明

图中的小数字分布在完全不同的背景上。顶部行动条的数量不能代填到战场数量牌里;即使两者看上去相同,也必须分别从各自像素读出来。

参考标注复用 B029 的手工 HUD 字段和 B025 的面板字段,再逐张看原图补齐可见阿拉伯数字。先看没有 OCR 答案的裁图,转写完成后才查看本轮模型读数;之后用整图回查候选生成器漏掉的位置。因此测试不局限于“候选生成器已经找到的数量牌”。

最终有 1,018 个可评分字段:939 个纯数字字段、79 个文字字段。数字字段包括时间、当前值/上限、区间和独立数字;文字字段还包含两张日志的 44 行正文及两个回合标题。另保留 8 个遮挡不确定区域,不猜答案;14 个没有数字的装饰误框作为小规模负例。

这些是助手复核、等待用户确认的开发参考,不是绝对真值。24 张都做了整图数字回看,但罗马数字、被面板遮住的底层内容和全部正文没有穷尽转写,更没有宣称所有图标已完成语义标注。初次评分还发现两张日志的首行参考框过宽,包含了背后的回合提示;回看原图后收窄了框,没有改答案文字。

2. 方法:先比较引擎,再比较怎样看图

Windows 简体中文 OCR、EasyOCR 1.7.2(中文/英文、beam search 宽度 10)和 PP-OCRv6 medium 处理同一批原图。PaddleOCR 3.7.0 使用本地 GPU,EasyOCR 使用 CPU。时间不参与选择,因此这里不是硬件速度排行榜;没有训练或微调模型,也没有用名称目录挑“最像答案”的读数。

整图基线复用既有方案:原尺寸彩色一次,加 1.5 倍局部对比度增强一次。切块将原图分成 9 个 960×640 的重叠区域,常规相邻块重叠 160 像素,末端块贴齐边缘;识别框换算回原图坐标。普通切块放大 2 倍;密集方案再增加 3 倍对比度增强,并降低检测阈值以找回小字。参数含义见 Paddle OCR 官方文档和 EasyOCR 官方文档。

直接把多遍结果按识别分数合并,会出现一个问题:切块截断的半句也可能分数很高,覆盖或混入原本完整的长句。随后补测两个不看答案的组合:

  1. 保留整图、只补空缺:已有整图文字不被切块覆盖,但仍可能把附近的血条或装饰识别成一个多余字符。
  2. 给整图文字留保护区域:在已有框左右各扩展一倍字高、上下各扩展半倍字高;切块只补这些保护区域之外、识别分数至少 0.8 的候选。0.8 是本轮配方阈值,不是“80% 正确概率”。所有未采用读数仍保留,便于复查。

两种组合是在观察初轮错误后补测的,所以这批数据明确属于算法选择开发集。最终选择的第二种组合又从原图完整重跑了一遍,分数与复用已有推理结果的组合相同。

3. 结果:多看几遍有用,合并方式也重要

下表数字分母均为 939,文字分母均为 79。“漏检”指评分框内没有匹配读数;“读错”指有读数但与参考不符。先按空间关系选择输出,再比答案,不用正确文字反过来挑模型结果。字符规范化统一全半角、空白及等价引号/横线,保留 /、:、- 等结构,不能把 1/2 当作 12。

配方 数字完整读对 文字完整读对 数字漏检 数字读错
Windows 整图 212/939 35/79 611 116
Windows 整图+切块 232/939 31/79 537 170
EasyOCR 整图 656/939 59/79 223 60
EasyOCR 整图+切块 736/939 39/79 125 78
Paddle 整图双遍 876/939 74/79 57 6
Paddle 整图双遍,显式提高检测边长上限 876/939 74/79 57 6
Paddle 整图+2 倍切块 880/939 55/79 49 10
Paddle 密集切块、直接合并 874/939 50/79 25 40
Paddle 保留整图、切块补缺 881/939 74/79 28 30
Paddle 带保护区域的切块补缺 898/939 74/79 32 9

这说明“检测出更多东西”不等于“读对更多东西”。密集切块把数字漏检降到 25,却出现 40 个错误读数;保护区域接受稍多的漏检,换来更少错误,最终精确读回最高。与整图基线相比,多读对 22 个数字字段,文字成绩没有下降。

最终方案的文字字符错误率为 0.26%。它与 74/79 的整字段成绩不矛盾:一行日志只漏一个右方括号,整行就不算完全正确,字符层面的损失却很小。该指标包含错字、漏字和多字,不是只挑识别成功的行。

用户关心的内容 最终方案完整读对 尚缺什么
战场红/蓝数量牌 215/225 5 个无读数,5 个错读
顶部行动条数量 231/240 9 个无读数
左右时钟 79/82 3 个读数漏了末位字符
左右英雄 HUD 数字 152/152 仅覆盖这批参考,不代表新视频全对
魔法数字徽章 95/111 16 个无读数,主要在翻页变形图
日志行/回合标题 41/46 5 行标点不完整
悬浮说明字段 23/23 样本很少,不能推广到所有提示框

这里测的是已标注字段的端到端读回,不是全图目标检测 precision。只有 14 个装饰负例且都没有额外数字,不能据此宣称全图无误检。数字 HUD 若被引擎合成一行,会按空格和字符跨度近似分开;这适合比较字段读数,不是字符级精密检测框成绩。

4. 哪些数字仍会漏掉或读错?

真实数量牌和翻页数字裁图:切块找回的两个例子,以及单字符、遮挡和变形仍失败的四个例子

前两格是整图漏掉、切块找回的数量牌。后面有清楚的单字符仍被漏掉,也有数量 12 被读成 2、翻页数字没有输出。放大只能放大已有像素,不能恢复被挡住的笔画;重复同样的增强也不保证能解决透视变形。

因此最终保存的是候选证据:文字、原图框、分数、哪一次尝试产生、是否采用、有哪些冲突。不能因为 OCR 说数量是 2 就覆盖用户确认的 12。本节没有评价身体与数量的关联。后续 B032 新视频流程已输出独立数量牌候选和可能的身体关联,不等于本节的整屏 OCR 输出已经完成关联验收。跨帧模板匹配、目标跟踪及召唤单位处理仍只记为后续想法。

5. 换更强的模型,放大小字,就能全部读对吗?

有些数字,人看局部裁图就能认出来。算法仍然漏掉它,值得继续追查:是没找到位置,还是已经找到、却把字读错?这两种失败需要不同的修复。

2026 年 9 月 12 日核对代码与实际运行记录,现有模型确实是 PP-OCRv6 medium。它不是旧版,但先前没有比较所有先进模型。本轮新增本地 PaddleOCR-VL-1.6:它把图像转换为视觉特征,再逐个生成文字;与“先检测文字框、再用专门识别网络读字”的 v6 流程不同。官方文档解析成绩支持把它列入候选,不能直接当作游戏截图准确率。PP-OCRv6 模型说明、PaddleOCR-VL-1.6 模型说明。

先把正确位置告诉模型,只测它会不会读

复用前面的 24 张图,再加入两张状态悬浮图。固定挑出旧流程的全部错误、各图各类的代表字段和装饰负例,共 217 个区域:203 个有字、14 个无数字装饰。这一小组专门诊断问题,不是随机抽样的总体准确率测试。模型得到人工框,但得不到正确文字;所有分支处理相同裁图。

只比较读字能力 原裁图完整读对 四倍放大+补边完整读对
PP-OCRv6 medium,跳过文字检测 188/203 173/203
PaddleOCR-VL-1.6 195/203 190/203

新模型在这组裁图上更好,但放大并不保证更好。这里的四倍方案还补了边框,不能把差异全部归因于倍率。检查本机 v6 配置还发现,识别网络会把输入重新缩放到 48 像素高;提前把图片放大四倍,不等于网络最终看到四倍高的字。两套识别器也都会把部分装饰硬读成文字:原裁图分支分别在 14 个负例中的 7 个、3 个输出了数字。因此不能把“任意小块送入识别器”当成文字检测。

再回到整屏,让程序自己找框

原先每图 9 个大块,改为 42 个 480×320 小块,分别做 3 倍彩色和 4 倍对比度增强。已有整图读数与保护规则不变。随后让 VL 重读它自动找到的 901 个数字区域,框向外多留两像素;这次不再提供人工框。

自动整屏流程 完整读对 / 1,018 补回旧错误 损坏旧正确
原有整屏融合 972 — —
改用更小切块 983 12 1
小块+VL 重读数字 983 13 2
再要求新旧数字格式一致 984 13 1

VL 把时钟 03:4 补成了正确的 03:47,却也把数量 215 改成 2.15。最后一行因此加了一个观察错误后制定的开发规则:整数、时间、比例等读数中的分隔符序列必须保持一致,否则保留旧读数。代价是原流程若连分隔符都漏掉,也可能拒绝正确的新读数。它没有查参考答案,但也不是预先冻结后的独立测试成绩。

四个真实小字裁图:小块找回数量6,VL补齐时钟,却给215加入小数点;附近噪声仍会混入数量4

图 2:同样是“再看清一点”,结果可能是补回漏字,也可能多出标点或附近噪声。这里展示原像素的插值放大,没有生成新的笔画。

组合候选的数字是 910/939,文字仍为 74/79。其中行动条数量从 231/240 提高到 238/240,战场数量从 215/225 提高到 217/225。有提升,但远没有达到“图里所有数字都读对”:人工框下的新模型优势,大部分尚未转化成自动整屏优势。

下一步重点因此很明确:提高小数字框的覆盖与完整性,处理合并时混入的邻近噪声,再用未参与本轮调参的录像验证组合。继续加大倍率或无条件换成新模型,都不是这组实验支持的结论。所有输入、分支原文和失败项已放入标注网站的“B024 · 小字 OCR”对照页,既能看原图,也能看实际裁图;运行只使用本机 GPU。

6. 已有扫描:原配方处理了 513 张关键帧

选型完成后,首轮扫描固定使用 paddle-fused-guarded。输入是已有的 159 张跨任务精选图,加上稳定帧实验保存的 386 张候选;其中 32 张属于同一原图,合并后得到 513 张图片。清单含 31 个视频标识,但已核实其中两个是同一录像的旧名和日期名,不能把它说成 31 段独立视频。不复制原图,也没有重新采样视频或缩短稳定窗口。321 张来自这段录像,因此这不是均匀抽样的准确率测试,更不意味着所有录像的每一帧都已扫描。

先用 12 张图验证整条流程,全部成功,得到 272 条配方选中读数;随后从同一目录继续其余图片。最终 513 张全部完成、0 失败,得到 22,761 条选中读数;连同未采用的备选共保留 53,063 条候选。原始记录确认试跑的 12 张没有被重复计算。程序按来源标识轮转处理,批量输出不需要参考转写或正确框,只沿用前面已经选定的算法。

原图元数据、逐图状态和 513 个可视化文件已逐一核对,候选框均在各自原图范围内。这证明结果可追溯,不代表这些读数都正确。原来 159 张精选图虽然全部 OCR 完成,整帧语义标注完成数仍是 0;需要人工复核的内容没有因为程序跑完就被升级。

扫描器已经逐图记录 PENDING、PROCESSING、COMPLETE、FAILED,原文件变化时不静默复用旧结果。每张图片对应可读路径、视频与时刻、尺寸、模型版本、参数和所有读数;运行完成与参考标注审核是两种状态。COMPLETE 只表示这套算法跑完,绝不表示全部 UI 元素已找齐。 断点续跑只跳过同来源、同配方的完整结果。

标注网站现在有两种用途不同的查看方式:“B024 · 整屏 OCR 准确性复核”对照前面的 24 张开发参考;“战场关键帧 · 语义时间线”里的整屏 OCR 批次查看这轮 513 张图。后者支持左右键、按钮和滑条,显示每帧的扫描状态、文字框和读数,也能查看没有被选中的备选。人工参考和算法候选可以分别显示。

例如一张打开战斗日志的截图,得到 70 条选中读数,连同备选共保留 189 条候选。这样既能查到日志正文,也能回看同一画面里的时间和小数字;但文字尚未自动归属于某个生物或英雄字段。网页只在切到该帧时读取它的结果,图片载入后再显示框,避免把新框暂时画在旧图上。

本轮首先解决“哪些图已经处理、结果在哪里、怎样逐帧审查”。文字到图片的倒排索引可以在这些文字、框和来源路径上另做,不必重新 OCR。若审查后发现某类提示或数字数据不足,再明确补充对应图片,而不是先修改稳定帧规则。

本轮代码、冻结参考与测量摘要位于 perception/experiments/b024_bounded-title-ocr-benchmark/。可部署扫描实现位于 perception/src/olden_era_perception/offline_ocr/;原始输出与网站报告保存在忽略的本地数据目录,不复制成第二套媒体库。

本章主线到这里结束:先读完整图片,再谨慎补找小字,最后保存可检索、可复查的读数。接下来可以继续读英雄数字与计时。下面的小标题实验留到需要比较历史方法时再读。

实验记录:小标题 OCR 比较

展开 2026 年 9 月 6 日的 11 裁图实验

历史实验只比较预先给定的标题裁图,与上面的整屏检测分开计分;旧测量没有被新测量替换。

选生物的卡片在图标附近印着小标题。OCR 读错名字,可能使系统退回较弱的图像建议;标题读对,也可能错误地认证旁边一张被遮挡或不合适的图片。因此本实验分别检查文字转写和输入有效性。

本实验的输入是预先裁好的小标题条。场景、布局和裁框由实验准备提供,不是被比较的 OCR 算法预测出来的。 原始截图用于解释标题来自哪里;算法没有读取原图里的其他区域。目标是在这一有边界的工作负载上比较读字准确性与速度,再为场景内细读选默认配方。

在六个可读失败裁图上,PP-OCRv6 medium 原图识别得到 6/6 精确匹配;Windows 与 EasyOCR 的完整配方各得到 5/6。 在当前机器与配方下,Paddle 的常驻配方速度为 15.24 个源裁图/秒。六个样本只有四种不同字符串,不能据此估计总体准确率。

flowchart LR
 A[Full screenshot and supplied layout] --> B[Title strips cropped in advance]
 subgraph T[Timed OCR workload]
 C[Read title files and apply recipe transforms]
 C --> D[Text detection and recognition]
 D --> E[Raw text and scores]
 end
 B --> C
 E --> F[Outside timing: catalog selection and independent scoring]

图 3:历史实验先裁好标题条,只比较这些小图的读取方法。它不测从全图找到标题的能力。

历史输入:七个问题与十一张裁图

用户指出的七个标题/质量问题是六个可读的历史 OCR 失败,加一个被悬浮说明覆盖的标题。再加入三个被错误送入生物识别路径的法术区域,以及一个用户确认无效的标题—图像组合,共 11 个裁图、9 张完整源图。它们不是 11 个独立的生物名称。

九个标题条是 412×47,两个是 309×35;普通标题一行、规范化后 2–5 字,遮挡说明片段为 11 字。完整源帧七张 2560×1440、两张 1920×1078。这部分历史实验的 OCR 只接收标题条。 下方同时展示原图与实际输入。

实验条件 本文怎么处理
场景与坐标 预先给定;包含故意保留的错误路由,不假定全部有效
OCR 接收什么 11 个原始标题条及各自增强变体;仍运行引擎的文字检测与识别
完整源图 展示和核对上下文;全图裁出标题的成本不在计时内
准确性评分 推理结束后,用六个可读标题的参考转写评分;另算五个负例的错误接受
目录是否参与 原图转写可单独评分;完整配方会用既有目录择优,须与纯 OCR 分开
速度比较 比较当前部署配方,Paddle 用 GPU、EasyOCR 用 CPU;不是同硬件模型排名

负例没有在 OCR 前被质量检查删除,否则无法观察“字读对但输入不该接受”。场景、遮挡和图像质量检查属于组合系统要补的能力,本文的负例评估没有证明这些检查已实现。全图场景识别与本实验的区别见 B021。

可读 1 · 弩兵

Complete source frame: 可读 1 · 弩兵
OCR 实际输入Original title crop from 可读 1 · 弩兵
画面上下文 生物卡标题预期处理 恢复弩兵身份

可读 2 · 日矛圣骑兵

Complete source frame: 可读 2 · 日矛圣骑兵
OCR 实际输入Original title crop from 可读 2 · 日矛圣骑兵
画面上下文 生物卡标题预期处理 通过别名解析阳矛骑兵

可读 3 · 剑士

Complete source frame: 可读 3 · 剑士
OCR 实际输入Original title crop from 可读 3 · 剑士
画面上下文 生物卡标题预期处理 恢复剑士身份

可读 4 · 日矛圣骑兵

Complete source frame: 可读 4 · 日矛圣骑兵
OCR 实际输入Original title crop from 可读 4 · 日矛圣骑兵
画面上下文 同一录屏后续帧预期处理 通过别名解析阳矛骑兵

可读 5 · 日矛圣骑兵

Complete source frame: 可读 5 · 日矛圣骑兵
OCR 实际输入Original title crop from 可读 5 · 日矛圣骑兵
画面上下文 另一录屏预期处理 通过别名解析阳矛骑兵

可读 6 · 虔信者

Complete source frame: 可读 6 · 虔信者
OCR 实际输入Original title crop from 可读 6 · 虔信者
画面上下文 旧 OCR 漏掉首字预期处理 通过别名解析誓信徒

问题 7 · 标题被遮挡

Complete source frame: 问题 7 · 标题被遮挡
OCR 实际输入Original title crop from 问题 7 · 标题被遮挡
画面上下文 标题条读到悬浮说明正文预期处理 拒绝此标题,等待下一帧

负例 · 三个法术槽

Complete source frame: 负例 · 三个法术槽
OCR 实际输入Original title crop from 负例 · 三个法术槽
画面上下文 法术页误走生物路径预期处理 拒绝或更正场景路由

负例 · 图像目标无效

Complete source frame: 负例 · 图像目标无效
OCR 实际输入Original title crop from 负例 · 图像目标无效
画面上下文 名称可读,但配对图片不可用预期处理 拒绝标题—图像组合
实际标题输入:弩兵
弩兵
实际标题输入:日矛圣骑兵
日矛圣骑兵
实际标题输入:剑士
剑士
实际标题输入:日矛圣骑兵(重复)
日矛圣骑兵(重复)
实际标题输入:日矛圣骑兵(另一录屏)
日矛圣骑兵(另一录屏)
实际标题输入:虔信者
虔信者
实际标题输入:遮挡说明
遮挡说明
实际标题输入:绝望
绝望
实际标题输入:狂暴
狂暴
实际标题输入:顺风
顺风
实际标题输入:深渊监管者
深渊监管者

这些已知失败参与了配方选择,属于开发诊断。所有引擎处理同一组输入;没有在这组图上训练或微调 OCR。规范化采用 NFKC、大小写折叠、移除非字母数字字符及 Windows 简繁转换。期望文字只在推理完成后用于评分,选择变体则优先唯一精确目录匹配,否则按引擎分数/固定顺序保留。

历史方法:四条处理流程,三种引擎

旧标题算法是当时的 B08/旧 B021、现归 B023 的 Windows OCR 路径:固定裁图、三倍 cubic 放大、按图像中位颜色补 24 像素边,再送系统简体中文 OCR;未匹配时重试灰度 CLAHE,之后查双语目录。B024 Windows 仍用同一系统引擎,但增加了原图与多种增强对照。

路径 检测与识别 输入变体 本次运行
历史 Windows 路径 不公开内部网络的系统 OCR 3× 彩色,必要时灰度 CLAHE 保存的历史结果
B024 Windows 相同系统引擎 原图、4× Lanczos、4× CLAHE、4× Otsu 本地 Windows
PP-OCRv6 medium PPLCNetV4/RepLKFPN 检测,PPLCNetV4/LightSVTR 识别,CTC/NRTR 多头 原图、3× CLAHE PaddleOCR 3.7.0,GPU
EasyOCR 1.7.2 CRAFT 检测、中文 generation-2 CRNN,beam width 10 原图、4× CLAHE PyTorch CPU

CLAHE 增强局部对比度;Otsu 把灰度分为两类;放大改变字形采样。这些预处理本身有成本,不能只报模型 forward 的时间。四条路径登记在 perception/configs/ocr-pipelines-v1.json,并非四个不同的神经网络。

历史耗时:启动与识别分别多快?

机器为 Ryzen 9 9900X / RTX 5080。三个当前引擎各运行三次,每次从原始标题文件开始、启动新进程;模型文件已缓存,不是清空操作系统/磁盘缓存。启动端到端包括解码、增强、文件 I/O、进程、导入、模型创建、预热、推理和 JSON 输出,排除后续目录选择与评估。

常驻配方 = 父进程预处理 + worker 预热后的批次计时,是逐次测量后重建的和;不是直接计时的常驻服务请求,不含最终目录选择、响应序列化及服务分发/IPC。下表每个批次均为 11 个源裁图,p50/p95 则是单次 OCR 尝试,不能混为每个源裁图的延迟。

引擎 每批尝试数/输入像素数 父进程预处理 启动端到端 常驻 worker 常驻配方 完整配方处理的源标题条/秒 单次 OCR p50 / p95
Windows 44 / 9,599,394 0.198 s 1.397 s 0.771 s 0.968 s 11.36 5.17 / 9.55 ms,n=132
PP-OCRv6 GPU 22 / 1,959,060 在 worker 内 6.214 s 0.722 s 0.722 s 15.24 23.16 / 54.02 ms,n=66
EasyOCR CPU 22 / 3,330,402 0.115 s 9.876 s 4.225 s 4.341 s 2.53 144.85 / 358.22 ms,n=66

分位数合并三次测量的全部变体尝试,排除预热;Windows 是 11×4×3 次,其余是 11×2×3 次。Windows 单次最快,但每源图做四次尝试;Paddle 做两次,常驻整配方吞吐更高。EasyOCR 只用 CPU,不是与 Paddle 的同硬件推理对决。

已测启动阶段中位数:Windows PowerShell 初始化 106.9 ms、引擎创建 7.7 ms、预热 97.7 ms;Paddle 导入 2.589 s、创建 1.209 s、预热 0.468 s;EasyOCR 导入 3.165 s、创建 1.486 s、预热 0.108 s。各阶段中位数不能直接相加等于总中位数,剩余还包含进程、I/O、IPC 和序列化。

输入尺寸影响明显:EasyOCR 从 412×47 的 53.78 ms 升至 1648×188 的 330.58 ms;Windows 从 1.03 升至 6.12 ms;Paddle 从 412×47 的 21.74 升至 1236×141 的 24.96 ms。这些是按尺寸分组的单次调用中位数。

文字数量也可能影响后续识别和解码,但这里主要是单行短标题,不能独立估算“每个字多少毫秒”。按识别到的 2/3/5/11 字分组,Paddle p50 为 23.11/24.09/22.59/42.00 ms;EasyOCR 为 190.17/191.93/144.85/153.58 ms,并不单调。严格实验应固定像素、字体、预处理,再改变行数和字数。

B021 的全图双通道 PP-OCRv6 历史批次为每 320 帧 210.494/191.235 秒,约 657.8/597.6 ms 每源帧;Windows 旧全图批次约 135.5/136.0 ms。旧 v1 因几何投影失败标为 partial,v2 复用 OCR 的投影时间不能当作新识别耗时。固定标题旧大批次 877 帧、2,782 个标题及 318 次增强重试用了 97.55 秒,未分冷暖,也不是本次相同工作量。这些记录说明必须同时看输入大小、调用次数和计时边界。

历史结果:字读对了,图片也可用吗?

标题 历史 Windows B024 Windows PP-OCRv6 EasyOCR
弩兵 无文字 弩兵 ✓ 弩兵 ✓ 弩兵 ✓
日矛圣骑兵 日矛圣马奇兵 正确 ✓ 正确 ✓ 正确 ✓
剑士 无文字 剑士 ✓ 剑士 ✓ 剑 ✗
日矛圣骑兵(后续帧) 日矛圣马奇兵 正确 ✓ 正确 ✓ 正确 ✓
日矛圣骑兵(另录屏) 日矛圣马奇兵 正确 ✓ 正确 ✓ 正确 ✓
虔信者 信者 信者 ✗ 虔信者 ✓ 虔信者 ✓
引擎 仅原图精确 仅增强分支选择精确 完整配方选择精确 任一变体精确
Windows 4/6 5/6 5/6 5/6
PP-OCRv6 6/6 6/6 6/6 6/6
EasyOCR 5/6 5/6 5/6 5/6

增强分支与完整配方使用目录辅助选择;任一变体精确是事后 oracle 诊断。Paddle 的原图 6/6 不依赖目录在多个变体中择优。EasyOCR 原图把剑士读成剑土,增强后为剑,二者都不精确。历史修复中,日矛圣骑兵应查到阳矛骑兵/Sunspear Cavalry,而不是旧图像回退的贵族骑兵;虔信者对应誓信徒/Votary。

错误送入生物路径的区域 Windows Paddle 文字/分数 EasyOCR 文字/分数 生物路径
法术绝望 绝望,无分数 绝望 / 0.9999 绝望 / 0.8931 拒绝
法术狂暴 无文字 狂暴 / 1.0000 狂暴 / 0.6904 拒绝
法术顺风 顺风,无分数 顺风 / 0.9999 顺风 / 0.9732 拒绝

这些主要是 OCR 成功而场景路由错误,不应笼统叫 OCR 错误。Paddle/EasyOCR 提供识别分数,但它不是校准过的正确概率,不同引擎不可直接比较。Windows 这条桥接接口没有返回置信值。

遮挡正文的 Paddle 分数仍有 0.9830,不能恢复被挡住的标题。另一个无效图像目标旁的深渊监管者被所有引擎正确读出,Paddle/EasyOCR 分别为 0.9998/0.9945,目录也命中,但用户确认配对图像无效。因此五个负例中,纯 OCR+生物目录均拒绝四个、误接受一个。文字准确与配对有效性必须分开计算。

负例来自哪里 数量 本次 OCR+生物目录的决定 暴露的问题
法术页误走生物路径 3 全部拒绝生物身份 文字可能完全正确,但对象类型不对
标题被说明文字遮挡 1 目录不匹配,拒绝 读到了可见正文,原本标题仍不可见
名称正确、配对图像无效 1 错误接受 目录匹配无法认证图像可用性

所以“拒绝4/5”是这组混合系统负例的决定统计,不是 OCR 的通用特异度。前三个检验类型路由,后两个检验输入/配对有效性;组合系统需要分别记录失败来源。

历史结论与公开指标的区别

Paddle 官方 OCR 文档公开报告 medium 检测 Hmean 86.2、识别平均准确率 83.2,来源为内部多场景集,是公开披露而非可独立复现的统一公开测试集。官方端到端表在 200 张通用/文档图上报告 medium:A100 0.29 s/图、V100 0.72 s/图、Xeon 8350C 2.05 s/图,含加载与处理,不能直接比较我们的短标题条。

EasyOCR 仓库没有一张统一覆盖本次中文权重、预处理和解码配置的准确率/速度表;CRAFT和 CRNN论文的组件基准也不是完整 EasyOCR 包的成绩。Windows OCR API说明接口与语言模型选择,没有本机中文引擎的统一准确率/延迟基准。

当时选择 PP-OCRv6 medium 作为小标题主识别路径,Windows 保留为启动快的备选,EasyOCR 保留离线回归比较。这个集合没有 Windows 挽救 Paddle 错误的案例,不能宣称后备已经增加召回。更复杂或更高分数也不能越过场景不匹配、遮挡和无效图像的检查。

当时建议的后续标题实验是:预先冻结其他录屏中 100–300 个标题机会,包含普通正确项、难例、错误路由和无效目标;报告原文精确率、字符错误率、错误接受/拒绝、含全部预处理的常驻服务 p50/p95,以及跨帧重试效果。旧七个问题当时已回到 Needs Review 为修复草稿,那是操作历史,不等于现在都已人工确认。

本节历史代码与紧凑记录同样位于 B024 目录。旧标题部分沿用既有回执与原图,没有重新计时;2026-09-10 新做的整屏实验见本文前半部分。