摘要

《英雄无敌:上古纪元》的战斗在六边形棋盘上进行,双方各有若干“部队”(同一种生物的一叠,游戏里叫兵堆)。要从一张战斗截图自动知道“场上有哪些生物、在哪里”,程序需要做两件事:定位(给每个可见的活体部队画一个框)和身份识别(说出框里是哪一种生物,用项目内部统一的生物编号表示,下称规范身份)。

本实验分两轮做了这件事,又做了一次大规模数据扩充:

  • 第一轮(48 张截图):公开的通用检测模型几乎不能用(测试 F1 只有 10–26%);只微调检测头的 FCOS 检测器把测试定位 F1 提到 84.25%。但把检测框裁下来再认兵种后,“框和身份都对”的联合 F1 只有 57.88%。
  • 第二轮(累计 96 张、在一局全新对局上测试):扩充训练后定位 F1 75.39%、联合 F1 51.71%,比旧模型直接迁移(70.83% / 44.05%)好,但离可靠还很远。
  • 数据扩充:审核数据增加到 362 张原图、约 3,870 个框,以及另一批 360 张、3,783 个框;这只是数据,没有训练新模型,也没有新的准确率结论。

结论:这条“先检测、再裁图分类”的流水线能运行,速度够快(常驻时每张约 60 毫秒),可作为可检查的起点;但身份识别和漏检都还有明显缺口。

要回答的问题

  1. 输入一张调用方已经判断为“战场”的完整截图,能否输出每个可见活体部队的框?
  2. 能否给每个框一个规范生物身份?
  3. 公开预训练模型直接用效果如何?少量游戏数据微调能提升多少?
  4. 在一局从没参与训练的新对局上,效果还剩多少?

不在范围内:判断截图是什么场景、读数字(OCR,光学字符识别)、英雄属性、六边形格子占用、跨帧追踪同一个兵堆。

数据与来源

所有截图都来自用户自己的游戏录像,只用已经缓存的原分辨率截图,不重新解码视频,也不把 640 宽的缩略图放大冒充原图。

标注规则:框住可见的生物本体,包括坐骑和装备;不包括数量条、阴影、光效、行动条小头像、场上英雄模型、尸体和短暂法术特效。被遮挡的只框可见部分并标“部分可见”。只有确认一张图里所有活体都已框到,才标为“穷尽”(exhaustive);不穷尽的图不能进入检测训练和评分,否则漏框会被当成背景。

标注来源要说清楚:标注由助手(AI)逐图看像素完成,用户授权采用,记录为“助手审核”,不是独立的人工审核基准。

第一轮数据(按录像隔离,同一段录像不跨分区;每段录像事先取 6 个时间分位点):

分区 录像 截图 活体框 已知身份 穷尽标注图
训练 5 30 318 317 28
验证 1 6 62 62 6
测试 2 12 130 130 12
合计 8 48 510 509 46

510 个框覆盖 110 种已知身份,412 个清楚、98 个部分可见;只有 1 个身份无法确定,不去猜。另外还有 1,580 个来自“选兵页”(选秀界面里生物的大立绘)的训练裁图可以辅助身份学习。

第二轮数据:新增 48 张(598 个框)。训练 = 原 30 + 新 24 张;验证 = 一局的 12 张;测试 = 另一段录像里新开的一局草地战斗的 12 张。那段录像开头其实延续了验证局的同一场洞穴战斗,这部分被排除,因为按文件名分不等于按对局分。累计 96 张、1,108 框、125 种身份。

第二轮分区 截图 穷尽图 活体框 已知身份
训练 54 52 602 601
验证(一局) 12 12 147 147
测试(新的一局) 12 12 167 167

需要注意:验证和测试各只有一局,相邻截图高度相关,框数不是独立样本数。这两段录像以前参与过场景识别的开发,只能说是本实验的新来源,不能说整个视觉模块从没见过。

方法

检测:先给出“这里有个生物”的框

  • 基线:三个公开的通用检测模型(Faster R-CNN、FCOS、RetinaNet,都在 COCO 通用照片数据集上训练过)直接读整张截图。它们输出的“人”“鸟”等通用类别只当作“这里可能有个东西”,绝不当成游戏兵种。
  • 微调 FCOS:从公开权重开始,冻结主干网络(负责提取图像特征的大部分网络),只训练一个“是不是活体部队”的单类检测头。

