在《英雄无敌:上古纪元》的生物选择页,名称和图标出现在固定位置。到了战场,生物会移动、转身、互相遮挡,屏幕也不再给每个单位显示名字。我们希望输入一张战场截图,得到每个存活部队的位置框和具体生物名称。

我们分两轮审核了 14 个录屏标识下的 96 张原图、1,108 个生物框。第一轮比较三个公开检测器及多种分类方法;第二轮增加真实战场数据,检查换到新对局以后还能认对多少。在相同的新测试画面上,扩充训练后的模型检测 F1 从 70.83% 提高到 75.39%,框和身份同时正确的目标从 74/167 增加到 83/167。检测与身份已有可检查的完整流程,自动身份仍明显不足。

第2–6节保留第一轮的协议与原始测量;第7节记录第二轮扩充与迁移结果。两轮测试画面不同,不能直接拿它们的百分比相减声称提升。

flowchart LR
 A[完整战场截图] --> B[检测可见生物框]
 B --> C[裁剪每个候选生物]
 C --> D[分类器匹配目录身份]
 D --> E[原图叠加框与名称]
 F[逐图审核的框和身份] --> B
 F --> D

图 1:检测器回答“在哪里”,分类器回答“是谁”。审核数据用于训练和评估;运行时不把人工框交给检测器。

1. 检测的是场上存活的部队

一个框对应一支可见部队,数量可能是 1,也可能是 200。框包围画面中可见的生物、坐骑和装备,尽量不包含脚下数量、光圈和影子。行动顺序栏中的头像、左右英雄头像、场边英雄模型、石头、树、尸体和短暂法术特效都不算目标。

输入的场景已经由前级确定为战场。这是 B021/B022 之后的场景内部理解模块;本篇不重新测场景分类,也不读取攻防数值、推断占据哪个六角格或维护跨帧部队 ID。

原始战场截图:场上生物、行动条头像、双方英雄与障碍物同时存在
图 2:bf037,测试视频中的原始截图。点击打开原分辨率。行动条与数量可以帮助审核身份,但检测目标是场内精灵。

注意画面上同一类别可能出现两支部队。例如两边都可能拥有绝罚者。分类相同不表示它们是同一支部队,跟踪还需要位置、阵营和前后帧证据。

2. 先审核真实战场框,再隔离视频评估

我们复用已保存的原始截图,在每段视频的战场区间取六个时间分位附近的画面,覆盖部署、开战、交战和后期。先冻结来源分组,再训练模型。五段视频训练,一段验证,两段测试;同一段视频的生物选择截图也不能进入另一组。

数据 用途 数量
生物选择裁图 身份分类,保留用户或助手审核来源 1,818 个正身份,141 类,21 段视频
战场训练 检测与分类学习 30 帧,其中 28 帧完成全部目标审核
战场验证 选择 checkpoint、阈值和分类方案 6 帧
战场测试 固定视频上的最终对照 12 帧,130 个框

选择页正样本分为训练 1,580、验证 36、测试 202;另有 27 个无效裁图作为单列负样本。本轮分类对照的正身份准确率不包含这些负样本。选择页身份标签不能充当战场检测框:它们只说明裁图是什么,不说明战场上哪个位置存在生物。

助手逐个查看原图、放大裁图、目录的三维外观和头像,必要时关联同帧行动条头像及数量。已有分类器的 Top 5 只帮助寻找候选,不能自动成为正确答案。510 个框中有 412 个清楚目标、98 个部分遮挡目标;509 个身份已确认,覆盖 110 类,1 个严重遮挡目标保留未知。训练、验证、测试分别有 317、62、130 个已知身份对象。

两张训练帧存在无法穷尽的疑似特效目标,因而不用于检测训练或检测指标。否则漏画的真实生物会被训练器错误当成背景。可见的单个已核实对象仍可以用于分类研究,且保留所在帧的非穷尽标记。

部署画面中经过逐图审核的七个生物框及名称
图 3:bf043 的助手审核参考框。没有框住场边英雄或开始战斗按钮。这里显示的是参考标注,不能当成算法预测成绩。查看未叠框原图

这些是用户授权采用的助手审核标签,来源没有改写成人工确认。48 张图也不是 48 次独立对局:同一视频内可能反复出现同一军队,样本相关性较强。本篇是可复现的小规模实验,尚不能代表所有地图、版本和录制条件。

3. 通用检测器可以提框,但不知道游戏生物是什么

三个公开模型都从 COCO 权重开始,接收整张原始截图。它们没有取得人工框或生物选择槽位。原图有 2560×1440、1920×1078 和 1920×1080 三种尺寸,内部保持比例缩放到约 1333×749,批张量补到 1344×768;结果坐标再映射回原图。

