找回密码
立即注册
搜索
热搜: Java Python Linux Go
发回帖 发新帖

554

积分

0

好友

70

主题
发表于 4 天前 | 查看: 16| 回复: 0

要想对游戏图像中的NPC(非玩家角色)进行自动化识别,一种常见的思路是预先训练一个图像识别模型。简单来说,首先需要收集目标角色的图像样本,训练模型学习其特征。样本越丰富、特征越明显,最终模型识别的成功率也就越高。

模型训练完成后,就可以将其作为“标尺”,对新的游戏画面进行分析和识别。本文将基于 PyMe 可视化开发工具(1.5.6.1版本),手把手带大家实现一个游戏小怪物的识别程序。

第一步:准备素材与图像训练

我们首先在PyMe中创建一个名为 NPCRecognition 的空工程。识别目标设定为三种风格迥异的小怪物,它们的原始图标素材如下图所示:

游戏怪物原始图标素材

我们需要将要识别的图片按类别整理。在工程的 Resources 资源文件夹下,为每种怪物分别创建一个文件夹,并放入对应的图片。

按怪物类别整理的资源文件夹

数据增强

为了提升模型的鲁棒性,避免过拟合,我们需要对原始图片进行数据增强。在资源管理器中,右键单击每个怪物文件夹,选择 训练图片识别模型 -> 图片文件数据增强

右键菜单进行数据增强操作

数据增强后,系统会自动为每个文件夹生成大量经过旋转、缩放、亮度调整等处理的变体图片,极大地扩充了训练数据集。

monster1文件夹增强后部分文件列表:
monster1文件夹数据增强结果

monster2文件夹增强后部分文件列表:
monster2文件夹数据增强结果

monster3文件夹增强后部分文件列表:
monster3文件夹数据增强结果

开始模型训练

拥有充足的训练图片后,就可以开始训练模型了。再次右键单击文件夹,选择 训练图片识别模型 -> 开始进行模型训练

右键菜单开始模型训练

训练过程依赖于 TensorFlow 和 Keras 等机器学习框架。如果你的电脑尚未安装,程序会自动弹出提示,点击“安装”即可。

训练所需模块安装提示

训练完成后,对应的文件夹图标会变为紫色,表示这是一个已包含训练模型的文件夹。

训练完成后文件夹状态变化

PyMe 目前使用 Keras 框架进行训练。训练完成后,每个文件夹内会生成两个关键文件:一个模型文件(如 monster2_model.keras)和一个记录图像平均尺寸的文件(如 monster2_avg_size.txt),这些将作为后续识别的依据。

训练生成的Keras模型文件与信息文件

至此,模型训练部分已完成。接下来,我们将设计一个简单的图形界面来使用这些模型。

第二步:设计识别程序界面

我们的目标是创建一个可以打开图片、显示图片并能展示识别结果的界面。

  1. 将主窗口 Form_1 的布局方式设置为“自动适应”。
  2. Form_1 上放置一个 Frame 控件,同样设为“自动适应”,停靠在上方,横向填充,高度设为100。
  3. 在这个 Frame 中,依次放入一个标签(Label)、一个文本框(Entry)和两个按钮(Button)。Button_2 作为“打开图片”按钮,Button_1 作为“进行识别”按钮。
  4. 在下方放置一个画布(Canvas)控件,布局方式设为“自动适应”,停靠在下方,向四周填充以占据剩余空间。
  5. 最后,从左侧组件栏的“组件”页中,拖动一个 ObjectRecognizer 组件到 Form_1 上。最终界面布局如下图所示:

游戏角色识别程序界面设计

界面搭建好后,我们需要为按钮添加逻辑,让程序“活”起来。

第三步:编写程序逻辑代码

3.1 “打开图片”按钮功能

双击“打开图片”按钮(Button_2),PyMe会自动生成其点击事件的函数框架。在函数体内右键,选择 系统函数 -> 调用打开文件框

通过右键菜单快速插入打开文件函数

生成代码后,我们需要调整文件类型为图片,并添加将图片路径显示在文本框、同时加载到画布的逻辑:

openPath = Fun.OpenFile(title="打开图片文件",filetypes=[('PNG File','*.png'),('JPG File','*.jpg')],initDir = os.path.abspath('.'),multi=False)
if openPath:
    Fun.SetText(uiName,'Entry_1',textValue=openPath)
    Fun.SetCanvasBGImage(uiName,'Canvas_1',imageSource=openPath,wrapType='zoom')

3.2 加载预训练模型

我们希望程序一启动就加载好训练好的模型。在 Form_1onLoad 事件函数中,右键选择 界面函数 -> ObjectRecognizer_1 -> 加载训练好的模型

在窗体加载事件中插入模型加载代码

生成一行代码后,我们复制两份,分别加载三个怪物的模型:

def Form_1_onLoad(uiName,threadings=0):
    ObjectRecognizer_1=Fun.GetElement(uiName,'ObjectRecognizer_1')
    ObjectRecognizer_1.LoadModel(model_path='monster1')
    ObjectRecognizer_1.LoadModel(model_path='monster2')
    ObjectRecognizer_1.LoadModel(model_path='monster3')