评分方式:预测框和真实框的重叠度 IoU(交集面积 / 并集面积)≥ 0.5 才算定位成功,一一匹配。Precision(精确率)= 输出框中对的比例,Recall(召回率)= 真实目标中被找到的比例,F1 是两者的调和平均。阈值和是否过滤界面区域都由验证集决定。

身份:把框裁下来认兵种

第一轮先在人工参考框的裁图上比较多种做法(这叫 oracle crop,即假设框完全正确,只测分类):

  • 冻结 ImageNet 预训练的 ConvNeXt-Tiny 提取特征,再用“类别原型”(每类特征平均,看离谁最近)或线性 SVM 分类;
  • 训练数据三种来源:只用选兵页、只用战场、两者合并;
  • 然后只微调 ConvNeXt-Tiny 的最后一段和分类头。

裁图都去掉底部 10%(避开数量条),缩放到 224×224。

联合评估:真正的端到端

用检测器实际输出的框去裁图再分类,运行时不提供任何参考框或名字。定位对但身份错,同时算一个误报和一个漏检。这才是用户真正看到的效果。

预先设门槛,防止反复在同一测试集上挑模型

第一轮后来又试了三个分支,事先规定验证集必须超过 47/62 才允许看测试结果;第二轮的全部选择规则在训练前写成协议冻结。

设置

  • 环境:Windows、RTX 5080、Torch 2.13、float32;检测每次一张图,身份每次一批裁图(最多 32)。
  • 第一轮微调 FCOS:28 张穷尽训练图、295 框,训练约 110 秒,验证选第 35 轮。
  • 第二轮 FCOS:同样从公开权重开始、同样设置,52 张、579 框;验证选第 6 轮,阈值 0.5,训练 94.55 秒。
  • 第二轮身份只比较两个预先指定的候选:A 选兵页和战场都裁底部 10%;B 选兵页裁 10%、战场不裁。训练裁图共 2,181 个、141 类。

结果

第一轮:检测(测试集 130 个目标)

模型 测试 P / R / F1(%) 测试 AP50 / AP50:95(%)
Faster R-CNN,公开权重 18.53 / 44.62 / 26.19 17.19 / 8.59
FCOS,公开权重 6.23 / 40.00 / 10.78 9.18 / 4.04
RetinaNet,公开权重 7.07 / 20.77 / 10.55 3.21 / 1.57
FCOS 战场微调 80.42 / 88.46 / 84.25 91.07 / 41.12

AP 是本地实现的平均精度,不等于标准 COCO 基准程序。结论很清楚:通用照片模型认不出这种游戏画面里的生物,少量游戏数据微调效果显著。

第一轮:身份(参考框裁图,验证集 62 个)

训练来源 原型 SVM C=0.1 SVM C=1 SVM C=10
只用选兵页(140 类) 8/62 20/62 20/62 22/62
只用战场(96 类) 31/62 28/62 40/62 41/62
两者合并(140 类) 13/62 39/62 43/62 44/62

只靠选兵页大立绘几乎认不出战场上的小生物;战场裁图最关键,合并最好。

身份模型(参考框裁图) 验证 Top1 测试 Top1 状态
冻结特征 + 合并数据 SVM 44/62(70.97%) 97/130(74.62%) 基线
微调 ConvNeXt-Tiny 47/62(75.81%) 89/130(68.46%) 选为运行模型
加 148 张官方全身渲染图 45/62 未评估 未过门槛
换 DINOv3 ConvNeXt-Base 特征 33/62 未评估 未过门槛
微调后的特征 + SVM 46/62 未评估 未过门槛,搜索结束

注意:微调模型在测试上反而不如基线;选择依据是验证集,而不是事后挑测试最好的。

第一轮:联合(真实检测框 + 分类,测试集 130 个目标)

身份模型 联合 P / R / F1(%) 定位成功目标中的身份正确率
冻结特征 + SVM 51.05 / 56.15 / 53.48 73/115(63.48%)
微调 Tiny 55.24 / 60.77 / 57.88 79/115(68.70%)