检测器 方法差别 官方 COCO val2017 box mAP
Faster R-CNN ResNet50 FPN v2 先生成区域,再判断类别并修正框;两阶段 46.7
FCOS ResNet50 FPN 从特征图位置直接预测框;不依赖预设 anchor 39.2
RetinaNet ResNet50 FPN v2 在多尺度预设框上判断目标;focal loss 降低大量简单背景的影响 41.5

模型与权重依据分别见 Faster R-CNNFCOSRetinaNet 官方文档。公开自然图像成绩不等于游戏效果。我们把它们的输出暂时看作位置候选,原始 personhorsebird 类别不会映射成某种游戏生物。

公开 Faster R-CNN 把开始战斗按钮识别成 clock,并在 HUD 和背景产生误检
图 4:公开 Faster R-CNN 的原始候选示例,预览只画分数至少 0.20 的框。按钮被识别成 clock,HUD 和地面也有误检。

指标使用每图分数至少 0.05、最多 300 个保留候选。FCOS 每张图都达到上限,低分候选已经截断。验证集在固定阈值列表中选择工作点,并决定是否排除框中心位于 HUD 边缘带的候选。这个固定位置过滤是明确的后处理,不能算作公开模型本身的能力。

随后训练一个只判断“生物部队”的 FCOS:保留公开 ResNet/FPN 特征骨干并冻结,只更新分类和框回归等检测头。训练只使用 28 张已穷尽标注的战场图,带水平翻转、轻微亮度与对比度变化。验证集选择 checkpoint,并在测试推理之前保存工作阈值。原来的 B03 实验和游戏微调权重均未改动或拿来初始化。

方法(验证集选阈值) 精确率 召回率 F1 AP50 AP50:95
公开 Faster R-CNN(0.20,过滤 HUD) 18.53% 44.62% 26.19% 17.19% 8.59%
公开 FCOS(0.20,过滤 HUD) 6.23% 40.00% 10.78% 9.18% 4.04%
公开 RetinaNet(0.10,过滤 HUD) 7.07% 20.77% 10.55% 3.21% 1.57%
战场微调 FCOS(0.50,无 HUD 过滤) 80.42% 88.46% 84.25% 91.07% 41.12%

全部方法在同一组 12 张测试图、130 个框上评估。微调 FCOS 输出 143 个框,其中 115 个与参考框匹配,另有 28 个误检、15 个漏检。最佳 checkpoint 为第 35 轮;50 轮后满足预设提前停止条件。训练期间一次复核修正了两个训练框,因此使用相同配置重跑;旧运行仍单独保留,未修改测试框。

判对一个框要求它与某个未匹配的参考框 IoU 至少 0.5;IoU 是两个框的交集面积除以并集面积。重复框算误检。精确率回答“画出的框有多少是真的”,召回率回答“真实生物找到了多少”。AP 汇总不同分数阈值的精确率与召回率;这里用保留候选上的 101 点插值,不是完整的 pycocotools 官方评测。更严格的 AP50:95 会揭示框位置仍不够准的问题。

4. 选择页数据有帮助,但战场裁图改变了问题

先假设位置已经完全正确,把审核框里的生物裁出来,再比较分类方法。这样能单独回答“分类器认得出吗”,避免检测漏框掩盖分类错误。

基础特征提取器是公开 ImageNet 权重的 ConvNeXt-Tiny。裁图转成 224×224 RGB,输出 768 维特征。早期这一组实验统一去掉裁图底部 10%,原本是为了排除选择页数量栏,实际也用于战场训练、评估和推理。虽然三者一致,但会损失战场紧框里的部分身体。下方 DINOv3 新方案明确改成:选择页去掉 10%,战场和目录全身图保留完整。模型运行时只看图片,不读取 OCR 名称或标注答案。

我们比较两种使用特征的方法:一是把同类训练图的特征平均,找最相近的类别原型;二是训练平衡类别权重的线性 SVM,学习类别之间的分界。SVM 比较 C=0.1、1、10。分别只用选择页、只用战场训练裁图、两者合并,形成 12 个组合。

相同对象在选择页通常大而清楚,在战场可能只有几十像素,叠着红色地面、移动动作或其他单位的翅膀。因此选择页测试的高正确率,不能推出战场分类也正确。

人工参考框条件下的分类方法 验证:62 个对象 测试:130 个对象
冻结 ConvNeXt,选择页训练,SVM C=10 35.48% 47.69%
冻结 ConvNeXt,战场训练,SVM C=10 66.13% 67.69%
冻结 ConvNeXt,两者合并,SVM C=10 70.97% 74.62%
微调 ConvNeXt 最后阶段和分类头,两者合并 75.81% 68.46%

