摘要

战场上每支部队(兵堆)脚下有一块写着兵数的小牌,叫数量牌。读出攻击前后的数量,就能算出这次攻击打死了几个,这比读飘起来的伤害数字更稳定。前一轮(r15)发现,在一段训练录像(10 月 10 日 16:57)的四张连续截图里,旧方法——在预期位置找红/蓝色块——对右侧那支部队一次都没找到牌。

本轮(r16)只验证一种新算法:从已检测到的部队身体出发,按既有的偏移规则在脚下开一个 88×44 的局部搜索窗,放大 3 倍后先用文字检测模型找文字框,再用已有的数量识别器在原图上两尺度读数,最后沿用原有的整数、尺寸、颜色和位置门槛。结果:右侧部队在四张图中读出 8 / 未知 / 3 / 3,相邻部队四次都是 12;三个预先固定的真实反例(身体区域、行动条数字、飘字伤害)都没被当成数量牌。首轮因为一个坐标取整的不一致漏判了两处,修正后重算。所有结果都只是“未绑定的数量文字候选”,不认证它属于哪支部队,也不推算死亡数。

要回答的问题

在不改模型、不调阈值的前提下,“从身体出发的局部文字检测 + OCR”能否找回旧色块方法漏掉的数量牌?会不会把别的数字误当成数量牌?

数据与来源

  • r15 用过的同一段已授权训练录像中的四张原图(录像时间约 585.99、586.62、587.12、587.22 秒),以及各自已保存的身体检测结果。全是已曝光的开发材料,不是新局盲测。没有解码视频,没有用战斗日志,没有用上一轮的人工数量区域或未来帧。
  • 53 个身体中 3 个脚点离最近格子超过 60 像素被排除;其余 50 个归入 48 个搜索窗(同一格有多个身体时保持歧义,不挑最高分)。没有按兵种、数量或伤害筛选身体。
  • 另加 3 个预先固定的真实反例窗:首图右侧预期位置往上 80 像素的身体区域、首图行动条上的一个数字牌、第三张图上一个飘字伤害“-314”的位置。
  • 运行后才核对的开发目标:右侧 8/3/3(中间那帧读不清就该是未知),相邻牌 12/12/12。

方法

  1. 每个身体的脚点投影到最近格,由既有偏移给出数量牌中心,开 88×44 的搜索窗。
  2. 窗口 3 倍三次插值放大,用缓存的 PP-OCRv6 中型文字检测模型(CPU、固定参数)找文字框;每窗最多 8 个框,超限算失败,不挑选。
  3. 每个框映射回原图、加 4 像素边距,用现有数量识别器在两个尺度各读一次。
  4. 交给既有的数量文字锚点检查:必须是整数、尺寸合理、在战场范围内、颜色规则通过、两尺度一致且每路分数 ≥0.9。
  5. 文字中心相对预期中心必须满足原来的位置门槛(横向 -10 到 20、纵向 -8 到 9 像素),不扩大。同窗只有一个有效位置候选且颜色不歧义才返回数量;共享身体或多个候选就保持未知。

只运行一次配方;不为得到 8 去调阈值、换模型或训练 OCR。

设置

CPU 限 8 核,模型配置 2 线程,联网禁用;所有中间结果(每窗的检测框、两次 OCR 原文与分数、旧方法结果、新方法结果、拒绝原因)都保存。

结果

录像时间(毫秒) 右侧实际 OCR 首轮位置判断 坐标修正后 相邻部队
585985.4 8 / 8 未知 8 12
586619.3667 没检测到文字 未知 未知 12
587119.8667 3 / 3 未知 3 12
587219.9667 3 / 3 3 3 12

旧色块方法四次都没找到右侧的牌。新方法在首图自动找到文字框、两路都读 8,颜色取样区域约 82% 为蓝色。中间那帧没有补值,也没有用前后帧的数值填空。

三个反例都没被接纳:身体区域没有文字框;行动条数字两路都读到 8,但被战场范围检查拒绝;飘字两路都读到 -314,但不满足整数/字体条件,没有去掉负号冒充数量。

全部 51 窗:坐标修正后 40 个位置数量候选、11 个未知/拒绝(含 3 个反例)。这不是 40/51 的准确率:其他部队的数字还没有逐项独立标注,48 个窗也不是 48 场独立战斗。

成本:模型初始化 4.545 秒;51 窗合计 28.571 秒,每窗 0.161–0.997 秒。不含身体识别、视频解码和 App,不是整帧 p95。给每个身体都跑一遍不是上线方案。

失败与负结果

首轮坐标约定不一致:新代码直接用棋盘投影的浮点中心做位置判断,而原方法先把中心取整,门槛也是按取整后的像素中心定的。按浮点中心,首图偏移是 (20.1183, 9.0573),超出门槛;按取整后的中心是 (20, 8.8333),刚好满足。只修正了这一处实现,门槛、模型、尺度和 OCR 数字都没改;用首轮保存的全部检测/OCR 结果重算位置选择,只有表中 8 和第一个 3 的接纳改变,其余 49 窗逐记录完全一致,没有第二次运行模型。首轮失败保留。

语义风险:原来的位置门槛是为“牌色块中心”测量的,这里用在“文字框中心”上;取整一致不等于这种迁移已被验证,而且首图恰好在横向边界上,不能说几何上很稳健。58×24 的取色区域也不是实际定位出的完整牌框。因此结果中部队编号和归属都为空,不认证身体与牌的对应,不把 8→3 当作已归属的数量变化,也不推出“死了 5 个”。

局限

  • 四张图、同一段已曝光录像;反例是人工选定的,不能外推为全场景误报率。
  • 两尺度来自同一个 OCR 引擎,不是两份独立证据。
  • 相关软件测试 102 项通过,测试不证明实图准确率。
  • 没有接入 App、没有写入状态估计、没有改生产默认或公开格式。

结论与下一步

局部文字检测能自动找回旧色块方法漏掉的数量文字,并且三个真实反例都没误报。结果标记为“未绑定的数量文字候选”,只说明搜索窗来自哪个身体,不说明归属。外部审阅建议和本地核对后,下一步优先在 App 里做“显式点击补读局部数量文字并可回看”:让用户看到候选、文字框、来源、拒绝原因和未知,保存/导入后语义不变;首版不自动运行、不写状态估计、不推断数量差。现有严格的数量牌输出格式要求真实牌框和特定颜色取样,本实验不满足,不能伪造牌框或在该格式里硬加字段,新语义需要单独识别、验证和版本化。验收时再补一两张另一段已授权视频的图,重点看队伍颜色和相邻牌竞争,作为跨来源开发回归。