3.3 “进行识别”按钮功能

为“进行识别”按钮(Button_1)绑定点击事件函数。在该函数中,首先需要获取画布与原始图片之间的缩放比例,这是为了准确定位。通过右键菜单选择 ObjectRecognizer_1 -> 取得画布向图像匹配缩放值 来生成相关代码。

插入获取画布与图像缩放比例的代码

接着,调用识别函数对画布内容进行识别。由于识别目标在画布上,我们需要使用 RecognizeCanvas 方法,并传入刚才计算出的缩放比例。最后,将识别结果绘制在画布上。完整的识别按钮逻辑如下:

#Button 'Button_1' 's Command Event :
def Button_1_onCommand(uiName,widgetName,threadings=0):
    image_path = Fun.GetText(uiName,'Entry_1')
    ObjectRecognizer_1=Fun.GetElement(uiName,'ObjectRecognizer_1')
    canvas_scalex,canvas_scaley=ObjectRecognizer_1.GetCanvas2ImageScaleXY(uiName = uiName,widgetName='Canvas_1',image_path=image_path)
    Filter_list=ObjectRecognizer_1.RecognizeCanvas(uiName = uiName,widgetName='Canvas_1',canvas_scalex = canvas_scalex,canvas_scaley = canvas_scaley, show_result=False, save_result=False, result_path=None, conf_threshold=0.05, use_template_matching=True, area_ratio_threshold=0.3, fast_mode=False)
    ObjectRecognizer_1.DrawResultToCanvas(uiName = uiName,widgetName='Canvas_1', filter_list=Filter_list,canvas_scalex = 1.0,canvas_scaley = 1.0,save_image_path='')

如果需要将识别结果另存为图片文件,只需为 DrawResultToCanvas 函数的 save_image_path 参数指定一个文件名即可。

第四步:运行测试与参数优化

4.1 初步测试

基本功能完成后,我们找一张经典横版游戏(如超级马里奥)的截图进行测试。

用于识别的经典横版游戏场景截图

运行程序,点击“打开图片”加载游戏截图,再点击“进行识别”。

首次识别结果,部分怪物被成功框出

可以看到,程序已经成功识别出了部分怪物(如图中的乌龟),并用方框标记了出来。但也有一些怪物没有被识别到,这说明模型的识别准确率还有优化空间。

4.2 自动优化识别参数

识别准确率受置信度阈值、目标面积比等多个参数影响。我们可以利用 ObjectRecognizer 组件提供的自动优化功能。在“打开图片”按钮的函数中,加载图片后,添加针对每个模型的参数优化代码。

在代码中插入自动优化识别参数函数

优化函数会根据你指定的目标数量(target_count)自动调整参数。在本例中,我们假设图中每种怪物各有两个:

BestParams=ObjectRecognizer_1.OptimizeRecognition(image_path=openPath,image_scalex = 1.0,image_scaley = 1.0, model_index = 0, target_count = 2, save_to_model = True)
BestParams=ObjectRecognizer_1.OptimizeRecognition(image_path=openPath,image_scalex = 1.0,image_scaley = 1.0, model_index = 1, target_count = 2, save_to_model = True)
BestParams=ObjectRecognizer_1.OptimizeRecognition(image_path=openPath,image_scalex = 1.0,image_scaley = 1.0, model_index = 2, target_count = 2, save_to_model = True)

4.3 优化后再次测试

运行程序,打开图片后,组件会自动进行参数优化并保存。优化完成后,再次点击“进行识别”。

参数优化后再次识别,识别出的怪物数量增加

对比之前的识别结果,现在所有的乌龟怪物都被成功识别出来了。当然,图中其他类型的怪物(如食人花)可能因为训练样本特征不足仍未识别,这提示我们后续可以通过补充该类怪物的训练素材来进一步提升模型能力。

总结

通过本教程,我们完成了一个完整的 Python 计算机视觉 小项目:从收集素材、数据增强、训练Keras模型,到使用PyMe设计界面并编写识别逻辑,最终实现了对游戏画面中特定角色的自动识别。整个过程涵盖了机器学习应用的基本流程,展示了如何将理论转化为可视化的实战工具。

你可以在此基础上,尝试识别更复杂的游戏场景或现实中的物体,通过调整模型结构、增加训练数据、精细调节参数来挑战更高的识别精度。欢迎在 云栈社区 分享你的实践经验和遇到的问题,与更多开发者交流探讨。




上一篇:AI辅助工具实战:Cursor+Claude/Gemini与MCP总结
下一篇:12306系统技术升级:误购车票限时免费退票功能深度解读
您需要登录后才可以回帖 登录 | 立即注册

手机版|小黑屋|网站地图|云栈社区 ( 苏ICP备2022046150号-2 )

GMT+8, 2026-1-24 00:28 , Processed in 0.244662 second(s), 43 queries , Gzip On.

Powered by Discuz! X3.5

© 2025-2026 云栈社区.

快速回复 返回顶部 返回列表