检测器给出 143 个框、115 个定位成功,最终 79 个框和身份都对;还有 64 个联合误报、51 个联合漏检。

第二轮:在新的一局上测试

测试集(167 个目标) 定位 P / R / F1(%) 联合 F1(%) 框和身份都对
旧模型直接迁移 70.41 / 71.26 / 70.83 44.05 74/167
扩充训练后的 FCOS + 身份 A 78.57 / 72.46 / 75.39 51.71 83/167

验证集上身份 A 联合 F1 63.40%、B 62.75%(97 vs 96 个正确),按预先规则选 A;只差一个目标,不能说裁底部普遍更好。新组合测试 AP50 80.72%。在参考裁图上,测试身份 Top1 为 99/167(59.28%),其中 11 个目标的兵种根本没出现在训练类别里,仍保留在分母中。

速度

第二轮,78 张原图,含图片解码 均值 中位数 P95
第一遍(新批大小仍有启动开销) 104.53 ms 64.81 ms 365.58 ms
第二遍(所有批大小已运行过) 61.81 ms 62.66 ms 72.88 ms

新进程从导入框架到出第一个结果约 3.26 秒。这些时间不含视频解码、场景分类、OCR、追踪和显示,不能换算成完整视频系统的帧率。常驻运行与离线评估的输出逐项一致(实现一致性检查,不是新的准确率)。

数据扩充(无新模型)

此后又用已选模型生成候选框,再由助手逐图审核:

项目 数量
原图 362 张,23 个录像标识
完整核查、可进入检测训练 321 张,3,531 框
局部不确定 31 张,340 框(不作整图监督)
不可用画面 10 张(保留原因,不当空背景)
人工修边 / 补漏 211 个修边,49 个手动补框

随后这批原有 23 段录像的 3,868 个已审框全部补齐了身份。另有新 14 段录像的 360 张原图、3,783 个框、121 个类别,加上 24 个明确负样本(尸体 9、地形 13、场外英雄 1、头像 1)。这些全部是开发数据,尚未用来训练或测量新模型。

失败与负结果

  • 公开通用检测模型直接用基本失败(测试 F1 10.55–26.19%)。
  • 三个身份新分支(加官方渲染图、换 DINOv3、微调特征 + SVM)都没过验证门槛,测试结果不计算。DINOv3 那组同时改了裁剪方式,不是纯粹的主干对比;这些负结果只适用于本轮配置。
  • 第一轮验证集错误的像素复核:11 个漏检里 10 个其实有重叠合格但分数偏低的候选;5 个“误报”里 3 个是重复框、2 个是边界偏差,里面都有真实生物,不能都当背景。11 个身份错误里 10 个在参考裁图上同样错,主要是升级前后外观相近的兵种(如基础弩手和升级弩手)。在同一批 51 个已定位目标上,参考裁图和检测裁图都对 40 个——身份损失主要不是检测框造成的。
  • 第二轮验证集 19 个误报中 9 个重复框、6 个边界错、4 个是骑在坐骑上的英雄;7 个漏检中 6 个是分数不够。
  • 一次数据合并曾漏掉一批独立保存的身份决定,那份临时导出已作废,未用于训练。

局限

  • 数据量小且高度相关:第一轮验证集只有 1 段录像,第二轮验证和测试各一局;多轮方法选择反复用同一验证集,小幅提升可能是“选择过拟合”。
  • 第一轮测试集的多种方案结果早已可见,不能再当作未查看的验收集。
  • 标注是助手审核,不是独立人工基准;两轮测试集不同,百分比不能直接比较成“提升了多少”。
  • 任务是闭集(只认已知兵种)、已知战场、可见活体;不涉及未知拒识、追踪或概率校准,分类分数也不是校准过的置信度。

结论与下一步

流水线可以运行且速度够快,可用作人工核查的起点;但在新对局上联合 F1 只有约 52%,还不能自动可靠地维护战场部队身份。下一步:补充不同对局里拥挤、动作姿态、升级分支相近的实例;把骑乘英雄作为明确的检测负例;分别处理重复框、低分真目标和身份拒识;新的模型选择必须另设与来源隔离的验证/测试集,不再在已看过的测试集上搜索。