我要提问
ARTICLE DETAIL

资讯详情

前沿编程新知与开发实战干货的深度解读。

GameAISDK number 数字识别任务结果解析:从结果数据结构到 Agent 端实战

GameAISDK number 数字识别任务结果解析:从结果数据结构到 Agent 端实战 人工智能强化学习计算机视觉游戏开发测试【免费下载链接】GameAISDK基于图像的游戏AI自动化框架项目地址https://gitcode.com/gh_mirrors/ga/GameAISDK点击查看免费下载导读在 GameAISDK 基于图像的游戏 AI 自动化框架中number数字识别任务用于在游戏画面中识别血量、分数、倒计时等数值信息是构建游戏状态感知能力的高频识别类型。本文以 NumberResult.md 为核心完整讲解 number 任务识别结果的 JSON 数据结构、Agent 端接收与解析的完整调用链并结合仓库源码AgentAPIMgr.py、AgentMsgMgr.py、GameEnv.py 等给出可直接复用的解析代码与底层原理。读完本文你将掌握number 结果每个字段的确切含义、如何通过AgentAPIMgr.GetInfo取回结果、如何按 taskID 定位任务并解析出数字值以及在哪些场景下需要处理flagFalse的未识别情况。一、number 识别任务在 GameAISDK 中的定位在 GameAISDK 中识别任务由 SDKTool 生成的任务配置文件 描述每个任务task在配置中拥有唯一整数taskID其type字段决定识别方式。可选的识别类型包括fix object固定物体检测、pixel基于像素的检测、stuck卡住检测、deform object形变物体检测、number数字检测等。从任务配置看number 类型任务使用模板匹配方法识别数字有一个值得注意的默认行为当 task 的 type 等于number时SDKTool 默认会生成 10 个模板需要开发者自行添加 0-9 的数字图片见 TaskConf.md 中 element 参数template的说明。也就是说识别数字本质上是在 ROI 区域内对 0~9 十个模板做匹配命中哪个模板就输出哪个数字值。一个识别任务task可能由多个元素Element组成每个 Element 对应一个独立的检测区域与模板集合。因此number 任务的识别结果是一个列表列表中的每一个元素对应一个 Element 的识别结果——这是理解结果数据结构的关键前提。二、number 类型识别任务的结果数据结构2.1 结果整体结构如果识别任务配置文件task 配置文件中存在类型为number的识别任务例如 taskID 为 5 的任务类型为number那么 Agent 端会收到该任务的识别结果。完整的 number 结果示例如下{ groupID: int, frameSeq: int, image: mat, deviceIndex: int, result: { # taskID: result 5: [ { # 如果当前Element没有识别数字则flag为False。否则为True. flag: bool, # num为对应的数字值 num: float, # 检测数字的区域为配置文件中的检测区域 x: int, y: int, w: int, h: int } ] } }2.2 字段逐项说明字段类型含义groupIDint组 ID标识当前任务所属的分组是 Agent 收到的 GameReg 进程图像帧结果的通用字段之一frameSeqint帧序号标识当前结果对应的图像帧imagemat图像数据OpenCV 的 mat即 numpy 数组同样是通用字段deviceIndexint设备索引标识图像来源设备通用字段resultdict识别结果字段键为整型taskID值对应该任务的识别结果列表flagbool当前 Element 是否识别到数字没有识别到数字时为False否则为Truenumfloat识别到的数字值x/y/w/hint检测到数字的区域即任务配置文件中配置的检测区域ROI关键理解点result字典的 key 是整型taskID该值与识别任务配置文件中的 taskID 完全一致上例中为 5。这是 Agent 端按任务取结果的索引依据。由于一个 task 可能有多个 Elementresult中对应某个 taskID 的 value 是一个列表列表中的每一项对应一个 Element 的识别结果每个 Element 输出一个flag/num/x/y/w/h结构。同一份 number 结果在 TaskRecognitionResults.md 中也有等价描述其中num被注释为识别到的数字ROI 即检测区域x,y,w,h 表示识别区域两者相互印证。三、结果如何从 GameReg 到达 Agent 端3.1 底层数据链路GameReg图像识别进程把识别结果发送到共享内存基于 tbus 通信Agent 进程通过平台内置的AgentAPIMgr接收结果包。这条链路在源码中有清晰的实现接收消息MsgMgr.Recv()通过tbus.RecvFrom(self.__gameRegAddr)从 GameReg 地址持续接收消息并调用_UnSerialResultMsg将 protobuf 消息反序列化为 Python 字典见 AgentMsgMgr.py。组织结果_UnSerialResultMsg逐条解析stPBResult按result.nTaskID为 key、以反序列化得到的列表为 value 组装成ResDict[value][result]字典并同时填充frameSeq、deviceIndex、groupID、image等通用字段。对外暴露AgentAPIMgr.GetInfo(msgtype)在msgtype GAME_RESULT_INFO值为 13见 AgentAPIMgr.py时调用self.__msgMgr.Recv()并返回完整结果包gameRets。在返回前还会调用_Check做一致性校验剔除不在当前任务列表中的 taskID并检查收到的groupID与本地配置的 groupID 是否匹配。3.2 结果反序列化源码验证number 结果在 AgentMsgMgr.py 中由_UnSerialNumberRegResult完成反序列化字段映射与文档给出的结构完全对应staticmethod def _UnSerialNumberRegResult(result): ResList [] for res in result.stPBResultRes: numberSingleDict {} numberSingleDict[flag] bool(res.nFlag) numberSingleDict[num] res.fNum numberSingleDict[x] res.stPBRect.nX numberSingleDict[y] res.stPBRect.nY numberSingleDict[w] res.stPBRect.nW numberSingleDict[h] res.stPBRect.nH ResList.append(numberSingleDict) return ResList可以看到flag来自nFlagbool 化、num来自fNumfloat、x/y/w/h来自stPBRect每个stPBResultRes对应一个 Element最终组成列表。这正是本文第二节所示字典在代码层面的直接来源。在 GameReg 侧number 识别器与结果对象同样有对应实现TaskContext.cpp 中case TYPE_NUMBER:分支创建 number 识别器对象TaskResult.cpp 中CreateNumberRst()通过内存池分配CNumRegResult结果对象void CTaskResult::CreateNumberRst() { if (NULL m_pRegRst) { m_pRegRst CGameRegMemPool::getInstance()-AllocPoolMemoryCNumRegResult(); } }此外Agent 侧下发 number 任务配置时由_SerialNumberReg负责序列化设置taskID、eType TYPE_NUMBER、每个 Element 的 ROI、算法、minScale/maxScale/scaleLevel 及模板列表与接收端一一对应见 AgentMsgMgr.py。四、number 类型识别任务解析示例代码下面是在 Agent 进程中解析类型为number的任务结果的完整示例源自 NumberResult.md此处修正缩进并补充注释NUMBER_TASK_ID 5 class GameXXXEnv(GameEnv): def __init__(self): GameEnv.__init__(self) self.__agentAPI None def Init(self): self.__agentAPI AgentAPIMgr.AgentAPIMgr() ret self.__agentAPI.Initialize(taskCfgFile, referCfgFile) if not ret: self.logger.error(Agent API Init Failed) return False ret self.__agentAPI.SendCmd(AgentAPIMgr.MSG_SEND_GROUP_ID, 1) if not ret: self.logger.error(send message failed) return False # 其他内容省略 return True # 获取类型为number的任务的结果 def GetNumberState(self, taskResult): state False number -1 if taskResult is None: return (state, number) for item in taskResult: # 如果当前Element没有识别数字则flag为False。否则为True. flag item[flag] if flag: number int(item[num]) state True break return (state, number) def GetGameInfo(self): while True: # 通过api接口获取当前帧的处理结果 gameInfo self.__agentAPI.GetInfo(AgentAPIMgr.GAME_RESULT_INFO) if gameInfo is None: continue # 获取所有识别任务的结果 result gameInfo[result] if result is None: continue # 获取NUMBER_TASK_ID对应的任务的结果 numberResult result.get(NUMBER_TASK_ID) # 解析NUMBER_TASK_ID对应的任务的结果 state, number self.GetNumberState(numberResult) # 根据需求做相应的处理 break def IsEpisodeStart(self): return True def IsEpisodeOver(self): return False4.1 代码分步解读初始化阶段InitAgentAPIMgr.AgentAPIMgr()创建 API 管理对象Initialize(taskCfgFile, referCfgFile)会加载任务配置文件与 refer 参考配置文件并通过MsgMgr.ProcMsg(MSG_SEND_TASK_CONF, [confFile, referFile])把配置下发给 GameReg源码见 AgentAPIMgr.py 的Initialize。SendCmd(AgentAPIMgr.MSG_SEND_GROUP_ID, 1)设置当前使用的分组 groupID 为 1该值必须与任务配置文件alltask中的某个groupID匹配_ProcSendGroupID会据此从配置中取出该分组的 task 列表并缓存见 AgentAPIMgr.py。取结果阶段GetGameInfoself.__agentAPI.GetInfo(AgentAPIMgr.GAME_RESULT_INFO)阻塞式获取当前帧处理结果gameInfo为 None 时继续循环等待。gameInfo[result]即第二节中的result字典键为各识别任务的 taskID。result.get(NUMBER_TASK_ID)只取出 taskID 为 5即配置文件中 type 为number的那个任务的结果列表。解析阶段GetNumberState遍历该任务的结果列表每个元素对应一个 Element 的识别结果。若某个 Element 的flag为True说明识别到数字number int(item[num])取出数字值、state True并跳出循环。若所有 Element 都未识别到或taskResult为 None返回(False, -1)表示当前帧没有有效的数字状态。4.2 代码中的几个约定GameXXXEnv继承自GameEnv基类GameEnv.py基类通过BusConnect建立与 MC动作控制进程的通信连接并定义了Init、Finish、GetState、IsEpisodeStart、IsEpisodeOver等抽象接口示例中的IsEpisodeStart恒为True、IsEpisodeOver恒为False属于演示性简化实际项目应按游戏逻辑实现。taskCfgFile、referCfgFile为示例中的外部输入实际项目中通常是命令行参数或全局配置指定的任务配置文件与 refer 配置文件路径。返回(state, number)二元组是常见的有效性标志 数值设计stateFalse时number-1作为占位避免把未识别的默认值误当成真实数字。五、实战注意事项与扩展建议5.1 flagFalse 的处理策略flag表示当前 Element 是否识别到数字。当画面中数字被遮挡、模糊或 ROI 区域未命中 0-9 任一模板时flag为False此时num字段没有有效语义。建议在解析时显式跳过flagFalse的项如示例代码中的if flag:判断为整帧未识别定义统一返回值如(False, -1)避免在策略层把无效数据当作真实状态。5.2 多 Element 与多任务并存一个 number task 若配置了多个 Element例如同时识别多个区域的数值结果列表会有多个flag/num/x/y/w/h项。示例的GetNumberState只取第一个flagTrue的项如果需要全部区域的数值应收集所有flagTrue的项。任务配置文件中若同时存在多个 type 的任务如fix object与numberresult字典会包含多个 taskID 键。取结果时务必使用与配置文件一致的 taskID可参考 AgentMsgMgr.py 中_Check的校验逻辑返回结果中不在taskList里的 taskID 会被剔除并打印 warning从侧面印证 taskID 必须与配置严格一致。5.3 真实任务配置参考仓库 tools/SDKTool/project/TTKP/cfg/task/gameReg/Task.json 提供了真实的任务配置文件样例其中 taskID 1、2 为fix object类型。从中可以看到 task 层的关键结构taskID、taskName、type、elements以及 element 层的ROI、algorithm、minScale/maxScale/scaleLevel、templates含path、location、threshold、classID。number 类型任务的配置文件结构与之相同只是type为number且 templates 为 0-9 十个数字模板。参照该文件可以快速搭建自己的 number 识别任务并调试结果解析代码。5.4 调试建议在GetInfo返回后先打印gameInfo.keys()与result.keys()确认groupID/frameSeq/image/deviceIndex通用字段与 taskID 键是否如预期。若result.get(NUMBER_TASK_ID)恒为 None优先检查任务配置文件中的 taskID 是否真的是 5、groupID 设置是否与配置一致以及 Agent 初始化时传入的配置文件路径是否正确。若flag频繁为 False通常是数字模板匹配阈值threshold默认 0.8越大越难匹配过高或 ROI 区域不准确可在 SDKTool 的任务调试功能Debug GameReg Start中观察实时识别效果相关配置说明见 TaskConf.md。六、小结本文围绕 NumberResult.md 完整梳理了 GameAISDK 中 number 数字识别任务的结果解析全流程结构result字典以 taskID 为键、Element 结果列表为值每个 Element 输出flag/num/x/y/w/h链路GameReg 序列化结果 → tbus 共享内存 →MsgMgr.Recv反序列化_UnSerialNumberRegResult→AgentAPIMgr.GetInfo(GAME_RESULT_INFO)对外返回解析按 taskID 定位任务、按flag判断有效性、取num作为数字值配套任务配置侧 number 类型默认生成 0-9 十个模板taskID 需与配置文件严格一致。将上述解析函数接入GameEnv派生类的状态获取流程后即可把画面上的数字转化为可供 AI 策略使用的数值状态用于血量判断、计分、倒计时等游戏内数值类状态感知场景。赞分享人工智能强化学习计算机视觉游戏开发测试【免费下载链接】GameAISDK基于图像的游戏AI自动化框架项目地址https://gitcode.com/gh_mirrors/ga/GameAISDK点击查看免费下载相关推荐BuildKit 中的 packageurl-goPackage URLpurl规范的 Go 实现与实战指南BuildKit 中的 packageurl goPackage URLpurl规范的 Go 实现与实战指南 引言 本文围绕 buildkit 仓库中 v人工智能强化学习计算机视觉游戏开发测试GameAISDK 图像识别任务结果解析Task 结果结构与 12 类算法返回格式全解GameAISDK 图像识别任务结果解析Task 结果结构与 12 类算法返回格式全解 导读 本文是 GameAISDK基于图像的游戏 AI 自动化框架二人工智能强化学习计算机视觉游戏开发测试Trae Agent数据持久化全指南从任务状态到结果保存的实战策略Trae Agent数据持久化全指南从任务状态到结果保存的实战策略 你是否遇到过Agent执行中断后任务进度丢失想复盘自动化操作却没有完整记录Trae A人工智能大模型AI AgentAgent 框架代码智能体CLI工具调用上一篇KeystoneJSClassic v4入门实战基于 Express 与 Mongoose 的 Node.js CMS 与 Web 应用框架下一篇WSABuilds系统镜像定制修改system.img添加预装应用创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表