前三行固定同一分类器配置,观察训练数据来源;12 个冻结组合中,全局验证最优也是合并数据的 C=10。随后只微调 ConvNeXt 的最后阶段和分类头,使用按来源与类别平衡的抽样、轻微颜色变化和随机裁切。验证选择第 11 轮,提前停止于第 17 轮,训练用时 130.24 秒。验证更好而测试下降,是这个小数据集必须保留的结果,不能事后改用测试分数最高的一行宣称胜出。

还尝试了三个补充方向:

补充实验 输入变化 最佳验证结果 是否继续评估测试指标
冻结 ConvNeXt 加目录全身参考 额外加入 148 张完整渲染图,各有目录身份 45/62,72.58% 否,未超过预定 47/62 门槛
冻结 DINOv3 ConvNeXt-Base 1,024 维特征;完整战场裁图;比较有无目录参考及原型/SVM 33/62,53.23% 否,未超过门槛
已微调 ConvNeXt 特征再接原型/SVM 冻结第 11 轮特征,只重新训练最后分类器;保留原裁图协议 46/62,74.19% 否,未超过门槛

DINOv3 是通过自监督学习得到的公开视觉特征模型;这里使用已缓存的 timm ConvNeXt-Base 权重,只训练后面的分类器。方法与权重来源见 DINOv3 官方实现。冻结特征缓存可以包含测试图片;上表“未继续”指没有用这些特征计算测试分类或联合指标,训练和选择也不使用测试标签。这组比较同时改变了骨干和战场裁图预处理,不能把差异单独归因于某一因素。结果至少说明:更大的公开模型、更多目录图片,都没有自动解决本批游戏截图的身份问题。

模型相似度和 SVM 分数都不是“这个名字正确的概率”。当前还有无目录目标、误检框和不可见身份的拒识问题。把每个框强制分给一个最相近类别,会产生看似完整但错误的结果。

5. 最后必须同时检查框和身份

真实运行从检测器输出框,再裁图送给分类器。此时框可能漏掉翅膀、包含邻居或落在障碍物上,所以正确人工框条件下的分类成绩只是上限参考。

完整检测与分类组合 框与身份都正确 联合精确率 联合召回率 联合 F1
微调 FCOS + 冻结 ConvNeXt/SVM 73/130 51.05% 56.15% 53.48%
微调 FCOS + 微调 ConvNeXt 79/130 55.24% 60.77% 57.88%

两行都使用同一组 143 个预测框。微调分类器在“精确参考框”测试上下降,在“实际预测框”上却改善,说明两个测试条件不能互相替代。后一行定位正确的 115 个目标里,79 个身份也正确;36 个定位对但名字错,另有 15 个漏检和 28 个定位误检。身份错同时计入联合误检与漏检,不能只统计画面里出现了多少名字。

完整检测加分类在测试截图上的实际结果
图 5:bf037 的算法输出。名称是预测,保留漏检和误判;不能用参考标签替换后再展示成模型成绩。点击查看原分辨率。

本机可以打开 48 帧结果浏览器,切换参考标注、不同检测器及“检测与身份预测”,左右键换图。绿色实线是参考,橙色虚线是预测,名称来源分别保留。它复用标注网站的报告入口,读取原分辨率图片;无需再逐张替助手做这一批标注。这个链接需要本机 Studio 服务运行,公开网页的读者可直接查看本文示例。

6. 加载、单帧推理和完整处理分别有多快?

测速环境为 Windows、RTX 5080、torch 2.13.0+cu130、torchvision 0.28.0+cu130,float32,检测 batch=1。每个公开模型独立启动进程并顺序运行,记录包导入、加载到 GPU、首次推理;预热三次后,48 张图各推理一次,GPU 计时前后同步。

公开检测器 包导入 模型加载到 GPU 首次常驻调用 网络常驻均值 含张量准备与传输的常驻均值
Faster R-CNN 1.896 s 0.492 s 566.7 ms 30.39 ms 45.15 ms
FCOS 1.875 s 0.369 s 333.0 ms 23.56 ms 39.19 ms
RetinaNet 1.915 s 0.417 s 295.0 ms 24.50 ms 39.31 ms

图像文件解码平均还需约 9.4 ms,不包含在上表最后一列。网络时间包含内部缩放、检测头和 NMS。没有清空操作系统文件缓存,所以这不是物理磁盘冷启动测量,也不是视频从解码到绘图的每秒帧数。

