如何使用 OpenCV 在 COD 中搜索玩家模型

Posted

技术标签:

【中文标题】如何使用 OpenCV 在 COD 中搜索玩家模型【英文标题】:How to go about searching for a player models in COD with OpenCV 【发布时间】:2011-06-12 16:09:32 【问题描述】:

我正在尝试创建一个程序,可以在使命召唤游戏的视频中找到人物。我已经从该视频中编译了大约 2200 张单独图像的列表,这些图像要么包含人物,要么不包含人物。然后我尝试训练一个神经网络来分辨两组图像之间的差异。

然后,我将每个视频帧分成几百个网格矩形,并用我的 ANN 检查每个。矩形重叠以尝试捕获网格矩形之间的图形,但这似乎效果不佳。所以我有几个问题:

    神经网络是要走的路吗?我了解到它们与其他机器学习算法相比速度非常快,最终我计划将其用于实时视频,速度非常重要。

    搜索图像帧中的数字以在 ANN 上测试的最佳方法是什么?我觉得我做的方式不是很好。它绝对不是很快或准确的。对于 960 x 540 的图像,每帧大约需要 1 秒,并且精度较差。

    我遇到的另一个问题是构建特征向量以用作 ANN 的输入的最佳方法。目前,我只是将所有输入图像缩小到 25 x 50 像素,并创建一个包含每个像素强度的特征向量。这是一个非常大的向量(1250 个浮点数)。构建特征向量的更好方法是什么?

关于我在这里所做的更详细的解释:CodAI: Computer Vision

编辑:我想要更多细节。计算特征的最佳方法是什么。我需要能够识别许多不同位置的人物。我是否需要创建单独的分类器来识别直立、蹲伏和俯卧之间的区别?

【问题讨论】:

我觉得这个问题对于这个论坛来说太具体了。 一个问题怎么可能太具体了?我想了解如何跟踪人体数据? 我有一种淡淡的印象,贵公司的 Kinetic 人员以做这种事情为生。请告诉我们一切进展如何。 是的,他们的东西会有点不同。一,他们没有移动的相机位置。二,他们有两个摄像头。第三,他们看的是真人,而不是渲染的人物角色。 好的,请将您的问题标题从人物改为COD4播放器模型,因为这样更准确。 【参考方案1】:

这个问题对于普通的 ANN 来说太难了。

ANN 不太适合具有大量空间变换的图像(即不同位置的人物)。他们实际上需要独立学习每个可能的位置,因为他们不能很好地概括平移、旋转和缩放等。即使你设法让它工作,你可能需要数十亿的训练图像和多年的训练时间。

您最好的选择可能是选择以下任何一种:

Haar feature detection(已成功用于人脸检测) 一个convolutional neural network(在手写识别等方面相当成功)

【讨论】:

如何使用 OpenCV 构建和训练 Haar? @gamernb OpenCV 附带一个名为 opencv_haartraining 的工具,您可以使用它。但请注意,培训可能需要很长时间 - 我的意思是几天,而不是几小时。 据说增强的类似 Haar 的功能适用于始终以大致相同方向面对相机的刚性物体。我不确定这是否适用于您的情况,我想这取决于人物的姿势。我认为最好先从能给你更快反馈的东西开始,这样你就可以轻松地探索想法。 @carnieri 那么在任何运动姿势(即站在我,离我远点,跑到中间……?【参考方案2】:

更好的功能胜过更好的学习算法。特征选择的基本原则是最好的特征最大化类间方差和最小化类内方差。在您的情况下,这些特征应该强调包含人物的图像和不包含人物的图像之间的差异,并不强调同一类图像之间的差异。

例如,您可以尝试找出人物的轮廓,并根据轮廓计算特征。 OpenCV已经有一些计算轮廓特征的函数:Moments、GetCentralMoment、NormalizedCentralMoment等。那么问题来了:如何从背景中分割人物,以便找到他们的轮廓?有几种方法可以解决这个问题,例如使用纹理分割。

一旦你可以解决分割问题并计算出合理的特征,学习算法的选择就不是那么重要了。但是为什么不尝试几个,看看什么效果最好呢?查看 OpenCV 文档中的 Machine Learning 部分。

【讨论】:

【参考方案3】:

我不清楚您要完成什么,但您似乎正在尝试使用错误的方法进行实时玩家跟踪(或类似的东西)。 人体跟踪是人们期望通过对真人图片进行数字图像/视频处理来完成的事情。

根据您的目的,玩家跟踪不应该通过图像处理来完成,因为它对 CPU 的要求非常高。在游戏中跟踪玩家模型是一种通常用于作弊应用程序的做法,它需要在游戏进程中注入代码,或者是游戏引擎和图形驱动程序之间的中间人。由于游戏客户端始终知道其他玩家在哪里(即使您看不到他们),因此可以在进程内存中搜索玩家的 X、Y、Z 坐标,或者拦截图形渲染调用以搜索玩家所在的位置模型将在屏幕上呈现(这可能有点棘手,因为它需要对 OpenGL/DirectX 和调试技能有基本的了解)。

我不确定是否可以在 *** 上详细介绍此类技术,但我要说的是,该主题已在多个 逆向工程师/作弊论坛(如GameDeception)上进行了广泛讨论。 p>

【讨论】:

我使用图像处理的全部原因是它不会被视为作弊。我的目标是创建一个可以像人类一样玩游戏的 AI。查看屏幕并控制控制器。 @gamernb 即使你制造了一个机器人坐在你的椅子上为你玩,它仍然会被视为作弊。无论你做什么来自动化玩家应该手动完成的任务,这都是作弊!基于屏幕截图处理的 AI 决策在(动态)FPS 游戏中效率不高,即使您使用 GPU 为您进行图像处理(假设您成功实现了全能算法-所有人-earth-would-like-to-know)。 @gamernb 过去,我已经实现了一些应用程序,它们可以根据屏幕截图处理自动执行游戏任务。一些反作弊系统尽其所能阻止您通过阻止某些 Win32 API 调用来自动截取游戏截图。无论如何,这本书讨论了我指出的几个问题,包括关于什么是游戏作弊的精彩讨论:amazon.com/Exploiting-Online-Games-Massively-Distributed/dp/… 我打算在 Xbox 上使用它,而不是 PC。我将从 xbox 获取 hdmi 输出并将输入输入计算机。因此,这将消除实际游戏中的 CPU 消耗。这一切只是一个练习,看看它是否可能。我不打算利用它。它只是一个让我有事可做的项目。 @gamernb 好的,希望你喜欢。但是您当前的解决方案不会很实用。【参考方案4】: 使用原始强度作为特征向量是行不通的1。光照等引起的变化太大。 首先要考虑的一个很好的特性是 HOG。 opencv 2.2 有一个 GPU (cuda) 版本的检测器,速度很快。 神经网络可能不是最好的方法。通常你会使用 SVM 或 boosting 作为分类器2。并不是神经网络不够强大,而是很难让训练/参数正确。您经常陷入局部最小值等问题。 对于俯卧/蹲伏/站立的人物,您肯定需要不同的分类器并在混合模型中使用它们。 您要求“最佳方法” - 到目前为止,人类检测还没有解决问题,因此没有人知道最佳方法。众所周知,上面提到的东西效果很好。 如果您想要一个好的结果,您肯定想要利用您的目标是特定的 - 因此,利用您正在尝试检测执行任务的人类。您需要检查的位置范围不是整个图像,数字将靠近地面。这使您可以加快搜索速度并减少错误检测。如果可以的话,减少渲染的细节 - 更少的细节意味着更少的变化,这意味着更容易学习问题。

脚注:1 对于挑剔者:没有高度复杂的分类器。2 您还可以使用级联的增强分类器来提高速度,而无需在检测率上放弃了太多。

【讨论】:

如何使用/训练 HOG?我在 OpenCV 文档网站上找不到任何文档。

以上是关于如何使用 OpenCV 在 COD 中搜索玩家模型的主要内容,如果未能解决你的问题,请参考以下文章

如何将 keras 模型文件加载到 OpenCV 代码中?

旋转玩家模型以指向一个点

如何让 Roblox 脚本搜索玩家的背包

人脸检测实战:使用opencv加载深度学习模型实现人脸检测

使用VP树和OpenCV构建一个图像哈希搜索引擎

如何减小 opencv 中学习模型的大小(用于 CvBoost)?