完整常驻程序还单独测了一次:每次输入整张截图,由 FCOS 生成框,再把该帧的 6–16 个候选裁图批量送入微调 ConvNeXt。48 张图共产生 521 个候选。没有人工框参与运行,也没有把所有视频裁图预先攒成一个大批次。

这次新进程中,框架导入 1.945 秒,身份模型加载 0.331 秒,检测器加载 0.315 秒。首张图片解码与完整推理 660.1 ms;从开始框架导入到首个结果共 3.252 秒,不含 Python 解释器启动。

完整链路,含 JPEG 解码 均值 中位数 P95
预热首张图后,第一次遍历 48 图 122.49 ms 62.58 ms 370.20 ms
所有已出现的裁图批大小均已运行后,再遍历一次 58.41 ms 56.82 ms 69.42 ms

第二遍内部均值为:检测 34.66 ms、裁切 0.15 ms、身份分类 14.80 ms,另加解码等开销。第一遍仍有不同裁图批大小首次运行的启动开销;因此只预热一张图就报告“稳定速度”会误导。第二遍约相当于串行处理 17 张截图/秒,但尚未包含视频解码、场景分类、跨帧跟踪和绘图,不是整套视频应用的 FPS。

检测网络的主要计算与缩放后的像素面积有关,不会因为场上只有三支部队就少算大部分卷积。后处理随候选数量变化;分类器则需要逐个编码裁图,检测出的框越多,后续计算通常越多。因此降低误检也会降低完整链路的耗时。

7. 第二轮:扩充到96张,检验新对局迁移

第一轮结束后,我们又逐张审核了48张、598个活体框。累计1,107个身份确定,覆盖125类;唯一未知目标仍保留未知。全部96张里,813个目标清楚,295个部分遮挡;两张旧训练帧继续保留非穷尽标记。这里的标签是用户委托助手检查后采用的参考,来源没有改成人工确认。

新增图使用已有的原分辨率文件:12张1920×1078、36张2560×1440。11个场景入口原先只有小预览,改用同视频邻近的原分辨率缓存,并记录实际时间差、重新检查画面,没有把640像素缩略图放大当原图。

第二轮新对局的完整部署原图,双方英雄与七支可见部队同时存在
图6:bf085,新测试对局的部署画面。原图2560×1440。查看七个参考框;骑乘英雄不属于检测目标。

这次尤其检查了文件与对局的区别:session02开头仍延续session01的同一场洞穴战斗,不能因为换了MP4就当成独立测试。因此只把session02之后新开的草地对局作为新test。两个session以前已用于场景理解开发,只能说是B026检测与身份的新来源,不是整个项目从未见过的录屏。

第二轮分区 战场帧 活体框 已知身份crop
训练:原30张 + 新24张 54 602 601
验证:session01一个对局 12 147 147
测试:session02的新对局 12 167 167

本轮共78张。第一轮另外18张验证/测试仍留在历史记录,完全没有转入本轮训练。检测只用52张已穷尽帧的579个框;身份训练则用601个已核实战场crop,加原来的1,580个选择页训练crop,共2,181个、141类。两组新验证/测试各只有一局,连续画面反复出现同一军队,不能把几百个框当成几百次独立实验。

我们还修正了目录边界:完整战场视觉目录有148类,竞技场选择页可抽选目录有141类。例如化身可以作为召唤物出现在战场,即使不在抽选列表里,也不能被标成背景。抽选资格没有改变,只是战场识别改用完整目录。

第二轮先保存第一轮模型在新画面上的直接迁移结果,再从相同公开权重重新训练FCOS。保持原优化配置,增加训练图,并改用新的validation选择checkpoint和阈值;这不是只改变数据量的单因素实验。最佳为第6轮,第21轮早停,训练94.55秒;阈值0.5,无HUD过滤。

同一组新test,167目标 定位正确 误检 / 漏检 精确率 召回率 F1
第一轮FCOS直接迁移 119 50 / 48 70.41% 71.26% 70.83%
扩充训练后的FCOS 121 33 / 46 78.57% 72.46% 75.39%

改善主要来自误检减少,漏检只少两个。扩充模型在validation的召回率为95.24%,新test却只有72.46%,这个差距不能省略。新test AP50为80.72%、AP50:95为39.45%,仍使用前面说明的候选截断与本地AP计算口径。旧迁移运行只保存阈值之后的框,因此没有为它补造不可比较的AP。

身份只比较训练前指定的两个方案。两者都从公开ImageNet ConvNeXt-Tiny开始,训练同一最后stage与分类头;选择页均去掉底部10%。A也去掉战场crop底部10%,B则保留完整战场crop。两者训练和比较时都不解码test图片。

第二轮身份方案 参考crop验证正确数 真实预测框验证联合正确数 验证联合F1 训练耗时
A:战场底裁10% 100/147 97 63.40% 109.91秒
B:保留战场全身 97/147 96 62.75% 107.74秒

按照事先固定的联合F1规则选A,再保存选择凭据,最后只评估A的test。两个方案都选第11轮、在第17轮停止;B的test保持未评估。只有一个联合正确目标的差距,不足以断言底裁10%普遍更好,但应遵守预先规定的选择流程。

同一新test上的完整组合 框与身份均正确 联合精确率 联合召回率 联合F1
第一轮固定组合直接迁移 74/167 43.79% 44.31% 44.05%
扩充FCOS + 身份A 83/167 53.90% 49.70% 51.71%

扩充组合产生154个预测框:121个位置合格,83个身份也正确;还有46个漏检、38个位置正确但身份错误、33个没有匹配到参考目标的预测。它在精确参考crop上的Top1为99/167=59.28%,Top5为82.63%。其中11个食尸鬼目标的身份根本没出现在分类训练类别中;仅看训练已见类别是99/156=63.46%,但整体准确率仍必须保留全部167个目标。

第二轮bf093的十五个审核目标,部分生物互相遮挡,化身仍作为有效召唤部队
图7:bf093参考标注。左上数个部队互相遮挡,化身仍是活体目标。查看完整原图
第二轮bf093真实算法输出十二个候选,保留漏检及把食尸鬼认成其他单位等错误
图8:同一张图的实际模型输出,12个候选。标签全部来自分类器,未替换成参考答案;看得到漏检与身份错误。

当前结果在第二轮78帧浏览器中可逐张检查,左右键换图,勾选参考或模型图层,点框看原像素裁图。旧18张heldout仍可在第一轮48帧报告查看;两个入口合起来去重后是96张不同图片,不是126张。主标注集只回写了新批次中精确对应的21张,其余27张保留在独立实验数据中。这批逐图标注已经由助手处理,无需用户再做一遍。

最后用同一选定模型测试完整常驻路径。78张共产生971个预测crop,每帧6–17个;框与身份和离线联合输出逐项一致。Windows、RTX5080、float32,新进程框架导入1.951秒、身份加载0.315秒、检测器加载0.313秒;首图解码与推理678.76ms,导入至首结果3.259秒。

第二轮完整路径,含JPEG解码 均值 中位数 P95
首图预热三次后的第一遍78帧 104.53ms 64.81ms 365.58ms
已见过所有crop batch大小后的第二遍 61.81ms 62.66ms 72.88ms

第二遍内部均值为检测34.73ms、裁切0.18ms、身份17.74ms,常驻合计52.66ms;其余是读图等开销。第一遍仍有新batch大小的启动成本。和第一轮一样,没有清OS缓存,不含视频解码、场景分类、OCR、跟踪和显示;这里测的是截图处理链路。

8. 当前结果与下一轮重点

这次已经建立了从原图、逐图参考标注、训练、跨视频测试到结果浏览的完整实验路径。公开检测器可以提供起点,但真正的战场框和身份样本明显改变结果;选择页数据适合补充身份训练,不能替代战场数据。

对第一轮的六张验证图做了另一轮逐项复核:11 个漏检中,10 个已经有位置正确但分数偏低的候选;5 个定位误检实际都是生物,其中 3 个是重复框,2 个只是在 IoU 边界上不够准确。不能把这些裁图统统当成“背景负样本”。11 个身份错误里,10 个在人工参考框上也错,主要是相似兵种和升级分支,而非检测框导致所有认错。

第二轮的验证集也做了原像素复核:19个定位误检分为9个重复框、6个边界不准的框、4个骑乘英雄;7个漏检均存在位置合格的低分候选。重复生物框、骑乘英雄和纯背景应分别处理。把它们统统当背景训练,可能反而压低真实生物得分。

接下来应继续补不同对局、拥挤动作和近似升级形态,增加骑乘英雄等明确负例;再分别研究重复框抑制、低分真目标和身份拒识。扩充数据已经有帮助,但新test联合召回仍不到50%,不能宣称“战场生物已经识别完成”。两轮历史test保持冻结,下一次模型选择另留新来源;已查看测试中的错误可以展示,若转入训练,就不再是下一版的独立验收数据。

本轮标签、选择配置与完整结果保存在 Perception 的 B026 实验记录中;大型截图、模型和运行输出放在本地数据目录。原有 B03 通用 UI 检测文章继续保留,B026 专门追踪战场生物识别。